Вставка терминов в иерархическую таксономию

17

У меня действительно есть несколько проблем с вставкой терминов. Вот мой сценарий: у меня есть таксономия 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);

Это, очевидно, иероглифический. Верхний уровень содержит типы релизов ieDVD, Blu-Ray. Уровень под которым находятся регионы т.е. Регион 1, Регион 2 и т. Д. Итак, мне нужна иерархия: DVD - Регион 0 - Регион 1 - Регион 2 - Регион 3 - Регион 4 - Регион 5 - Регион 6 Blu-Ray - -Регион A --Регион B --Регион C

Я создал функцию с именем insert_term в своем классе, чтобы проверить, существует ли термин, а затем вставьте его, если его нет:

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

И тогда я вызываю указанную функцию, чтобы вставить термины:

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

У меня проблема в том, что хотя термины вводятся в базу данных, они не отображаются на странице таксономии. Самое большее, условия высшего уровня обнаруживаются. Я должен пробовать разные вещи, пока WordPress не заставит распознавать термины подуровня. Кто-нибудь сталкивался с этим или может порекомендовать лучший способ?

РЕДАКТИРОВАТЬ: Заметил еще кое-что: я попытался удалить термины из базы данных, а затем деактивировать и повторно активировать плагин, который объявляет термины. Два родительских термина отображаются на странице терминов, а дочерние - нет. Дочерние термины отображаются в раскрывающемся меню «Родитель», где вы хотите создать новый термин. Когда я добавляю термин, родитель которого является одним из дочерних терминов, и обновляю страницу, ТО затем появляются дочерние термины. введите описание изображения здесь

Мэнни Флермонд
источник
После некоторого исследования кажется, что это может быть связано с кэшем терминов. Не уверен, смогу ли я очистить кеш на постоянной основе, чтобы обновить его.
Мэнни Флермонд

Ответы:

25

Иерархия кэшируется и не считается недействительной должным образом. Это ошибка, которая до сих пор не устранена в WP 3.1.

Обходной путь будет вызывать delete_option("{$taxonomy}_children");напрямую.

Смотрите функцию _get_term_hierarchy ().

scribu
источник
У меня было чувство, что это проблема с кэшированием. Должен ли я вставить это до или после каждого ребенка?
Мэнни Флермонд
2
Требует дополнительного обновления, но размещение кода delete_option после вставки всех дочерних терминов делает свое дело. Спасибо, scribu. Это стоило очков репутации, от которых я отказался. Надеюсь, это поможет другим с подобными проблемами
Мэнни Флермонд
Благодарность! Я просто потратил 4 часа на это. Как только я пришел к идее сделать различие в БД до и после добавления термина через GUI администратора, я увидел вариант и знал, что Google должен прийти сюда.
В Викландере
6

Мои 2 цента - я создаю расширение для плагина WooCommerce, которое позволяет управлять категориями каталогов / продуктами через загруженный файл CSV. Я столкнулся с этой же проблемой при создании категорий. Решение для очистки кэшированных категорий WooCommerce заключалось в вызове delete_option("product_cat_children");после цикла, который создает категории и подкатегории. Надеюсь, это поможет кому-то еще!

BWDesign
источник
2

Вы могли бы получить объект обратно от term_exists($term, $taxonomy, $parent) если таксономия установлена ​​при вызове. Это установлено в примере кода, который вы разместили, поэтому я предполагаю, что это проблема.

Ваши операторы вставки ожидают массив, когда они ссылаются на ключи ..

Например.

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

..но вы можете получить объект обратно от term_exists .

Быстрый способ определить, в этом ли проблема - обновить эту строку.

return $result;

к ..

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

Если я прав и это проблема, это должно исправить это, хотя я бы не назвал это элегантным решением.

Надеюсь, это ответ / помощь, которую вы искали .. :)

t31os
источник
Извините за задержку с ответом. Спасибо, что поймали это, но я не думаю, что это решило проблему, с которой я столкнулся.
Мэнни Флермонд
1

Благодарю. Этот вопрос очень помог. Я боролся с юнит-тестами и обнаружил, что должен сделать

delete_option('veda_release_type');
wp_cache_flush();

после добавления моих категорий верхнего уровня, а затем сделайте это снова после добавления категорий второго уровня, чтобы позволить wordpress очистить все и позволить модульным тестам пройти. Это обходит необходимость «второй загрузки страницы / дополнительного обновления», о которой говорится в другом ответе здесь.

Стив
источник
1

мое решение:

(возможно, это было необходимо для очистки записей кэша ..)

$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
источник
Пожалуйста, объясните свой ответ, а также просто отправьте код.
s_ha_dum