Wstawianie terminu do niestandardowej taksonomii

9

Zrobiłem tę niestandardową taksonomię, która będzie kontrolować układ na pojedynczych słupkach, w zasadzie chcę dodać dwie opcje, Układ 1 i Układ 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 );

Możliwości są ustawione na niepoprawne wartości, aby zatrzymać edytowanie terminów, ale nie mogę uruchomić wp_insert_term.

Dodanie dwóch terminów do mojej niestandardowej taksonomii nie może być takie trudne, prawda?

Używanie tego do wstawiania terminu nie działa, chociaż jeśli zmieniłem niestandardową nazwę taksonomii na „kategorię”, tj. Domyślnie WP, działa dobrze. Co daje?

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' );
andy
źródło
Zgodnie z obietnicą opublikowałem kod we wtyczce. Mam nadzieję, że to pomoże :-)
Pieter Goosen

Odpowiedzi:

12

EDYCJA 2

Zgodnie z obietnicą, oto kod wtyczki.

Jest to znany fakt, że niestandardowe taksonomie i niestandardowe typy postów powinny wchodzić do wtyczki, a nie do motywu. Usunąłem części z mojej wtyczki.

JAK TO DZIAŁA

Taksonomia jest normalnie rejestrowana przez wtyczkę. Aby uzyskać wszelkie informacje na ten temat, możesz przejść i sprawdzić register_taxonomy. Część, którą chciałem podkreślić i co jest istotne dla tego pytania, to jak wstawić nowe warunki.

Wstawianie terminów wp_insert_termsjest szybkie i łatwe, ale ten kod może również zaszkodzić czasowi ładowania, jeśli nie zostanie użyty poprawnie. Chodzi o to, aby uruchomić tę funkcję raz, a potem nigdy więcej, prawie jak usunięcie jej po pierwszym uruchomieniu.

Aby to osiągnąć, musisz podłączyć swoją funkcję register_activation_hook. Ten hak jest uruchamiany raz, to znaczy, gdy wtyczka jest aktywowana, nie będzie ponownie uruchamiana po odświeżeniu strony. Jedynym razem, gdy ponownie się uruchomi, jest wyłączenie i ponowne włączenie wtyczki

Musisz więc najpierw zarejestrować swoją taksonomię, ponieważ nie możesz przypisać warunków do taksonomii, która nie istnieje. Po zarejestrowaniu systematyki możesz wstawić warunki. Pamiętaj, że ta akcja będzie miała miejsce tylko raz, i to wtedy, gdy wtyczka zostanie aktywowana. Jeśli chcesz dodać warunki, musisz dezaktywować wtyczkę i aktywować ją ponownie

Chcesz również najpierw sprawdzić, czy istnieje termin, zanim spróbujesz go utworzyć i wstawić.

Oto kod wtyczki

<?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();

EDYCJA 1

Twój problem z wstawieniem warunków jest twoim hakiem. after_setup_themedziała wcześniej init, co oznacza, że ​​próbujesz wstawić termin do taksonomii, która nie jest jeszcze zarejestrowana.

Sugerowałbym, aby przenieść swoją wp_insert_termfunkcję do wewnątrz funkcji init, tuż poniżejregister_taxonomy

Wskazane jest również, aby najpierw sprawdzić, czy istnieje termin ( term_exists) przed wstawieniem go

Przykład:

// 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 );

Uwaga: to nie zostało przetestowane

ORYGINALNA ODPOWIEDŹ

Niestandardowe nazwy taksonomii (i niestandardowe nazwy typów postów) muszą być zgodne z bardzo konkretnym zestawem reguł, w przeciwnym razie napotkacie pułapki, na które nie można się obejść.

Oto przewodnik przy wybieraniu nazw dla niestandardowych systematyk (i niestandardowych typów postów)

  1. Poniżej znajdują się nie dozwolone w nazwach niestandardowych taksonomii i nazwy niestandardowego typu pocztowych

    • Wielkie litery lub camelcase

    • Każdy typ znaku specjalnego, z wyjątkiem podkreślników ( _)

    • Przestrzenie

    • Ponad 32 znaki dla taksonomii i 20 dla typów postów

    • Wszelkie zastrzeżone nazwy , i pamiętaj, że dotyczy to dowolnej niestandardowej konwencji nazewnictwa, nie tylko nazw taksonomii.

  2. Jeśli nazwa taksonomiczna zawiera więcej niż jedno słowo, należy je oddzielić podkreślnikami, a nie myślnikami ( -). Rzucono mi wyzwanie, że łączniki są sposobem na SEO w adresach URL nazw taksonomii. To prawda, dlatego istnieją reguły przepisywania, które odpowiednio dostosowują adres URL. Nigdy nie zmieniaj nazw taksonomii ani nazw typów postów dla celów SEO adresów URL

Powinieneś także usunąć te dziwne możliwości. Może to również powodować problemy

Jeśli to nie rozwiąże problemu, dodaj kod, którego używasz wp_insert_term

Odniesienie:

Pieter Goosen
źródło
Po przejrzeniu źródła jestem trochę zakłopotany, ponieważ $taxonomyparametr wcale się nie dezynfekuje, jeśli query_varargument zostanie ustawiony na true. To naprawdę niewiarygodne. W przeciwnym razie zostanie zdezynfekowany sanitize_title_with_dashes(), co, nomen es omen, zastąpi rzeczy kreskami w całym miejscu. Co również jest niewiarygodne, ponieważ nie należy ich używać.
Nicolai
Oprócz tego możesz używać liczb, jak chcesz, w dowolnym miejscu, więc też na początku, chociaż wszędzie możesz przeczytać, że nie należy tego robić. Nie można jednak znaleźć konkretnego powodu dla liczb. W przeciwieństwie do myślników, czy przynajmniej istnieje zdanie »Ponadto, jeśli typ postu zawiera myślniki, nie będzie można dodawać kolumn do strony administratora niestandardowego typu postu (używając akcji„ manage_ <Nazwa niestandardowego typu postu> _posts_columns ”) . «Na stronie kodeksu register_post_type().
Nicolai
1
Wordpress ma swoje wady, musi się zgodzić. Niektóre są prawdziwymi przestępstwami :-). Myślę, że myślniki to jeden z najczęściej poruszanych tematów i najczęściej używany w nazwach. Jego niepowodzenie jest dość oczywiste, gdy zaczynasz patrzeć na hierarchię szablonów. Utwórz taksonomię z dwoma słowami, takimi jak moja taksonomia oddzielona myślnikiem, i utwórz szablon taksonomii taksonomia-moja-taksonomia.php, a zobaczysz błąd. Przeczytałem gdzieś numer, ale muszę to jeszcze raz sprawdzić. Jest to lista bezpiecznych miejsc, z której zawsze korzystam, aby zachować bezpieczeństwo i działała idealnie. Dziękujemy za wszystkie informacje, doceniamy
Pieter Goosen
1
Podobnie jak ja, ale tylko dlatego, że nauczyłem się tego od samego początku we właściwy sposób. Jak dowiedziałem się najwięcej, wiem od WordPress Development oraz od inteligentnych i doświadczonych ludzi. Jest więc wiele błędów, których sam nigdy nie popełniłem.
Nicolai
1
Imho powinna chronić tę odpowiedź. Szczegóły w tej odpowiedzi / przykładzie są bardzo ważne i nie są często wskazywane w Kodeksie.
Charles,