Проверка наличия дочерних категорий у текущей категории

28 мар. 2013 г., 18:47:32
Просмотры: 50K
Голосов: 12

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

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 {
        // здесь показываем индексную страницу категории
    }
?>
0
Все ответы на вопрос 4
5
16

Возможно, существует более оптимальный способ, но я бы сделал так:

$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 для создания пользовательских типов записей.

28 мар. 2013 г. 19:34:29
Комментарии

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

user29489 user29489
28 мар. 2013 г. 19:43:29

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

user29489 user29489
28 мар. 2013 г. 19:52:25

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

montrealist montrealist
28 мар. 2013 г. 20:02:15

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

J.D. J.D.
30 дек. 2013 г. 21:54:32

Работает ли это также с обычными категориями записей?

Pete Pete
19 нояб. 2018 г. 02:48:30
0
15

Также в WordPress существует общий способ сделать это с помощью get_term_children.

<?php
$children = get_term_children($termId, $taxonomyName);

if( empty( $children ) ) {
    // здесь можно выполнить какие-то действия
}
12 дек. 2013 г. 15:32:27
0

Предположим, вы хотите отфильтровать термины так, чтобы показывать только те, которые либо имеют дочерние элементы, либо нет. В этом случае можно использовать параметр childless в функции get_terms().

$children = get_terms( 
    'taxonomy' => '$taxonomy_slug',
    'hide_empty' => false,
    'childless' => true
  ) 
);

Этот код вернет массив терминов, у которых нет дочерних элементов.

20 мая 2016 г. 12:37:00
1
-2

Это, безусловно, самое чистое решение

$term = get_queried_object();
if($term->parent == 0 ){
  // выполнить действия;
}
26 февр. 2021 г. 12:51:27
Комментарии

Это неверно. $term->parent == 0 покажет вам, является ли категория дочерней, но не то, что она имеет дочерние элементы. Например, стандартная категория Без рубрики пройдет вашу проверку, но у нее нет дочерних элементов.

Mike Mike
11 сент. 2021 г. 23:59:57