Inserimento di termini in una tassonomia gerarchica


17

Ho davvero qualche problema con l'inserimento dei termini. Ecco il mio scenario: ho una tassonomia chiamata veda_release_type:

//Release Type and Region
        $labels = array(
            'name'=> _x('Release Types/Regions', 'taxonomy general name' ),
            'singular_name' => _x('Release Type/Region', 'taxonomy singular name'),
            'search_items' => __('Search Release Types/Regions'),
            'popular_items' => __('Popular Release Types/Regions'),
            'all_items' => __('All Release Types/Regions'),
            'edit_item' => __('Edit Release Type/Regions'),
            'edit_item' => __('Edit Release Type/Region'),
            'update_item' => __('Update Release Type/Region'),
            'add_new_item' => __('Add New Release Type/Region'),
            'new_item_name' => __('New Release Type/Region Name'),
            'separate_items_with_commas' => __('Seperate Release Types/Regions with Commas'),
            'add_or_remove_items' => __('Add or Remove Release Types/Regions'),
            'choose_from_most_used' => __('Choose from Most Used Release Types/Regions')
        );
        $args = array( 
            'hierarchical' =>true,  
            'labels' => $labels,  
            'query_var' => true,  
            'rewrite' => array('slug' =>'release_type')     
        );
        register_taxonomy('veda_release_type', 'veda_release',$args);

È ovviamente gerarchico. Il livello superiore contiene i tipi di rilascio ieDVD, blu-ray. Il livello sotto quello sono le regioni cioè. Regione 1, Regione 2, ecc. Quindi, la Gerarchia che voglio è: DVD --Region 0 --Region 1 --Region 2 --Region 3 --Region 4 --Region 5 --Region 6 Blu-Ray - -Regione A --Regione B --Regione C

Ho creato una funzione chiamata insert_term nella mia classe per verificare se esiste un termine, quindi inserirlo in caso contrario:

public function insert_term ($term, $taxonomy, $args = array()) {
        if (isset($args['parent'])) {
            $parent = $args['parent'];
        } else {
            $parent = 0;
        }
        $result = term_exists($term, $taxonomy, $parent);
        if ($result == false || $result == 0) {
            return wp_insert_term($term, $taxonomy, $args);             
        } else {
            return (array) $result;
        }       
}

E poi chiamo detta funzione per inserire i termini:

    $dvd = $this->insert_term('DVD','veda_release_type');
    $this->insert_term('Region 0','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 1','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 2','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 3','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 4','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 5','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 6','veda_release_type',array('parent'=>$dvd['term_id']));

    $bd = $this->insert_term('Blu-Ray', 'veda_release_type');
    $this->insert_term('Region A','veda_release_type',array('parent'=>$bd['term_id']));
    $this->insert_term('Region B','veda_release_type',array('parent'=>$bd['term_id']));
    $this->insert_term('Region C','veda_release_type',array('parent'=>$bd['term_id']));

Il problema che sto riscontrando è che, sebbene i termini vengano inseriti nel database, non vengono visualizzati nella pagina della tassonomia. Al massimo, vengono visualizzati i termini di primo livello. Devo provare varie cose fino a quando non costringe WordPress a riconoscere i termini di livello inferiore. Qualcuno ha incontrato questo o può consigliare un modo migliore?

EDIT: Notato qualcos'altro: ho provato a cancellare i termini dal database quindi a disattivare e riattivare il plugin che dichiara i termini. I due termini principali vengono visualizzati nella pagina dei termini, ma i termini secondari no. I termini secondari vengono visualizzati nel menu a discesa "Padre" in cui si desidera creare un nuovo termine. Quando aggiungo un termine il cui genitore è uno dei termini secondari e aggiorno la pagina, ALLORA i termini secondari vengono visualizzati. inserisci qui la descrizione dell'immagine


Dopo aver fatto qualche ricerca, sembra che potrebbe essere necessario fare qualcosa con i termini cache. Non sono sicuro se o come posso cancellare la cache su una base coerente al fine di ottenerlo aggiornato.
Manny Fleurmond,

Risposte:


25

La gerarchia viene memorizzata nella cache e non viene invalidata correttamente. Questo è un bug, ancora irrisolto dal WP 3.1.

Una soluzione alternativa sarebbe quella di chiamare delete_option("{$taxonomy}_children");direttamente.

Vedi la funzione _get_term_hierarchy ().


Ho avuto la sensazione che fosse un problema di memorizzazione nella cache. Dovrei inserire questo prima o dopo aver inserito ogni bambino?
Manny Fleurmond,

2
Prende un ulteriore aggiornamento ma inserendo il codice delete_option dopo aver inserito tutti i termini figlio fa il trucco. Grazie, scribu. Ne è valsa la pena i punti rep che ho rinunciato. Spero che questo aiuti gli altri con problemi simili
Manny Fleurmond,

Grazie! Ho appena trascorso 4 ore su questo. Non appena mi è venuta l'idea di fare un diff del db prima e dopo aver aggiunto un termine tramite la GUI dell'amministratore ho visto l'opzione e sapevo cosa sarebbe arrivato a Google qui.
Per Wiklander il

6

I miei 2 centesimi: sto sviluppando un'estensione per il plug-in WooCommerce che consente la gestione della categoria di catalogo / prodotto tramite un file CSV caricato. Ho riscontrato questo stesso problema durante la generazione delle categorie. La soluzione per cancellare le categorie WooCommerce memorizzate nella cache era quella di chiamare delete_option("product_cat_children");dopo il ciclo che crea le categorie e le sottocategorie. Spero che questo aiuti qualcun altro!


2

È possibile che si riceva indietro un oggetto term_exists($term, $taxonomy, $parent)se la tassonomia è impostata quando viene chiamata. È impostato nel codice di esempio che hai pubblicato, quindi presumo che sia il problema.

Le istruzioni di inserimento prevedono un array quando fanno riferimento a chiavi.

Per esempio.

$bd['term_id']
$dvd['term_id']

... ma potresti effettivamente recuperare un oggetto term_exists.

Un modo rapido per determinare se questo è il problema sarebbe aggiornare questa riga.

return $result;

per..

return is_object( $result ) ? (array) $result : $result;

Se ho ragione e questo è il problema, questo dovrebbe risolverlo, anche se non lo definirei una soluzione elegante.

Spero che sia la risposta / aiuto che stavi cercando .. :)


Scusa per il ritardo della risposta. Grazie per averlo scoperto, ma non credo che abbia risolto il problema che avevo.
Manny Fleurmond,

1

Grazie. Questa domanda ha aiutato molto. Ero alle prese con i test unitari e ho scoperto che dovevo fare

delete_option('veda_release_type');
wp_cache_flush();

dopo aver aggiunto le mie categorie di livello superiore, quindi ripetere l'operazione dopo aver aggiunto le categorie di secondo livello per consentire a wordpress di cancellare tutto e lasciare passare i test unitari. Ciò risolve la necessità di un "caricamento / aggiornamento extra della seconda pagina" a cui fa riferimento un'altra risposta qui.


1

la mia soluzione:

(forse era necessario pulire i record della cache ..)

$PARENT_CAT= wp_insert_term('Parent_category_NAME','category',  array('slug'=> 'Parent_category_NAME'));
delete_option("category_children");
wp_cache_flush();

    $child= wp_insert_term('children_category_NAME','category',array( 'slug'=>'children_category_NAME', 'parent' =>$PARENT_CAT['term_id']));
    delete_option("category_children");
    wp_cache_flush();

Spiega la tua risposta e pubblica semplicemente il codice.
s_ha_dum,

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.