Проверка наличия подкатегорий у текущей категории
Я нашел следующий фрагмент кода в теме WP Knowledge Base, который показывает подкатегории родительской категории. Проблема в том, что это работает только для первого уровня иерархии, поэтому я хотел изменить условие if, чтобы проверять, есть ли у текущей категории дочерние элементы, но не знаю как это сделать. Есть идеи? Спасибо
global $term_meta, $cat, $cat_id, $wp_query;
// Проверяем, не является ли текущая категория категорией первого уровня
// Это произойдет, если у текущей категории нет дочерних элементов
// В этом случае мы просто показываем все её записи
// Вместо красивого отображения базы знаний
if ( $cat->parent != '0' ) {

Для этого уже есть встроенная функция, нет необходимости создавать пользовательскую функцию. Функция называется get_term_children()
и возвращает:
Массив дочерних терминов, если указанный термин имеет дочерние элементы
Пустой массив, если дочерние термины не найдены
Объект
WP_Error
, если таксономия не существует
Исходя из этого, оберните get_term_children()
в функцию и возвращайте true или false в зависимости от возвращаемого значения, если вам нужно просто булево значение (например, для условного тега).
function has_term_have_children( $term_id = '', $taxonomy = 'category' )
{
// Проверяем, передан ли ID термина, если нет, возвращаем false
if ( !$term_id )
return false;
// Получаем дочерние термины
$term_children = get_term_children( filter_var( $term_id, FILTER_VALIDATE_INT ), filter_var( $taxonomy, FILTER_SANITIZE_STRING ) );
// Возвращаем false, если получен пустой массив или объект WP_Error
if ( empty( $term_children ) || is_wp_error( $term_children ) )
return false;
return true;
}
Теперь вы можете просто передать ID термина в функцию и, если таксономия отличается от category
, указать её название. Функция вернет булево значение, как и встроенные условные теги: true в случае успеха, если термин имеет дочерние элементы, и false, если нет.
if ( has_term_have_children( 21 ) ) {
// Выполнить что-то, если термин 21 имеет дочерние элементы
}

Вы также можете использовать if ( has_term_have_children( get_cat_ID() ) )
на странице категории

@AndrewLazarus верно, конкретный вариант использования зависит от вашей настройки и того, что именно вам нужно. К сожалению, когда я отвечаю на вопросы, я не могу охватить все аспекты и иногда упускаю одну-две вещи. Комментарии, подобные вашему, всегда очень ценятся и приветствуются ;-). Удачи

Вы можете использовать этот простой вызов функции, который возвращает либо TRUE
, либо FALSE
в зависимости от того, является ли массив $children
пустым или нет.
/**
* Проверяет, есть ли дочерние термины у указанного термина
*
* @param Integer $term_id ID термина
* @param String $taxonomy Таксономия
*
* @return Boolean
*/
function category_has_children( $term_id = 0, $taxonomy = 'category' ) {
$children = get_categories( array(
'child_of' => $term_id,
'taxonomy' => $taxonomy,
'hide_empty' => false,
'fields' => 'ids',
) );
return ( $children );
}
Если вы используете только встроенные категории записей (post
), вы можете вызвать функцию следующим образом: category_has_children( 17 );
Если вам нужно проверить пользовательскую таксономию, это работает почти так же, просто передайте дополнительный параметр 'название-таксономии': category_has_children( 7, 'my_taxonomy' );
Для использования в условном операторе IF:
if( $cat->parent != 0 && ! category_has_children( $cat->term_id ) )

get_term_children()
уже делает то, что нужно автору вопроса. Просто нужно создать булеву условную метку :-)

Заметка: параметр type
предназначен не для post_type
, а для определения, относится ли категория к встроенной таксономии category
или встроенной таксономии link_category
. Этот параметр использовался до введения пользовательских таксономий в версии 3.0. Параметр type
был заменен новым параметром taxonomy, который появился в версии 3.0. Текущий исходный код

Чтобы получить названия дочерних категорий. Я использовал функцию от @Howdy_McGee для более быстрого и итеративного процесса.
function category_has_children( $term_id = 0, $post_type = 'post', $taxonomy = 'category' ) {
$children = get_categories( array( 'child_of' => $term_id, 'type' => $post_type, 'taxonomy' => $taxonomy, 'order' => 'ASC', 'orderby' => 'name' ) );
if($children){
echo '<ul>';
foreach ($children as $value) {
echo '<li>';
echo '<a href="'.get_bloginfo("siteurl").'/category/'.$value->slug.'" >'.$value->name.'</a>';
echo '</li>';
}
echo '</ul>';
}
}
$cId = get_cat_id('cms'); /* cms - родительская категория */
category_has_children($cId, 'post', 'category');
Этот код выведет список всех подкатегорий (дочерних) для родительской категории.

В WordPress уже есть встроенная функция для этого: wp_list_categories()

Используйте эту функцию cat_has_subcat('вставьте id категории')
чтобы проверить, есть ли у категории подкатегории
//вставьте в файл functions.php
//начало
function cat_has_subcat($catId){
$args = array(
'taxonomy' => 'product_cat',
'orderby' => 'name',
'parent' => $catId,
'show_count' => 0,
'pad_counts' => 0,
'hierarchical' => 1,
'title_li' => '',
'hide_empty' => false
);
$cats = get_categories($args);
if(!empty($cats)){
return $catId;
}
}
//конец
