Проверьте, является ли текущий термин дочерним по отношению к другому термину


Я пытаюсь создать шаблон архива, который будет применяться только к подкатегориям определенного термина. Моя структура выглядит примерно так:

  • События (основная таксономия)
    • Торговая выставка
      • Показать подкат 1
      • Показать подкат 2
    • Другие таксономии

Я хочу, чтобы Show subcat 1 и Show subcat 2 (и любые другие подкатегории) получили один и тот же шаблон архива. Это одна из моих попыток сделать это, которая определенно не работает. Вот код от моего functions.php.

    add_filter( 'template_include', 'kd_event_subcategory_archive' );

    function kd_event_subcategory_archive( $template ) {
        $term = get_queried_object()->term_id;
        if ( $term->parent == 'tradeshow' ) {
            $event_subcat = locate_template( 'taxonomy-tradeshow-subcategory.php' );

            return $event_subcat;
        }

        return $template;
    }

Кажется, я не могу понять, как правильно проверить, является ли термин дочерним по отношению к моему tradeshow термину.

Author: KreigD, 2018-03-23

2 answers

Есть две проблемы, которые помешали вашей проверке:

    $term = get_queried_object()->term_id;
    if ( $term->parent == 'tradeshow' ) {

Начиная с:

    $term = get_queried_object()->term_id;

Здесь $term содержит идентификатор термина, а не объекта термина. Предположим, что это термин номер 5, результат:

    $term = 5;
    if ( $term->parent == 'tradeshow' ) {

Что не сработает. $term - это число, а не объект, поэтому вы не можете сделать ->parent с ним.

Исправление состоит в том, чтобы просто использовать запрашиваемый объект напрямую:

    $term = get_queried_object();

Что приводит нас к следующей проблеме:

    if ( $term->parent == 'tradeshow' ) {

Родитель не является строкой, это идентификатор термина. 0 если родителя нет, то это идентификатор родительского термина, как показано, если мы посмотрим WP_Term:

/**
 * ID of a term's parent term.
 *
 * @since 4.4.0
 * @var int
 */
public $parent = 0;

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

Но в этом случае вы можете использовать функцию get_term_by, например,

$tradeshow = get_term_by('slug', 'tradeshow', 'events')

Затем с помощью:

$tradeshow->term_id === $term->parent

Проблемы и советы

Это дополнительные пункты, которые я хотел упомянуть, которые не связаны

Отладка

Использование var_dump, отладчика или какого-либо другого инструмента для просмотра содержимого $term выявило бы эти проблемы.

Кроме того, журналы ошибок PHP будут полны предупреждений и уведомлений, указывающих на оператор if за попытку выполнить эквивалент 5->parent, который не имеет смысла для PHP. Оплатить обратите внимание на журналы ошибок. Я бы рекомендовал использовать плагин query monitor как простой способ поймать неожиданные предупреждения

Запрашиваемый объект не всегда является термином

Этот код будет выполняться при каждой загрузке страницы:

add_filter( 'template_include', 'kd_event_subcategory_archive' );

function kd_event_subcategory_archive( $template ) {
    $term = get_queried_object()->term_id;
    if ( $term->parent == 'tradeshow' ) {

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

Это может быть даже отдельный пост, и если термин торговой выставки имеет идентификатор термина 5, и вы находитесь на публикации или странице с идентификатором 5, то вы получите сообщение, отображаемое в архиве таксономии.

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

Https://codex.wordpress.org/Function_Reference/get_queried_object

  • если вы находитесь на одном посте, он вернет объект post
  • если вы находитесь на странице, он вернет объект страницы
  • если вы на страница архива, она вернет объект типа post
  • если вы находитесь в архиве категорий, он вернет объект категории
  • если вы находитесь в архиве автора, он вернет объект автора
  • и т.д.
 7
Author: Tom J Nowell, 2018-03-23 00:50:59

Все эти ответы настолько переполнены и чрезвычайно длинны. Я только что использовал это в 2 строках кода:

$term = get_queried_object();
$is_parent = $term->parent == 0 ? true : false;

По сути, это просто проверка, равен ли родитель 0, если да, то это родитель. Иначе это будет ребенок.

Очень просто.

 5
Author: Jake, 2020-06-12 09:47:54