Вопрос или проблема
У меня есть иерархическое дерево категорий, что означает до 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');
}
}
Заключение
Следуя этому подходу, вы сможете настроить свой шаблон таким образом, чтобы выводить только те посты, которые относятся к последней подкатегории в вашей иерархии категорий. Как только вы выполните все вышеописанные шаги, ваша категория будет вести себя в соответствии с вашим запросом, а пользователи смогут видеть только актуальные посты или подкатегории в зависимости от их выбора.