Как сделать так, чтобы аргумент ‘hide_empty’ функции get_categories() работал с глобальной переменной года в шаблоне архива?

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

Когда я использую 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 своей страницы архива, представляя список категорий, в которых действительно есть контент, что положительно скажется на взаимодействии пользователей с вашим сайтом.

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

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