Проверьте, является ли текущий термин дочерним по отношению к другому термину
Я пытаюсь создать шаблон архива, который будет применяться только к подкатегориям определенного термина. Моя структура выглядит примерно так:
- События (основная таксономия)
- Торговая выставка
- Показать подкат 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
термину.
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
- если вы находитесь в архиве категорий, он вернет объект категории
- если вы находитесь в архиве автора, он вернет объект автора
- и т.д.
Все эти ответы настолько переполнены и чрезвычайно длинны. Я только что использовал это в 2 строках кода:
$term = get_queried_object();
$is_parent = $term->parent == 0 ? true : false;
По сути, это просто проверка, равен ли родитель 0, если да, то это родитель. Иначе это будет ребенок.
Очень просто.