WordPress - Настройка категории по умолчанию для пользовательского типа записи (термин таксономии) с использованием параметров - PullRequest
0 голосов
/ 12 марта 2020

У меня несколько пользовательских типов записей, и я хотел бы установить категорию по умолчанию, которая может быть установлена ​​из одной функции через параметры. Первоначально я делал это для одного пользовательского типа записи и был жестко закодирован, но я решил сделать это, поэтому нам нужно выводить функцию только с параметрами на тот случай, если мы когда-нибудь решим добавить больше пользовательских типов записей.

Проблема в том, что внутри функции WordPress, похоже, не связывает свои собственные ловушки и функции и возвращает недопустимые ошибки таксономии при попытке установить ее через функцию wp_set_object_terms (). Когда я сделал это способом WordPress, который заставил бы вас создать отдельную функцию для каждого типа поста и термина по умолчанию, который вы хотите, который я поставил ниже.

function set_default_object_terms( $post_id, $post ) {
        if ( 'publish' === $post->post_status && $post->post_type === 'comic' ) {
            $defaults = array(
                'story' => array( 'draft' )https://silentcomics.com
                );
            $taxonomies = get_object_taxonomies( $post->post_type );
            foreach ( (array) $taxonomies as $taxonomy ) {
                $terms = wp_get_post_terms( $post_id, $taxonomy );
                if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
                    wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
                }
            }
        }
    }
    add_action( 'save_post', 'set_default_object_terms', 0, 2 );

То, что я пытаюсь достичь, это что-то вроде ниже но ни одна из глобальных переменных WordPress не работает или любая функция wordpress, такая как get_object_taxonomies () или wp_set_object_terms (), которые используются в примере, который дает WordPress.

Ниже приведена упрощенная версия того, чего я пытаюсь достичь, и параметры, которые я пытаюсь передать, это cpt slug, slug таксономии и id категории, к которой я хочу вернуться. Я также пробовал это с переменной $ cat_id в качестве массива.

function set_default_term( $cpt_slug, $taxonomy_slug, $term_id ) {
    if ( isset( $_GET['post'] ) ) {
        $post_id   = intval( $_GET['post'] );
        $post_type = get_post_type( $post_id );
        $status    = get_post_status( $post_id );
        $cat_id    = array( $term_id );
        $cat_id    = array_map( 'intval', $cat_id );
        $cat_id    = array_unique( $cat_id );
        if ( $status === 'publish' && $post_type === $cpt_slug ) {
            wp_set_object_terms( $post_id, $cat_id, $taxonomy_slug, true );
        }
    }
}

add_action( 'save_post', 'set_default_term', 20, 3 );

set_default_term('deployment-guides', 'deployment-guide-category', 98);

1 Ответ

1 голос
/ 16 марта 2020

Привет, Брэд, я проверил твой код, только что заменил тип записи на post и таксономию на post_tag просто для проверки общего принципа, и он работает хорошо. Ниже приведен небольшой измененный код, который я использовал для проверки.

function my_custom_set_default_terms_for_posts( $post_ID, $post ) {

    if ( 'publish' === $post->post_status && 'post' === $post->post_type ) {
        $defaults   = array(
            'post_tag' => array( 'example-default-tag-slug' ),
        );
        $taxonomies = get_object_taxonomies( $post->post_type );
        foreach ( (array) $taxonomies as $taxonomy ) {
            $terms = wp_get_post_terms( $post_ID, $taxonomy );
            if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {

                $terms_to_attach = $defaults[ $taxonomy ];

                if ( count( $terms_to_attach ) ) {
                    wp_set_object_terms( $post_ID, $terms_to_attach, $taxonomy );
                }
            }
        }
    }
}

add_action( 'save_post', 'my_custom_set_default_terms_for_posts', 0, 2 );

И больше думать о реальной проблеме returning invalid taxonomy errors when trying to set it via the wp_set_object_terms() это может произойти не из-за того, что ваш обработчик save_post делает что-то не так - это хорошее право code.

Вам необходимо проверить, как инициализировать таксономию и пользовательский тип записи (CPT), в идеале вы должны сделать это на крюке init, чтобы ваша CPT и пользовательские таксономии были инициализированы до этой ловушки save_post или другой выполняется код, который основан на существовании таксономий \ cpt.

Также, когда вы инициализируете CPT и привязываете к нему таксономию, вам нужно сначала инициализировать CPT с помощью register_post_type(), а затем инициализировать таксономию, связанную с ним с помощью register_taxonomy() , как обычно, когда вы регистрируете таксономию, она ожидает использование массива типов записей, и их необходимо зарегистрировать до регистрации таксономии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...