Inserimento di un termine in una tassonomia personalizzata

6 ott 2014, 05:38:42
Visualizzazioni: 29.3K
Voti: 10

Ho creato questa tassonomia personalizzata che controllerà il layout nei post singoli, fondamentalmente voglio aggiungere due opzioni, Layout 1 e Layout 2.

// Registra Tassonomia Personalizzata
function custom_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Layout', 'Nome Generale Tassonomia', 'text_domain' ),
        'singular_name'              => _x( 'Layout', 'Nome Singolare Tassonomia', 'text_domain' ),
        'menu_name'                  => __( 'Tassonomia', 'text_domain' ),
        'all_items'                  => __( 'Tutti gli Elementi', 'text_domain' ),
        'parent_item'                => __( 'Elemento Genitore', 'text_domain' ),
        'parent_item_colon'          => __( 'Elemento Genitore:', 'text_domain' ),
        'new_item_name'              => __( 'Nuovo Nome Elemento', 'text_domain' ),
        'add_new_item'               => __( 'Aggiungi Nuovo Elemento', 'text_domain' ),
        'edit_item'                  => __( 'Modifica Elemento', 'text_domain' ),
        'update_item'                => __( 'Aggiorna Elemento', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separa elementi con virgole', 'text_domain' ),
        'search_items'               => __( 'Cerca Elementi', 'text_domain' ),
        'add_or_remove_items'        => __( 'Aggiungi o rimuovi elementi', 'text_domain' ),
        'choose_from_most_used'      => __( 'Scegli tra gli elementi più usati', 'text_domain' ),
        'not_found'                  => __( 'Non Trovato', '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 nell'azione 'init'
add_action( 'init', 'custom_taxonomy', 0 );

Le capabilities 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?

Usando questo per inserire un termine non funziona, anche se se cambio il nome della mia tassonomia personalizzata in 'category', cioè WP predefinito, funziona perfettamente. Come mai?

function example_insert_category() {
    $parent_term = term_exists( 'layout' ); // viene restituito un array se viene fornita la tassonomia
    $parent_term_id = $parent_term['term_id']; // ottiene l'id numerico del termine
    wp_insert_term(
        'Categoria di Esempio',
        'layout',
        array(
          'description' => 'Questa è una categoria di esempio creata con wp_insert_term.',
          'slug'        => 'example-category'
        )
    );
}
add_action( 'after_setup_theme', 'example_insert_category' );
1
Commenti

Come promesso, ho pubblicato il codice del plugin. Spero che sia utile :-)

Pieter Goosen Pieter Goosen
7 ott 2014 19:03:28
Tutte le risposte alla domanda 1
8
13

MODIFICA 2

Come promesso, ecco il codice del plugin.

È risaputo che le tassonomie personalizzate e i tipi di post personalizzati dovrebbero essere inseriti in un plugin, e non nel tuo tema. Ho rimosso alcune parti dal mio plugin.

COME FUNZIONA

La tassonomia viene registrata normalmente attraverso il plugin. Per qualsiasi informazione a riguardo, puoi consultare register_taxonomy. La parte che volevo evidenziare e che è rilevante per questa domanda, è come inserire nuovi termini.

Inserire termini tramite wp_insert_terms è veloce e semplice, ma questo codice può anche rallentare il tempo di caricamento se non usato correttamente. L'idea è eseguire quella funzione una sola volta, e poi mai più, quasi come rimuoverla dopo la prima esecuzione.

Per ottenere questo, dovrai agganciare la tua funzione a register_activation_hook. Questo hook viene eseguito una volta, cioè quando il plugin viene attivato, non verrà rieseguito al refresh della pagina. L'unica volta che verrà attivato di nuovo è quando il plugin viene disattivato e riattivato.

Quindi devi prima registrare la tua tassonomia poiché non puoi assegnare termini a una tassonomia che non esiste. Una volta che la tua tassonomia è registrata, puoi inserire i tuoi termini. Ricorda, questa azione avverrà solo una volta, e cioè quando il plugin viene attivato. Se hai bisogno di aggiungere termini, devi disattivare il plugin e riattivarlo.

Dovresti anche verificare prima se un termine esiste già prima di provare a crearlo e inserirlo.

Ecco il codice del plugin

<?php
/**
Plugin Name: Crea termini
Plugin URI: http://wordpress.stackexchange.com/q/163541/31545
Description: Crea termini
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', 'nome generale della tassonomia' ),
                'singular_name'                 => _x('Test Tax', 'nome singolare della tassonomia'),
                'search_items'                  => __('Cerca Test Tax'),
                'popular_items'                 => __('Test Tax Popolari'),
                'all_items'                     => __('Tutti i Test Tax'),
                'edit_item'                     => __('Modifica Test Tax'),
                'edit_item'                     => __('Modifica Test Tax'),
                'update_item'                   => __('Aggiorna Test Tax'),
                'add_new_item'                  => __('Aggiungi Nuovo Test Tax'),
                'new_item_name'                 => __('Nome Nuovo Test Tax'),
                'separate_items_with_commas'    => __('Separa Test Tax con Virgole'),
                'add_or_remove_items'           => __('Aggiungi o Rimuovi Test Tax'),
                'choose_from_most_used'         => __('Scegli tra i Test Tax più usati')
            ),  
            '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'   => 'Questo è un termine di prova uno',
            ),
            '1' => array (
                'name'          => 'Tester 2',
                'slug'          => 'tester-2',
                'description'   => 'Questo è un termine di prova due',
            ),
        );  

        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 hook. after_setup_theme viene eseguito prima di init, il che significa che stai cercando di inserire un termine in una tassonomia che non è ancora stata registrata.

Suggerirei di spostare la tua funzione wp_insert_term all'interno della tua funzione init, appena sotto register_taxonomy.

È anche consigliabile verificare prima se un termine esiste (term_exists) prima di inserirlo.

Esempio:

// Registra Tassonomia Personalizzata
function custom_taxonomy() {

   //CODICE PER REGISTRARE LA TASSONOMIA

   if( !term_exists( 'Example Category', 'layout' ) ) {
       wp_insert_term(
           'Example Category',
           'layout',
           array(
             'description' => 'Questa è una categoria di esempio creata con wp_insert_term.',
             'slug'        => 'example-category'
           )
       );
   }
}

// Aggancia all'azione 'init'
add_action( 'init', 'custom_taxonomy', 0 );

Nota: questo codice non è stato testato

RISPOSTA ORIGINALE

I nomi delle tassonomie personalizzate (e i nomi dei tipi di post personalizzati) devono conformarsi a un insieme molto specifico di regole, altrimenti incontrerai problemi per i quali non ci sono soluzioni alternative.

Ecco una linea guida per scegliere i nomi per le tassonomie personalizzate (e i tipi di post personalizzati)

  1. I seguenti elementi non sono consentiti nei nomi delle tassonomie personalizzate e nei nomi dei tipi di post personalizzati

    • Lettere maiuscole o camelCase

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

    • Spazi

    • Più di 32 caratteri per le tassonomie e 20 per i tipi di post

    • Qualsiasi nome riservato, e nota che questo vale per qualsiasi convenzione di denominazione personalizzata, non solo per i nomi delle tassonomie.

  2. Se ci sono più di una parola in un nome di tassonomia, devono essere separate da underscore, non da trattini (-). Mi è stato obiettato che i trattini sono la scelta migliore per l'SEO negli URL per i nomi delle tassonomie. È vero, ecco perché ci sono regole di rewrite per adattare l'URL di conseguenza. Non cambiare mai i nomi delle tassonomie o dei tipi di post per motivi di SEO negli URL.

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

Se questo non risolve il tuo problema, per favore aggiungi il codice che usi con wp_insert_term.

Riferimenti:

6 ott 2014 07:35:25
Commenti

Dopo aver esaminato il sorgente sono un po' perplesso, perché il parametro $taxonomy non viene affatto sanificato, se l'argomento query_var viene impostato su true. È davvero incredibile. Altrimenti viene sanificato tramite sanitize_title_with_dashes(), che, nomen es omen, sostituirà i caratteri con trattini ovunque. Anche questo è incredibile, dato che non dovrebbero essere usati.

Nicolai Grossherr Nicolai Grossherr
6 ott 2014 21:23:17

A parte il fatto che puoi usare numeri come preferisci, ovunque, anche all'inizio, nonostante si possa leggere ovunque che non dovrebbe essere fatto. Non ho trovato una ragione definitiva contro i numeri però. A differenza dei trattini, dove almeno c'è un'affermazione »Inoltre, se il post type contiene trattini non sarai in grado di aggiungere colonne alla pagina di amministrazione del custom post type (usando l'azione 'manage_<Nome Custom Post Type>_posts_columns')« nella pagina del codex di register_post_type().

Nicolai Grossherr Nicolai Grossherr
6 ott 2014 21:24:12

Anche se è un po' nascosto nella sezione »Reserved Post Types«. Non so perché cose del genere - potenzialmente o definitivamente problematiche - non vengano imposte. Altrimenti è solo chiedere guai senza una buona ragione.

Nicolai Grossherr Nicolai Grossherr
6 ott 2014 21:25:55

Wordpress ha sicuramente i suoi difetti, devo ammetterlo. Alcuni sono veri e propri crimini :-). 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 template. Crea una tassonomia con due parole come la mia-tassonomia separate da un trattino, e crea un template di tassonomia taxonomy-mia-tassonomia.php e vedrai il fallimento. Ho letto da qualche parte la questione dei numeri, devo ricontrollare. Questa è una lista di sicurezza che uso sempre per stare al sicuro, e ha funzionato perfettamente. Grazie per tutte le tue informazioni, apprezzate

Pieter Goosen Pieter Goosen
6 ott 2014 21:41:17

Anch'io, ma solo perché l'ho imparato fin dall'inizio nel modo giusto. Come ho imparato la maggior parte di quello che so da [wordpress.se] e dalle persone intelligenti ed esperte qui presenti. Quindi ci sono molti errori che in realtà non ho mai commesso io stesso.

Nicolai Grossherr Nicolai Grossherr
6 ott 2014 21:48:04

È un piacere. Divertiti :-)

Pieter Goosen Pieter Goosen
7 ott 2014 20:39:57

A mio parere questa risposta dovrebbe essere protetta. I dettagli in questa risposta/esempio sono molto importanti e non vengono menzionati abbastanza spesso nel Codex.

Charles Charles
22 nov 2015 18:15:33

Credo che il controllo se il termine esista non sia necessario poiché la funzione wp_insert_term contiene già un controllo all'inizio.

Anders Östman Anders Östman
20 mar 2017 11:45:21
Mostra i restanti 3 commenti