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.
źródło
Odpowiedzi:
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 ().
źródło
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!źródło
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.
.. ale możesz odzyskać obiekt z powrotem
term_exists
.Szybkim sposobem ustalenia, czy to jest problem, byłoby zaktualizowanie tej linii.
do..
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ś .. :)
źródło
Dzięki. To pytanie bardzo pomogło. Walczyłem z testami jednostkowymi i stwierdziłem, że muszę to zrobić
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.
źródło
moje rozwiązanie:
(być może trzeba było wyczyścić rekordy pamięci podręcznej ..)
źródło
Tylko ostatnia aktualizacja: naprawiono to już w WP 3.9: https://core.trac.wordpress.org/ticket/14485
źródło