Вставка терміна в призначену для користувача таксономию


9

Зроблено це таксономія, який буде контролювати розташування на окремих постах, в основному я хочу додати два варіанти компонування 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' );

Як і обіцяв, я опублікував код у плагіні. Сподіваюся, це допомагає :-)
Пітер Гусен

Відповіді:


12

EDIT 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функцію всередину своєї функції init, трохи нижче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 SEO цілей

Крім того, вам слід видалити ці дивні можливості. Це також може створити проблему

Якщо це не вирішує вашу проблему, додайте код, яким ви користуєтесь wp_insert_term

Довідка:


Подивившись в джерелі я трохи здивований, тому що $taxonomyпараметр не отримує дезінфікувати взагалі, якщо query_varаргумент отримує значення true. Це насправді неймовірно. І в іншому випадку він отримує дезінфікувати з допомогою sanitize_title_with_dashes(), яка буде, потеп ес прикмети, замінити матеріал з тиром всюди. Що також неймовірно, оскільки їх не слід використовувати.
Nicolai

Окрім факту, ви можете використовувати номери як завгодно, де завгодно, так на початку теж, хоча ви можете скрізь читати, що цього робити не слід. Неможливо знайти певну причину проти чисел. На відміну від тире, як мінімум, є вислів »Також, якщо тип публікації містить тире, ви не зможете додавати стовпці до сторінки адміністратора користувацького типу публікації (використовуючи дію 'управляти_ <Ім'я користувальницького типу публікації> _posts_column') . «На сторінці кодексу в register_post_type().
Миколай

1
У Wordpress є свої недоліки, треба погодитися. Деякі - це фактичні злочини :-). Я вважаю, що тире - одна з найбільш обговорюваних тем, а також найчастіше використовується в іменах. Його відмова цілком очевидна, коли ви починаєте дивитися на ієрархію шаблонів. Створення таксономії з двома словами , як моя-систематика , розділеної дефісом, і створити шаблон таксономії таксономії-мій-taxonomy.php , і ви побачите провал. Я десь прочитав річ з цифрами, хоч потрібно ще раз перевірити це. Це список безпечного перебування, який я завжди використовую, щоб залишатися в безпеці, і він прекрасно працював. Спасибі за всю вашу інформацію, оцінили
Pieter гусен

1
Як і я, але тільки тому, що я навчився це з самого початку правильно. Як я дізнався , що більшість я знаю від WordPress розвитку і розумних і досвідчених людей тут. Тож є багато помилок, яких я ніколи насправді не робив.
Nicolai

1
Имхо повинен ця відповідь буде захищений. Деталі у цій відповіді / прикладі дуже важливі, і це не так часто вказується в Кодексі.
Чарлз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.