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

9

Сделал эту пользовательскую таксономию, которая будет управлять макетом на отдельных сообщениях, в основном я хочу добавить две опции, Layout 1 и Layout 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' );
Энди
источник
Как и обещал, я разместил код для плагина. Надеюсь, это поможет :-)
Питер Гусен

Ответы:

11

РЕДАКТИРОВАТЬ 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. Никогда не меняйте названия таксономии или названия типов записей для целей SEO.

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

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

Ссылка:

Питер Гусен
источник
После просмотра источника я немного озадачен, потому что $taxonomyпараметр не очищается вообще, если для query_varаргумента установлено значение true. Это на самом деле невероятно. Иначе это очищается через sanitize_title_with_dashes(), который, номенклатурно, заменяет вещи с черточками повсюду. Что тоже невероятно, так как их не следует использовать.
Николай
Помимо этого, вы можете использовать числа по своему усмотрению, где угодно и в начале, хотя вы можете прочитать везде, что этого делать не следует. Не могу найти определенную причину против чисел, хотя. В отличие от тире, где, по крайней мере, есть выражение »Кроме того, если тип записи содержит тире, вы не сможете добавлять столбцы на страницу администратора пользовательского типа записи (используя действие manage_ <Имя настраиваемого типа сообщения> _posts_columns ') . «На странице кодекса register_post_type().
Николай
1
Wordpress имеет свои недостатки, должен согласиться. Некоторые из них являются настоящими преступлениями :-). Я думаю, что тире - одна из самых обсуждаемых тем, а также наиболее часто используемая в именах. Его провал становится очевидным, когда вы начинаете смотреть на иерархию шаблонов. Создайте таксономию с двумя словами, такими как my-taxonomy, разделенными чертой, и создайте шаблон таксономии taxonomy-my-taxonomy.php, и вы увидите ошибку. Я где-то читал номер, нужно еще раз проверить это. Это список безопасности, который я всегда использую, чтобы оставаться в безопасности, и он работал отлично. Спасибо за всю вашу информацию, ценится
Питер Гусен
1
Как и я, но только потому, что я изучил это с самого начала правильным способом Как я узнал больше всего, я знаю из WordPress Development и умных и опытных людей здесь. Так что есть много ошибок, которые я никогда не делал сам.
Николай
1
Имхо, этот ответ должен быть защищен. Детали в этом ответе / примере очень важны, и на них не часто указывают в Кодексе.
Чарльз