Insertion de termes dans une taxonomie hiérarchique

16

J'ai vraiment quelques problèmes avec l'insertion de termes. Voici mon scénario: J'ai une taxonomie appelée 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);

C'est évidemment hiérarchique. Niveau supérieur contient les types de libération, à savoir DVD, Blu-ray. Le niveau en dessous sont les régions, à savoir. Région 1, Région 2, etc. Ainsi, la hiérarchie que je souhaite est la suivante: DVD --Région 0 --Région 1 --Région 2 --Région 3 --Région 4 --Région 5 --Région 6 Blu Ray --Région A --Région B --Région C

J'ai créé une fonction appelée insert_term dans ma classe pour vérifier si un terme existe, puis l'insérer si ce n'est pas le cas:

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;
        }       
}

Et puis j'appelle cette fonction pour insérer les termes:

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

Le problème que je rencontre est que, même si les termes sont entrés dans la base de données, ils n'apparaissent pas sur la page taxonomie. Tout au plus, les termes de premier niveau apparaissent. Je dois essayer diverses choses jusqu'à ce que WordPress soit obligé de reconnaître les termes du sous-niveau. Quelqu'un a-t-il rencontré ce problème ou peut-il recommander un meilleur moyen?

EDIT: Remarqué quelque chose d'autre: j'ai essayé de supprimer les termes de la base de données, puis de désactiver et de réactiver le plugin qui déclare les termes. Les deux termes parents apparaissent dans la page des termes, mais pas les termes enfants. Les termes enfants apparaîtront dans le menu déroulant "Parent" dans lequel vous souhaitez créer un nouveau terme. Lorsque j'ajoute un terme dont le parent est l'un des termes enfants et que j'actualise la page, ALORS les termes enfants s'affichent.

    
posée Manny Fleurmond 02.02.2011 - 13:52

6 réponses

25

La hiérarchie est mise en cache et elle n'est pas invalidée correctement. C’est un bug qui n’a toujours pas été résolu depuis WP 3.1.

Une solution de contournement consisterait à appeler delete_option("{$taxonomy}_children"); directement.

Voir la fonction _get_term_hierarchy ().

    
réponse donnée scribu 09.02.2011 - 00:55
6

Mes 2 cents - Je construis une extension pour le plug-in WooCommerce qui permet la gestion des catégories / produits du catalogue via un fichier CSV téléchargé. J'ai rencontré le même problème lors de la génération des catégories. La solution pour effacer les catégories WooCommerce en cache était d'appeler delete_option("product_cat_children"); après la boucle qui crée les catégories et les sous-catégories. J'espère que cela aide quelqu'un d'autre!

    
réponse donnée BWDesign 28.11.2012 - 20:28
2

Vous pourriez éventuellement recevoir un objet en retour de term_exists($term, $taxonomy, $parent) si la taxonomie est définie à l'appel. C'est défini dans l'exemple de code que vous avez posté, alors je suppose que c'est le problème.

Vos instructions inserts attendent un tableau lorsqu'elles référencent des clés.

Par exemple

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

.. mais vous pouvez effectivement récupérer un objet de term_exists .

Un moyen rapide de déterminer si tel est le problème serait de mettre à jour cette ligne.

return $result;

à ..

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

Si j'ai raison et que c'est le problème, cela devrait résoudre le problème, bien que je n'appelle pas cela une solution élégante.

J'espère que c'est la réponse / l'aide que vous cherchiez ..:)

    
réponse donnée t31os 02.02.2011 - 14:43
1

Merci. Cette question a beaucoup aidé. Je me débattais avec les tests unitaires et j'ai trouvé que je devais le faire

delete_option('veda_release_type');
wp_cache_flush();

après avoir ajouté mes catégories de niveau supérieur, puis recommencez après avoir ajouté les catégories de second niveau pour permettre à wordpress de tout effacer et de laisser les tests unitaires passer. Cela évite la nécessité d’un "chargement de la deuxième page / actualisation supplémentaire" mentionné dans une autre réponse ici.

    
réponse donnée Steve 25.02.2013 - 02:06
1

ma solution:

(peut-être était-il nécessaire de nettoyer les enregistrements de 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();
    
réponse donnée T.Todua 26.11.2013 - 18:13
0

Juste une dernière mise à jour: cela a été corrigé depuis WP 3.9: enlace

    
réponse donnée Manny Fleurmond 22.12.2017 - 05:14

Lire d'autres questions sur les étiquettes