Einfügen von Begriffen in eine hierarchische Taxonomie

17

Ich habe wirklich ein paar Probleme beim Einfügen von Begriffen. Hier ist mein Szenario: Ich habe eine Taxonomie namens 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);

Es ist offensichtlich hierchisch. Die oberste Ebene enthält Release-Typen wie DVD, Blu-ray. Die Ebene darunter sind Regionen, dh. Region 1, Region 2 usw. Die von mir gewünschte Hierarchie lautet also: DVD --Region 0 --Region 1 --Region 2 --Region 3 --Region 4 --Region 5 --Region 6 Blu-Ray - -Region A --Region B --Region C

Ich habe eine Funktion namens insert_term in meiner Klasse erstellt, um zu prüfen, ob ein Begriff existiert. Fügen Sie ihn dann ein, wenn dies nicht der Fall ist:

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

Und dann rufe ich die Funktion auf, um die Begriffe einzufügen:

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

Das Problem, das ich habe, ist, dass die Begriffe, obwohl sie in die Datenbank eingegeben werden, nicht auf der Taxonomieseite angezeigt werden. Es werden höchstens die Begriffe der obersten Ebene angezeigt. Ich muss verschiedene Dinge ausprobieren, bis WordPress dadurch gezwungen wird, die Begriffe auf untergeordneter Ebene zu erkennen. Hat jemand darauf gestoßen oder kann man einen besseren Weg empfehlen?

BEARBEITEN: Noch etwas bemerkt: Ich habe versucht, die Begriffe aus der Datenbank zu löschen und dann das Plugin zu deaktivieren und wieder zu aktivieren, das die Begriffe deklariert. Die beiden übergeordneten Begriffe werden auf der Begriffsseite angezeigt, die untergeordneten Begriffe jedoch nicht. Die untergeordneten Begriffe werden im Dropdown-Menü "Übergeordnet" angezeigt, in dem Sie einen neuen Begriff erstellen möchten. Wenn ich einen Begriff hinzufüge, dessen Elternteil einer der untergeordneten Begriffe ist, und die Seite aktualisiere, werden DANN die untergeordneten Begriffe angezeigt. Bildbeschreibung hier eingeben

Manny Fleurmond
quelle
Nach einigen Nachforschungen scheint es, als ob es etwas mit dem Begriff Cache zu tun haben könnte. Ich bin nicht sicher, ob oder wie ich den Cache konsistent löschen kann, um ihn zu aktualisieren.
Manny Fleurmond

Antworten:

25

Die Hierarchie wird zwischengespeichert und nicht ordnungsgemäß ungültig gemacht. Dies ist ein Fehler, der seit WP 3.1 immer noch ungelöst ist.

Eine Problemumgehung wäre, delete_option("{$taxonomy}_children");direkt anzurufen .

Siehe die Funktion _get_term_hierarchy ().

scribu
quelle
Ich hatte das Gefühl, dass es sich um ein Caching-Problem handelt. Sollte ich dies vor oder nach dem Einfügen jedes Kindes einfügen?
Manny Fleurmond
2
Nimmt eine zusätzliche Aktualisierung vor, aber das Einfügen des Codes delete_option nach dem Einfügen aller untergeordneten Begriffe reicht aus. Danke, Scribu. Das war die Wiederholungspunkte wert, die ich aufgegeben habe. Hoffentlich hilft dies anderen mit ähnlichen Problemen
Manny Fleurmond
Vielen Dank! Ich habe gerade 4 Stunden damit verbracht. Sobald ich auf die Idee kam, vor und nach dem Hinzufügen eines Begriffs über die Admin-GUI ein Diff der Datenbank zu machen, sah ich die Option und wusste, was Google hierher kommen sollte.
Per Wiklander
6

Meine 2 Cent - Ich erstelle eine Erweiterung für das WooCommerce-Plugin, die die Verwaltung von Katalogkategorien / Produkten über eine hochgeladene CSV-Datei ermöglicht. Ich bin beim Generieren der Kategorien auf dasselbe Problem gestoßen. Die Lösung zum Löschen der zwischengespeicherten WooCommerce-Kategorien bestand darin, delete_option("product_cat_children");nach der Schleife aufzurufen , die die Kategorien und Unterkategorien erstellt. Hoffe das hilft jemand anderem!

BWDesign
quelle
2

Möglicherweise erhalten Sie ein Objekt zurück, term_exists($term, $taxonomy, $parent)wenn die Taxonomie beim Aufruf festgelegt wird. Es ist in dem von Ihnen geposteten Beispielcode festgelegt, also gehe ich davon aus, dass dies das Problem ist.

Ihre inserts-Anweisungen erwarten ein Array, wenn sie auf Schlüssel verweisen.

Z.B.

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

..aber Sie erhalten möglicherweise tatsächlich ein Objekt zurück term_exists.

Eine schnelle Möglichkeit, um festzustellen, ob dies das Problem ist, besteht darin, diese Zeile zu aktualisieren.

return $result;

zu..

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

Wenn ich Recht habe und das das Problem ist, sollte es das Problem beheben, obwohl ich das nicht als elegante Lösung bezeichnen würde.

Hoffentlich ist das die Antwort / Hilfe, nach der Sie gesucht haben .. :)

t31os
quelle
Entschuldigung für die späte Antwort. Danke, dass Sie das verstanden haben, aber ich glaube nicht, dass dies das Problem, das ich hatte, gelöst hat.
Manny Fleurmond
1

Vielen Dank. Diese Frage hat mir sehr geholfen. Ich hatte mit Unit-Tests zu kämpfen und musste es tun

delete_option('veda_release_type');
wp_cache_flush();

Nachdem Sie meine Kategorien der obersten Ebene hinzugefügt haben, und wiederholen Sie dies, nachdem Sie die Kategorien der zweiten Ebene hinzugefügt haben, damit WordPress alles löschen und die Komponententests bestehen kann. Dies funktioniert um die Notwendigkeit einer "zweiten Seite laden / extra aktualisieren", auf die in einer anderen Antwort hier verwiesen wird.

Steve
quelle
1

meine Lösung:

(Vielleicht wurde es benötigt, um die Cache-Datensätze zu bereinigen.)

$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();
T.Todua
quelle
Bitte erläutern Sie Ihre Antwort und geben Sie den Code ein.
s_ha_dum