Вставка термина в пользовательскую таксономию


Создал эту пользовательскую таксономию, которая будет управлять макетом отдельных сообщений, в основном я хочу добавить два варианта, Макет 1 и макет 2.

// Register Custom Taxonomy
function custom_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Layout', 'Taxonomy General Name', 'text_domain' ),
        'singular_name'              => _x( 'Layout', 'Taxonomy Singular Name', 'text_domain' ),
        'menu_name'                  => __( 'Taxonomy', 'text_domain' ),
        'all_items'                  => __( 'All Items', 'text_domain' ),
        'parent_item'                => __( 'Parent Item', 'text_domain' ),
        'parent_item_colon'          => __( 'Parent Item:', 'text_domain' ),
        'new_item_name'              => __( 'New Item Name', 'text_domain' ),
        'add_new_item'               => __( 'Add New Item', 'text_domain' ),
        'edit_item'                  => __( 'Edit Item', 'text_domain' ),
        'update_item'                => __( 'Update Item', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separate items with commas', 'text_domain' ),
        'search_items'               => __( 'Search Items', 'text_domain' ),
        'add_or_remove_items'        => __( 'Add or remove items', 'text_domain' ),
        'choose_from_most_used'      => __( 'Choose from the most used items', 'text_domain' ),
        'not_found'                  => __( 'Not Found', 'text_domain' ),
    );
    $capabilities = array(
        'manage_terms' => 'foobar',
        'edit_terms'   => 'foobar',
        'delete_terms' => 'foobar',
        'assign_terms' => 'foobar' 
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => false,
        'show_in_nav_menus'          => false,
        'show_tagcloud'              => false,
        'capabilities'               => $capabilities,
    );
    register_taxonomy( 'Layout', array( 'post' ), $args );

}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

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

Добавить два термина в мою пользовательскую таксономию не может быть так сложно, верно?

Использование этого для вставки термина не работает, хотя, если я изменил свое пользовательское имя таксономии на "категория", т.Е. WP по умолчанию, это работает просто отлично. Что дает?

function example_insert_category() {
    $parent_term = term_exists( 'layout' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
    wp_insert_term(
        'Example Category',
        'layout',
        array(
          'description' => 'This is an example category created with wp_insert_term.',
          'slug'        => 'example-category'
        )
    );
}
add_action( 'after_setup_theme', 'example_insert_category' );
Author: andy, 2014-10-06

1 answers

РЕДАКТИРОВАТЬ 2

Как и было обещано, вот код плагина.

Известно, что пользовательские таксономии и пользовательские типы сообщений должны входить в плагин, а не в вашей теме. Я удалил части из своего плагина.

КАК ЭТО РАБОТАЕТ

Таксономия регистрируется как обычно через плагин. Для получения любой информации об этом вы можете пойти и проверить register_taxonomy. Та часть, которую мне нужно было выделить, и то, что имеет отношение к этот вопрос заключается в том, как вставить новые термины.

Вставлять термины через wp_insert_terms быстро и легко, но этот код также может сократить время загрузки, если его неправильно использовать. Идея состоит в том, чтобы запустить эту функцию один раз, а затем никогда больше, почти так же, как удалить ее после первого запуска.

Чтобы выполнить это, вы собираетесь подключить свою функцию к register_activation_hook. Этот хук запускается один раз, то есть, когда плагин активирован, он не будет повторно запускаться при обновлении страницы. Единственный раз, когда он снова выстрелит, - это когда плагин деактивирован и активирован снова

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

Вы также хотите сначала проверить, существует ли термин, прежде чем пытаться создать и вставить это.

Вот код плагина

<?php
/**
Plugin Name: Create terms
Plugin URI: http://wordpress.stackexchange.com/q/163541/31545
Description: Create terms
Version: 1.0
Author: Pieter Goosen
License: GPLv2 or later
*/
class Test_Terms {

    function __construct() {
        register_activation_hook( __FILE__,array( $this,'activate' ) );
        add_action( 'init', array( $this, 'create_cpts_and_taxonomies' ) );
    } 

    function activate() {
        $this->create_cpts_and_taxonomies();
        $this->register_new_terms();
    }

    function create_cpts_and_taxonomies() {

        $args = array( 
            'hierarchical'                      => true,  
            'labels' => array(
                'name'                          => _x('Test Tax', 'taxonomy general name' ),
                'singular_name'                 => _x('Test Tax', 'taxonomy singular name'),
                'search_items'                  => __('Search Test Tax'),
                'popular_items'                 => __('Popular Test Tax'),
                'all_items'                     => __('All Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'update_item'                   => __('Update Test Tax'),
                'add_new_item'                  => __('Add New Test Tax'),
                'new_item_name'                 => __('New Test Tax Name'),
                'separate_items_with_commas'    => __('Seperate Test Tax with Commas'),
                'add_or_remove_items'           => __('Add or Remove Test Tax'),
                'choose_from_most_used'         => __('Choose from Most Used Test Tax')
            ),  
            'query_var'                         => true,  
            'rewrite'                           => array('slug' =>'test-tax')        
        );
        register_taxonomy( 'test_tax', array( 'post' ), $args );
    }

    function register_new_terms() {
        $this->taxonomy = 'test_tax';
        $this->terms = array (
            '0' => array (
                'name'          => 'Tester 1',
                'slug'          => 'tester-1',
                'description'   => 'This is a test term one',
            ),
            '1' => array (
                'name'          => 'Tester 2',
                'slug'          => 'tester-2',
                'description'   => 'This is a test term two',
            ),
        );  

        foreach ( $this->terms as $term_key=>$term) {
                wp_insert_term(
                    $term['name'],
                    $this->taxonomy, 
                    array(
                        'description'   => $term['description'],
                        'slug'          => $term['slug'],
                    )
                );
            unset( $term ); 
        }

    }
}
$Test_Terms = new Test_Terms();

РЕДАКТИРОВАТЬ 1

Ваша проблема с вставкой терминов - это ваш крючок. after_setup_theme бежит раньше init, это означает, что вы пытаетесь вставить термин в таксономию, которая еще не зарегистрирована.

Я бы посоветовал вам переместить свой wp_insert_term функция внутри вашей функции инициализации, чуть ниже register_taxonomy

Также рекомендуется сначала проверить, существует ли термин (term_exists) до того, как вставка его

Пример:

// Register Custom Taxonomy
function custom_taxonomy() {

   //CODE TO REGISTER TAXONOMY

   if( !term_exists( 'Example Category', 'layout' ) ) {
       wp_insert_term(
           'Example Category',
           'layout',
           array(
             'description' => 'This is an example category created with wp_insert_term.',
             'slug'        => 'example-category'
           )
       );
   }
}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

Пожалуйста, обратите внимание, что это непроверенный

ОРИГИНАЛЬНЫЙ ОТВЕТ

Пользовательские имена таксономий (и пользовательские имена типов записей) должны соответствовать очень определенному набору правил, в противном случае вы столкнетесь с ловушками, которые невозможно обойти.

Вот руководство при выборе имен для пользовательских таксономий (и пользовательских типов записей)

  1. Следующие не допускаются в пользовательские имена таксономий и пользовательские имена типов записей

    • Заглавные буквы или верблюжий футляр

    • Любой тип специальных символов, кроме подчеркиваний (_)

    • Пространства

    • Более 32 символов для таксономий и 20 для типов записей

    • Любые зарезервированные имена, и, пожалуйста, обратите внимание, что это относится к любому пользовательскому соглашению об именах, а не только к именам таксономий.

  2. Если в названии таксономии более одного слова, они должны быть разделены подчеркиванием, а не дефисом (-). Мне бросили вызов, что дефисы - это путь для SEO в URL-адресах для названий таксономий. Это правда, именно поэтому существуют правила перезаписи для соответствующей настройки вашего URL-адреса. Никогда не меняйте имена таксономий или имена типов записей в целях оптимизации URL-адресов

Кроме того, вы должны удалить эти странные возможности. Это также может создать проблему

Если это не решит вашу проблему, пожалуйста, добавьте код, который вы используете с wp_insert_term

Ссылка:

 12
Author: Pieter Goosen, 2014-10-07 16:02:27