Как показать посты только для последней подкатегории?

Вопрос или проблема

У меня есть иерархическое дерево категорий, что означает до 3-4 подкатегорий с записями. При нажатии на ссылку категории на главной странице я перенаправляюсь на страницу категории.

Мне нужно проверить, нет ли подкатегорий для текущей категории, тогда показывать записи, НО если есть подкатегории, то показывать только названия и описания подкатегорий без каких-либо записей. Далее, если я нажимаю на название подкатегории, снова проверяю, есть ли дочерние категории для этой подкатегории. Если есть, показываю названия и описания; если нет, показываю записи, связанные с этой подкатегорией.

Что я сделал до сих пор (код добавлен на страницу категории):

Получить ID текущей категории:

   $CategoryPar = get_category( get_query_var( 'cat' ) ); 
   $cat_id = $CategoryPar->cat_ID;

Проверить, есть ли у текущей категории дочерние подкатегории и вывести их:

$args = array(
    'child_of'           => $cat_id,
    'title_li'           => __( ' ' ),
    'current_category'   => 0,
    'pad_counts'         => 0,
    'taxonomy'           => 'category'
);
wp_list_categories( $args );

Теперь я получаю список подкатегорий текущей категории, но мне все еще нужно предотвратить отображение записей в родительской категории, если у нее есть дочерние категории, поэтому я попытался обернуть цикл в условное выражение (также в category.php):

if ( category_has_children( $cat ) == false) :
    get_template_part( 'loop' ); 
endif;

а также в functions.php я добавил следующее:

function category_has_children( $term_id ) { 
    $children = get_term_children( $term_id, "category" );
    if ( is_array( $children ) ) {
        return $children;
    } else {
        return false;
    }
}

Во время публикации вопроса я увидел эту ссылку
Как показывать записи только в последней дочерней категории
и это помогло мне решить последнюю часть головоломки.

Теперь это можно сделать:)))

Ответ или решение

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

1. Получение ID текущей категории

Сначала вы должны получить ID текущей категории, в которой вы находитесь. Это можно сделать с помощью функции get_category().

$CategoryPar = get_category(get_query_var('cat'));
$cat_id = $CategoryPar->cat_ID;

2. Проверка наличия подкатегорий

Затем создайте функцию, которая проверяет, есть ли у текущей категории подкатегории. Вы уже сделали это, добавив функцию category_has_children() в functions.php:

function category_has_children($term_id) {
    $children = get_term_children($term_id, "category");
    return is_array($children) && !empty($children);
}

3. Отображение подкатегорий или постов

Теперь вам нужно будет использовать условие, чтобы определить, показывать ли подкатегории или посты. Если у текущей категории есть подкатегории, отобразите их, если нет — отображайте посты.

if (category_has_children($cat_id)) {
    // Отобразить подкатегории
    $args = array(
        'child_of'           => $cat_id,
        'title_li'           => __( ' ' ),
        'current_category'   => 0,
        'pad_counts'         => 0,
        'taxonomy'           => 'category'
    );
    echo '<div class="subcategories">';
    wp_list_categories($args);
    echo '</div>';
} else {
    // Отображение постов, если нет подкатегорий
    get_template_part('loop');
}

4. Обработка клика на подкатегорию

Теперь, если вы кликаете на подкатегорию, вам нужно будет повторить аналогичную логику для этой подкатегории. Создайте новую проверку, чтобы узнать, есть ли у неё подкатегории.

if (is_category()) {
    $current_cat = get_queried_object();
    if (category_has_children($current_cat->term_id)) {
        // Повторите вывод подкатегорий
        $args = array(
            'child_of' => $current_cat->term_id,
            'title_li' => __(' '),
            'taxonomy' => 'category'
        );
        echo '<div class="subcategories">';
        wp_list_categories($args);
        echo '</div>';
    } else {
        // Отображение постов текущей подкатегории
        get_template_part('loop');
    }
}

Заключение

Следуя этому подходу, вы сможете настроить свой шаблон таким образом, чтобы выводить только те посты, которые относятся к последней подкатегории в вашей иерархии категорий. Как только вы выполните все вышеописанные шаги, ваша категория будет вести себя в соответствии с вашим запросом, а пользователи смогут видеть только актуальные посты или подкатегории в зависимости от их выбора.

Оцените материал
Добавить комментарий

Капча загружается...