wake-up-neo.com

Einfügen von Begriffen in eine hierarchische Taxonomie

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 vorhanden ist. 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. enter image description here

17
Manny Fleurmond

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

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

Siehe die Funktion _get_term_hierarchy ().

25
scribu

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!

6
BWDesign

Möglicherweise erhalten Sie ein Objekt von term_exists($term, $taxonomy, $parent) zurück, 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 von term_exists zurück.

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 .. :)

2
t31os

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

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 den Vorgang, 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.

1
Steve

Nur ein letztes Update: Dieses Problem wurde bereits in WP 3.9 behoben: https://core.trac.wordpress.org/ticket/14485

0
Manny Fleurmond