Проверка наличия дочерних категорий у текущей категории
Мне нужно определить, имеет ли текущая страница архива пользовательской таксономии дочерние категории. У меня ситуация, где есть много пользовательских категорий с дочерними элементами, и сайт должен показывать записи только в конце иерархии. В противном случае он должен показывать ссылку на категорию следующего уровня. Я нашел этот фрагмент кода, но он, похоже, не работает для пользовательских таксономий.
function category_has_children() {
global $wpdb;
$term = get_queried_object();
$category_children_check = $wpdb->get_results(" SELECT * FROM wp_term_taxonomy WHERE parent = '$term->term_id' ");
if ($category_children_check) {
return true;
} else {
return false;
}
}
<?php
if (!category_has_children()) {
// используйте любой цикл или часть шаблона здесь, чтобы показать записи в конце иерархии
get_template_part('loop', 'index');
}
else {
// здесь показываем индексную страницу категории
}
?>

Возможно, существует более оптимальный способ, но я бы сделал так:
$term = get_queried_object();
$children = get_terms( $term->taxonomy, array(
'parent' => $term->term_id,
'hide_empty' => false
) );
// print_r($children); // раскомментируйте для отладки
if($children) { // get_terms вернет false, если таксономия не существует или термин не найден.
// у термина есть дочерние элементы
}
Если текущий термин таксономии имеет дочерние элементы, функция get_terms
вернет массив, в противном случае она вернет false
.
Протестировано и работает на моей локальной чистой установке с использованием плагина Custom Post Type UI для создания пользовательских типов записей.

Когда я раскомментировал print_r($children)..., он вывел массив. Как это можно преобразовать в if/else? Извините, я все еще очень новичок в php

Не обращайте внимания, я использовал это: if ($children) { echo 'Есть подчиненные элементы'; } else { echo 'Нет подчиненных элементов'; }

@user29489 Вы правы, я был недостаточно ясен в своем ответе. Отредактировал для будущих обращений.

Для тех, кому просто нужно узнать, есть ли дочерние элементы, и не требуется получать данные для дочерних терминов, я предлагаю добавить 'field' => 'count'
, чтобы просто подсчитать количество дочерних элементов.

Также в WordPress существует общий способ сделать это с помощью get_term_children.
<?php
$children = get_term_children($termId, $taxonomyName);
if( empty( $children ) ) {
// здесь можно выполнить какие-то действия
}

Предположим, вы хотите отфильтровать термины так, чтобы показывать только те, которые либо имеют дочерние элементы, либо нет. В этом случае можно использовать параметр childless
в функции get_terms()
.
$children = get_terms(
'taxonomy' => '$taxonomy_slug',
'hide_empty' => false,
'childless' => true
)
);
Этот код вернет массив терминов, у которых нет дочерних элементов.
