web-dev-qa-db-fra.com

Insertion de termes dans une taxonomie hiérarchique

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 version, à 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 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'à forcer WordPress à 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 n'apparaissent pas 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. enter image description here

17
Manny Fleurmond

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

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

Voir la fonction _get_term_hierarchy ().

25
scribu

Mes 2 cents - Je construis une extension pour le plugin 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 consistait à 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 ceci aide quelqu'un d'autre!

6
BWDesign

Vous pourriez éventuellement recevoir un objet 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 obtenir 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égler le problème, même si je n'appellerais pas cela un correctif élégant.

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

2
t31os

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();
1
T.Todua

Merci. Cette question a beaucoup aidé. J'avais du mal avec les 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 second niveau pour permettre à wordpress de tout effacer et de laisser passer les tests unitaires. Cela évite la nécessité d'un "chargement de la deuxième page/actualisation supplémentaire" mentionné dans une autre réponse ici.

1
Steve

Juste une dernière mise à jour: cela a été corrigé tout le chemin du retour dans WP 3.9: https://core.trac.wordpress.org/ticket/14485

0
Manny Fleurmond