Вставлення термінів в ієрархічну систематику


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

Це, очевидно, ієрхічно. Верхній рівень містить типи випуску, тобтоDVD, blu-ray. Рівень під цим є регіонами, тобто. Регіон 1, Регіон 2 і т.д. Отже, ієрархія, яку я хочу, це: DVD - Регіон 0 - Регіон 1 - Регіон 2 - Регіон 3 - Регіон 4 - Регіон 5 - Регіон 6 Blu-Ray - -Регіон А - Регіон В - Регіон С

Я створив функцію під назвою 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 визнати терміни підрівню. Хтось наткнувся на це чи може порекомендувати кращий спосіб?

EDIT: Помітив щось інше: я спробував видалити умови з бази даних, потім відключив та повторно активував плагін, який оголошує умови. Два батьківські терміни відображаються на сторінці термінів, але дочірні терміни - ні. Дочірні терміни DO відображаються у спадному меню "Батьків", де потрібно створити новий термін. Коли я додаю термін, батько якого є одним із дочірніх термінів, і оновлюю сторінку, ТОГО з'являються дочірні терміни. введіть тут опис зображення


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

Відповіді:


25

Ієрархія є кешованою, і вона недійсна. Це помилка, досі не вирішена як WP 3.1.

Приблизним рішенням буде delete_option("{$taxonomy}_children");прямий дзвінок .

Дивіться функцію _get_term_hierarchy ().


У мене було відчуття, що це питання кешування. Чи слід вставляти це до або після того, як я вставляю кожну дитину?
Менні Флермонд

2
Здійснює додаткове оновлення, але введення коду delete_option після вставки всіх дочірніх термінів робить трюк. Спасибі, розкажись. Це добре коштувало балів, які я відмовився. Сподіваємось, це допомагає іншим із подібними проблемами
Манні Флермонд

Спасибі! Я просто витратив на це 4 години. Як тільки я прийшов до ідеї зробити різницю db до і після додавання терміна через адміністративний графічний інтерфейс, я побачив варіант і знав, що до Google прийти сюди.
Per Wiklander

6

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


2

Можливо, ви можете отримувати об'єкт назад, term_exists($term, $taxonomy, $parent)якщо таксономія встановлена ​​при виклику. Він встановлений у зразку коду, який ви опублікували, тому я припускаю, що це проблема.

Виписки вставок очікують масиву, коли вони посилаються на ключі ..

Напр.

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

..але ви насправді можете повернути об’єкт term_exists.

Швидкий спосіб визначити, чи це проблема - оновити цей рядок.

return $result;

до ..

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

Якщо я маю рацію, і це проблема, це має вирішити, хоча я б не називав це елегантним виправленням.

Сподіваємось, це відповідь / допомога, яку ви шукали .. :)


Вибачте за пізню відповідь. Дякую, що ви зрозуміли це, але я не думаю, що це вирішило проблему, яку я мав.
Менні Флермонд

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

Поясніть, будь ласка, свою відповідь, а також просто опублікувавши код.
s_ha_dum

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.