Wstawianie terminów w hierarchicznej taksonomii


17

Naprawdę mam kilka problemów ze wstawianiem terminów. Oto mój scenariusz: mam taksonomię o nazwie 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);

To oczywiście hieraryczne. Najwyższy poziom zawiera typy wydań tj. DVD, Blu-ray. Pod tym poziomem są regiony, tj. Region 1, Region 2 itd. Hierarchia, którą chcę, to: DVD - region 0 - region 1 - region 2 - region 3 - region 4 - region 5 - region 6 Blu-Ray - - region A - region B - region C

Utworzyłem funkcję o nazwie insert_term w mojej klasie, aby sprawdzić, czy istnieje termin, a następnie wstaw go, jeśli nie:

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

A potem wywołuję tę funkcję, aby wstawić warunki:

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

Problemem jest to, że chociaż warunki są wprowadzane do bazy danych, nie pojawiają się na stronie taksonomii. Wyświetlane są co najwyżej warunki najwyższego poziomu. Muszę próbować różnych rzeczy, dopóki nie zmusi to WordPressa do rozpoznania warunków podpoziomu. Czy ktoś na to wpadł lub może polecić lepszy sposób?

EDYCJA: Zauważyłem coś innego: próbowałem usunąć warunki z bazy danych, a następnie dezaktywować i reaktywować wtyczkę, która deklaruje warunki. Dwa warunki nadrzędne są wyświetlane na stronie warunków, ale warunki podrzędne nie. Warunki potomne NIE pojawiają się w rozwijanym menu „Rodzic”, w którym chcesz utworzyć nowy termin. Kiedy dodam termin, którego rodzic jest jednym z warunków podrzędnych, i odświeżę stronę, TO pojawią się warunki podrzędne. wprowadź opis zdjęcia tutaj


Po przeprowadzeniu niektórych badań wydaje się, że być może trzeba coś zrobić z pamięcią podręczną terminów. Nie jestem pewien, czy i jak mogę wyczyścić pamięć podręczną w spójny sposób, aby ją zaktualizować.
Manny Fleurmond

Odpowiedzi:


25

Hierarchia jest buforowana i nie została poprawnie unieważniona. Jest to błąd, który nadal nie został rozwiązany od wersji WP 3.1.

Obejściem byłoby zadzwonić delete_option("{$taxonomy}_children");bezpośrednio.

Zobacz funkcję _get_term_hierarchy ().


Miałem wrażenie, że to problem z pamięcią podręczną. Czy powinienem to wstawiać przed czy po wstawieniu każdego dziecka?
Manny Fleurmond

2
Wymaga dodatkowego odświeżenia, ale umieszczenie kodu delete_option po wstawieniu wszystkich podrzędnych warunków załatwia sprawę. Dzięki, scribu. To było warte powtórzenia punktów, które zrezygnowałem. Mam nadzieję, że to pomaga innym z podobnymi problemami
Manny Fleurmond

Dzięki! Właśnie spędziłem na tym 4 godziny. Jak tylko wpadłem na pomysł zrobienia różnic w db przed i po dodaniu terminu poprzez GUI administratora, zobaczyłem opcję i wiedziałem, co Google tu przyjść.
Per Wiklander

6

Moje 2 centy - Buduję rozszerzenie wtyczki WooCommerce, które umożliwia zarządzanie kategorią katalogu / produktem za pośrednictwem przesłanego pliku CSV. Ten sam problem napotkałem podczas generowania kategorii. Rozwiązaniem do wyczyszczenia buforowanych kategorii WooCommerce było wywołanie delete_option("product_cat_children");po pętli, która tworzy kategorie i podkategorie. Mam nadzieję, że to pomaga komuś innemu!


2

Możliwe, że otrzymujesz obiekt z powrotem, term_exists($term, $taxonomy, $parent)jeśli taksonomia jest ustawiona po wywołaniu. Jest ustawiony w przykładowym kodzie, który opublikowałeś, więc zakładam, że to jest problem.

Instrukcje wstawiania oczekują tablicy, gdy odwołują się do kluczy.

Na przykład.

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

.. ale możesz odzyskać obiekt z powrotem term_exists.

Szybkim sposobem ustalenia, czy to jest problem, byłoby zaktualizowanie tej linii.

return $result;

do..

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

Jeśli mam rację i to jest problem, powinien to naprawić, choć nie nazwałbym tego eleganckim rozwiązaniem.

Mam nadzieję, że to odpowiedź / pomoc, której szukałeś .. :)


Przepraszam za późną odpowiedź. Dziękuję za złapanie tego, ale nie sądzę, że rozwiązało to mój problem.
Manny Fleurmond

1

Dzięki. To pytanie bardzo pomogło. Walczyłem z testami jednostkowymi i stwierdziłem, że muszę to zrobić

delete_option('veda_release_type');
wp_cache_flush();

po dodaniu moich kategorii najwyższego poziomu, a następnie zrób to ponownie po dodaniu kategorii drugiego poziomu, aby umożliwić Wordpressowi wyczyszczenie wszystkiego i pozwolić, aby testy jednostkowe przebiegły pomyślnie. Działa to wokół potrzeby „ładowania / odświeżania drugiej strony”, o której mowa w innej odpowiedzi tutaj.


1

moje rozwiązanie:

(być może trzeba było wyczyścić rekordy pamięci podręcznej ..)

$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();

Proszę wyjaśnić swoją odpowiedź, a także po prostu opublikować kod.
s_ha_dum

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.