Проверьте, есть ли у текущей категории дети

11

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

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()) {
        //use whatever loop or template part here to show the posts at the end of the line
   get_template_part('loop', 'index'); 
       }   

    else {
       // show your category index page here
    }
?>
user29489
источник

Ответы:

10

Может быть или не быть лучший способ сделать это, но вот как я бы это сделал:

$term = get_queried_object();

$children = get_terms( $term->taxonomy, array(
'parent'    => $term->term_id,
'hide_empty' => false
) );
// print_r($children); // uncomment to examine for debugging
if($children) { // get_terms will return false if tax does not exist or term wasn't found.
    // term has children
}

Если текущий термин таксономии имеет дочерние элементы, get_termsфункция вернет массив, в противном случае он вернет false.

Протестировано и работает на моей локальной ванильной установке с плагином Custom Post Type UI, используемым для генерации CPT.

montrealist
источник
Когда я раскомментировал print_r ($ children) .... он вывел массив. Как это можно превратить в if / else? Извините, я все еще очень новичок в php
user29489
1
Не обращайте внимания, я использовал это: if ($ children) {echo 'Children Here'; } else {echo 'No Children'; }
user29489
@ user29489 Вы правы, я не был достаточно ясен в своем ответе. Отредактировано для дальнейшего использования.
Монреалист
1
Для тех, кому нужно просто знать, есть ли дети и не нужно получать данные по дочерним терминам, я предлагаю добавить 'field' => 'count'просто подсчитать количество детей.
JD
Это работает и с обычными категориями сообщений?
Пит
9

Есть также общая возможность WP сделать это через get_term_children .

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

if( empty( $children ) ) {
    //do something here
}
simonthesorcerer
источник
1

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

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

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

Фриц
источник