Вопрос или проблема
Когда я использую get_categories()
в файле archive.php, имея hide_empty активированным (true|1), а затем передаю значение года в файл, аргумент hide_empty теряет свой эффект. Категории, в которых нет записей за выбранный год, все равно отображаются.
Как скрыть категории, если в них нет записей, связанных с выбранным годом?
Редактирование: Мой код:
<?php
if (!empty($_GET['m']))
{
?>
<h2><?php echo _e('Категории'); ?></h2>
<ul>
<?php
foreach(get_categories('parent=0&hide_empty=1') as $category)
{
$my_query = new WP_Query('cat=".$category->term_id."&year=".$_GET["m"].'&posts_per_page=-1');
$count = $my_query->post_count;
?>
<li><a class="name" href="https://wordpress.stackexchange.com/questions/237988/?cat=<?=$category->term_id?>&year=<?=$_GET["m"]?>"><?=$category->name?> (<?=$count?>)</a></li>
<?php
$cats = get_categories('parent=".$category->term_id."&year=".$_GET["m"].'&hide_empty=1');
if (count($cats))
{
?>
<ul>
<?php
foreach($cats as $category)
{
$my_query = new WP_Query('cat=".$category->term_id."&year=".$_GET["m"].'&posts_per_page=-1');
$count = $my_query->post_count;
?>
<li><a class="name" href="https://wordpress.stackexchange.com/questions/237988/?cat=<?=$category->term_id?>&year=<?=$_GET["m"]?>"><?=$category->name?> (<?=$count?>)</a></li>
<?php
}
?>
</ul>
<?php
}
}
?>
</ul>
<?php
}
?>
Почему бы не добавить условие if, чтобы проверить, больше ли $count > 0, прежде чем выводить ваш <li> на строке 13:
<?php if($count > 0): ?>
<li><a class="name" href="https://wordpress.stackexchange.com/questions/237988/?cat=<?=$category->term_id?>&year=<?=$_GET["m"]?>"><?=$category->name?> (<?=$count?>)</a></li>
<?php endif; ?>
Ответ или решение
Чтобы в archive.php
правильно использовать аргумент hide_empty
функции get_categories()
, учитывая глобальную переменную года, необходимо внести изменения в основной код с целью исключения категорий, которые не содержат посты за заданный год. Ниже приведены шаги, включая оценку вашего кода и соответствующие исправления.
1. Проблема
В вашем коде аргумент hide_empty
не влияет на отображение категорий, поскольку количество постов считается по отдельным запросам для каждой категории. Это приводит к ситуации, когда категория отображается даже при отсутствии постов за указанный год.
2. Шаги по решению проблемы
Ниже представлены шаги, которые помогут вам корректно скрыть пустые категории:
Изменение основного запроса
Как вы уже заметили, правильным решением будет использование условия для проверки числа постов ($count). Это можно сделать с помощью оператора if
перед выводом HTML-кода для категорий.
Пример исправленного кода
Внесите следующие изменения в ваш код:
<?php if (!empty($_GET['m'])): ?>
<h2><?php echo __('Categories'); ?></h2>
<ul>
<?php
foreach (get_categories('parent=0&hide_empty=1') as $category) {
// Выполним запрос к WP для получения постов в выбранной категории за указанный год
$my_query = new WP_Query(array(
'cat' => $category->term_id,
'year' => $_GET["m"],
'posts_per_page' => -1
));
$count = $my_query->post_count;
// Проверяем, есть ли посты за указанный год, прежде чем выводить категорию
if ($count > 0): ?>
<li>
<a class="name" href="https://wordpress.stackexchange.com/questions/237988/?cat=<?= $category->term_id ?>&year=<?= $_GET["m"] ?>">
<?= $category->name ?> (<?= $count ?>)
</a>
</li>
<?php endif;
// Вложенные категории
$cats = get_categories(array(
'parent' => $category->term_id,
'hide_empty' => 1
));
if (count($cats) > 0): ?>
<ul>
<?php foreach ($cats as $subcategory) {
$my_query_sub = new WP_Query(array(
'cat' => $subcategory->term_id,
'year' => $_GET["m"],
'posts_per_page' => -1
));
$count_sub = $my_query_sub->post_count;
// Проверяем наличие постов перед выводом подкатегорий
if ($count_sub > 0): ?>
<li>
<a class="name" href="https://wordpress.stackexchange.com/questions/237988/?cat=<?= $subcategory->term_id ?>&year=<?= $_GET["m"] ?>">
<?= $subcategory->name ?> (<?= $count_sub ?>)
</a>
</li>
<?php endif; ?>
<?php } ?>
</ul>
<?php endif;
} ?>
</ul>
<?php endif; ?>
3. Объяснение изменений
- Изменение запроса: Я изменил способ создания
$my_query
и$my_query_sub
, используя массив вместо строки, что улучшает читаемость кода и помогает избежать ошибок. - Проверка количества постов: Код проверки
$count
и$count_sub
позволяет выводить категории только в случае наличия постов за указанный год. - Использование
__()
: Вместоecho _e()
, использование__()
и вывод результата с помощьюecho
более логично для локализации строки.
Заключение
Эти изменения позволят корректно скрывать категории без постов за выбранный год. Применив предложенный подход, вы улучшите usability своей страницы архива, представляя список категорий, в которых действительно есть контент, что положительно скажется на взаимодействии пользователей с вашим сайтом.