Inserimento di un termine in una tassonomia personalizzata


9

Realizzata questa tassonomia personalizzata che controllerà il layout su singoli post, in pratica voglio aggiungere due opzioni, Layout 1 e 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 );

Le funzionalità sono impostate su valori non validi per impedire la modifica dei termini, ma non riesco a far funzionare wp_insert_term.

Aggiungere due termini alla mia tassonomia personalizzata non può essere così difficile, giusto?

Usarlo per inserire un termine non funziona, anche se cambiando il nome della mia tassonomia personalizzata in "categoria", ovvero WP default funziona perfettamente. Cosa dà?

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

Come promesso, ho pubblicato il codice nel plugin. Spero che questo aiuti :-)
Pieter Goosen il

Risposte:


11

MODIFICA 2

Come promesso, ecco il codice del plugin.

È noto che tassonomie personalizzate e tipi di post personalizzati dovrebbero essere inseriti in un plug-in e non nel tema. Ho rimosso le parti dal mio plugin.

COME FUNZIONA

La tassonomia è registrata normalmente attraverso il plugin. Per qualsiasi informazione in merito, puoi andare a dare un'occhiata register_taxonomy. La parte che avevo bisogno di evidenziare e ciò che è rilevante per questa domanda, è come inserire nuovi termini.

Inserire i termini in modo wp_insert_termsrapido e semplice, ma questo codice può anche danneggiare il tempo di caricamento se non utilizzato correttamente. L'idea è di eseguire quella funzione una volta e poi mai più, quasi come rimuoverla dopo la prima esecuzione.

Per fare ciò, aggancerai la tua funzione register_activation_hook. Questo hook viene eseguito una volta, ovvero quando viene attivato il plug-in, non verrà eseguito nuovamente all'aggiornamento della pagina. L'unica volta che si attiverà di nuovo è quando il plugin viene disattivato e riattivato

Quindi devi prima registrare la tua tassonomia in quanto non puoi assegnare termini a una tassonomia che non esiste. Una volta registrata la tassonomia, è possibile inserire i termini. Ricorda, questa azione avrà luogo una sola volta, ed è quando il plugin è attivato. Se è necessario aggiungere termini, è necessario disattivare il plug-in e riattivarlo

Si desidera inoltre verificare se esiste un termine prima di provare a crearlo e inserirlo.

Ecco il codice del plugin

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

MODIFICA 1

Il tuo problema con l'inserimento dei termini è il tuo gancio. after_setup_themeviene eseguito prima init, il che significa che stai cercando di inserire un termine in una tassonomia che non è ancora stata registrata.

Suggerirei di spostare la tua wp_insert_termfunzione all'interno della tua funzione init, appena sottoregister_taxonomy

Si consiglia inoltre di verificare se esiste un termine ( term_exists) prima di inserirlo

Esempio:

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

Si prega di notare che questo non è testato

RISPOSTA ORIGINALE

I nomi di tassonomia personalizzati (e i nomi di tipo di posta personalizzati) devono essere conformi a un insieme di regole molto specifico, altrimenti si incontrano insidie ​​per le quali non è possibile aggirare il problema.

Ecco una linea guida quando si scelgono i nomi per tassonomie personalizzate (e tipi di posta personalizzati)

  1. Di seguito sono non ammessi nei nomi di tassonomia personalizzati e nomi dei tipi di messaggi personalizzati

    • Lettere maiuscole o camelcase

    • Qualsiasi tipo di carattere speciale, tranne underscore ( _)

    • spazi

    • Più di 32 caratteri per tassonomie e 20 per tipi di posta

    • Tutti i nomi riservati , e si noti che ciò vale per qualsiasi convenzione di denominazione personalizzata, non solo per i nomi di tassonomia.

  2. Se ci sono più parole in un nome di tassonomia, devono essere separate da caratteri di sottolineatura, non trattini ( -). Sono stato sfidato che i trattini sono la strada da percorrere per il SEO negli URL per i nomi di tassonomia. È vero, ecco perché ci sono regole di riscrittura per adattare il tuo URL di conseguenza. Non modificare mai i nomi di tassonomia o i nomi dei tipi di post per scopi SEO URL

Inoltre, dovresti rimuovere quelle strane capacità. Potrebbe anche creare un problema

Se ciò non risolve il problema, aggiungi il codice che usi wp_insert_term

Riferimento:


Dopo aver esaminato la fonte sono un po 'sconcertato, perché il $taxonomyparametro non viene affatto sanificato, se l' query_varargomento viene impostato su true. Questo è abbastanza incredibile in realtà. E altrimenti viene sanificato via sanitize_title_with_dashes(), che sostituirà la roba con trattini dappertutto. Anche questo è incredibile, poiché non dovrebbero essere usati.
Nicolai,

A parte il fatto, puoi usare i numeri come preferisci, ovunque, quindi anche all'inizio, anche se puoi leggere ovunque che ciò non dovrebbe essere fatto. Tuttavia, non è stato possibile trovare un motivo preciso contro i numeri. A differenza dei trattini, se almeno c'è un'istruzione »Inoltre, se il tipo di post contiene trattini non sarà possibile aggiungere colonne alla pagina di amministrazione del tipo di post personalizzato (utilizzando l'azione 'manage_ <Nome tipo di post personalizzato> _posts_columns) . «Nella pagina del codice di register_post_type().
Nicolai,

1
Wordpress ha i suoi difetti, deve essere d'accordo. Alcuni sono crimini reali :-). Penso che i trattini siano uno degli argomenti più discussi e anche più utilizzati nei nomi. Il suo fallimento è abbastanza evidente quando inizi a guardare la gerarchia dei modelli. Crea una tassonomia con due parole come my-taxonomy separate da un trattino e crea un modello di tassonomia taxonomy-my-taxonomy.php e vedrai un errore. Ho letto la cosa dei numeri da qualche parte, ma devo ricontrollarla di nuovo. Questa è una lista sicura che uso sempre per stare al sicuro, e ha funzionato perfettamente. Grazie per tutte le informazioni, apprezzato
Pieter Goosen,

1
Anche io, ma solo perché l'ho imparato dall'inizio nel modo giusto. Come ho imparato di più, conosco lo sviluppo di WordPress e le persone intelligenti ed esperte qui. Quindi ci sono molti errori che non ho mai fatto.
Nicolai,

1
Imho dovrebbe questa risposta essere protetta. I dettagli in questa risposta / esempio sono molto importanti e spesso non sono abbastanza indicati nel Codice.
Charles,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.