Insertion de termes dans une taxonomie hiérarchique


17

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. Le niveau supérieur contient les types de version ieDVD, blu-ray. Le niveau sous qui sont les régions à savoir. Région 1, Région 2, etc. Donc, la hiérarchie que je veux est: 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 ladite 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 j'ai, c'est que même si les termes sont entrés dans la base de données, ils n'apparaissent pas sur la page de taxonomie. Tout au plus, les termes de premier niveau apparaissent. Je dois essayer diverses choses jusqu'à ce qu'il force WordPress à reconnaître les termes de sous-niveau. Quelqu'un at-il rencontré cela ou peut-il recommander une meilleure façon?

EDIT: J'ai remarqué autre chose: 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 parent apparaissent dans la page des termes, mais pas les termes enfants. Les termes enfants apparaissent dans le menu déroulant "Parent" où vous souhaitez créer un nouveau terme. Lorsque j'ajoute un terme dont le parent est l'un des termes enfants et actualise la page, ALORS les termes enfants s'affichent. entrez la description de l'image ici


Après avoir fait quelques recherches, il semble qu'il doive faire quelque chose avec les termes cache. Je ne sais pas si ni comment je peux effacer le cache de manière cohérente afin de le mettre à jour.
Manny Fleurmond

Réponses:


25

La hiérarchie est mise en cache et elle n'est pas invalidée correctement. Il s'agit d'un bug, toujours non résolu depuis WP 3.1.

Une solution de contournement serait d'appeler delete_option("{$taxonomy}_children");directement.

Voir la fonction _get_term_hierarchy ().


J'avais le sentiment que c'était un problème de mise en cache. Dois-je insérer ceci avant ou après avoir inséré chaque enfant?
Manny Fleurmond

2
Prend un rafraîchissement supplémentaire mais placer le code delete_option après avoir inséré tous les termes enfants fait l'affaire. Merci, scribu. Cela valait bien les points de répétition que j'ai abandonnés. Espérons que cela aide d'autres personnes ayant des problèmes similaires
Manny Fleurmond

Merci! Je viens de passer 4 heures là-dessus. Dès que je suis venu à l'idée de faire un diff de la base de données avant et après avoir ajouté un terme via l'interface graphique d'administration, j'ai vu l'option et je savais quoi Google pour venir ici.
Par Wiklander

6

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


2

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

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

Par exemple.

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

..mais vous pourriez en fait récupérer un objet term_exists.

Un moyen rapide de déterminer si c'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 le résoudre, même si je n'appellerais pas cela une solution élégante.

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


Désolé pour la réponse tardive. Merci d'avoir attrapé cela, mais je ne pense pas que cela ait résolu le problème que j'avais.
Manny Fleurmond

1

Merci. Cette question a beaucoup aidé. Je me débattais avec des tests unitaires et j'ai trouvé que je devais 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 deuxième niveau pour permettre à wordpress de tout effacer et de laisser passer les tests unitaires. Cela fonctionne autour de la nécessité d'un "deuxième chargement de page / rafraîchissement supplémentaire" mentionné dans une autre réponse ici.


1

ma solution:

(peut-être était-il nécessaire de nettoyer les enregistrements du 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();

Veuillez expliquer votre réponse et simplement afficher le code.
s_ha_dum

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.