get_terms не работает, когда используется child_of

Вопрос или проблема

У меня есть собственная таксономия, зарегистрированная как department, которая работает в других запросах, но не работает, когда я использую:

$args = array( 'child_of' => 483 , 'hide_empty' => false);
$subcats = get_terms( 'department', $args );

foreach( $subcats as $category ) {
    echo $category->name;
}

Как только мы убираем child_of, выводятся все термины. Даже использование “parent” тоже не работает. Что я упускаю? В базе данных я могу проверить, что термины существуют в иерархии.

Я сам решил эту проблему, поэтому хотел ответить на свой вопрос.

В таблице опций результаты кэшируются, поэтому я выполнил запрос и удалил это.

SELECT * FROM `wp_options` WHERE `option_name` like '%department%'

department – это название моей таксономии здесь.

Вы можете проверить функцию _get_term_hierarchy в taxonomy.php в папке wp-includes.

Вероятно, это закэшировано, но вместо того, чтобы делать SQL-запрос для устранения проблемы и потенциально сломать что-то, используйте специальную функцию:

clean_taxonomy_cache( 'department' );

Или, если у вас есть WP CLI:

wp cache flush

Другие варианты включают:

  • delete_option( 'department_children' );
  • Создание/удаление терминов

Используйте параметр parent, если child_of не работает, они служат похожим целям, но parent используется, когда вы хотите получить термины, которые являются прямыми дочерними элементами конкретного родительского термина.

$args = array( 'parent' => 483 , 'hide_empty' => false);
$subcats = get_terms( 'department', $args );

foreach( $subcats as $category ) {
    echo $category->name;
}

Ответ или решение

Проблема с использованием get_terms и параметра child_of

При работе с пользовательскими таксономиями в WordPress может возникать ряд проблем, особенно когда речь идет о получении терминов с помощью функции get_terms(). Ваша ситуация, когда запрос на получение подкатегорий с использованием параметра child_of не возвращает ожидаемых результатов, является распространенной. Рассмотрим, как правильно использовать данный функционал и какие шаги предпринять для устранения возможных причин неполадок.

Объяснение параметров

get_terms() — это функция, используемая для извлечения терминов из таксономии. Параметры child_of и parent в этом контексте часто вызывают путаницу.

  • child_of следует использовать, если вы хотите получить все подкатегории конкретного термина, включая их подкатегории на любом уровне.
  • parent ограничивает запрос только непосредственными дочерними терминами для заданного родителя.

Ваш код с child_of работает неправильно, потому что в базе данных может присутствовать кэш, который мешает правильной выборке данных. Решение проблемы может быть достигнуто несколькими способами.

Кеширование в WordPress

В WordPress результаты запросов к таксономиям могут кэшироваться для оптимизации производительности. Это значит, что при внесении изменений в иерархию терминов, изменения не сразу отображаются. Чтобы убедиться, что кэш очищен:

  1. Используйте функцию clean_taxonomy_cache():

    clean_taxonomy_cache('department');

    Это наиболее безопасный и предпочтительный способ очистки кэша для конкретной таксономии.

  2. Если у вас есть доступ к WP CLI, вы можете выполнить команду:

    wp cache flush

    Это также эффективно очистит кэш всего сайта.

  3. Удаление опции из базы данных:
    Хотя это менее предпочтительный вариант, вы также можете удалить опцию из таблицы wp_options:

    DELETE FROM `wp_options` WHERE `option_name` = 'department_children';
  4. Создание или удаление терминов: Иногда простое добавление или удаление термина может заставить WordPress обновить кэш.

Альтернативные подходы

Если после всех манипуляций проблема остается, воспользуйтесь параметром parent. Это позволит ограничить результаты только непосредственными подкатегориями:

$args = array('parent' => 483, 'hide_empty' => false);
$subcats = get_terms('department', $args);

foreach ($subcats as $category) {
    echo $category->name;
}

В этом коде вы используете parent, который возвращает только непосредственные дочерние термины к термину с ID 483.

Итог

Если get_terms() не работает с параметром child_of, скорее всего, проблема заключается в кэшировании данных. Используйте предложенные методы очистки кэша и альтернативные параметры для получения ожидаемого результата. Правильное управление кэшем имеет ключевое значение для эффективного использования пользовательских таксономий в WordPress.

Оцените материал
Добавить комментарий

Капча загружается...