Использование хука pre_get_posts для фильтрации записей WordPress по датам

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

Что такое хук pre_get_posts и зачем он нужен для фильтрации по датам

Хук pre_get_posts позволяет изменить параметры основного запроса WordPress до его выполнения. Это даёт возможность подстроить выборку записей под конкретные условия, например, вывести только записи с определённой датой публикации.

Использование этого хука предпочтительнее, чем глобальная модификация запроса через query_posts(), так как он не ломает пагинацию и работает более эффективно.

Вот основные причины использовать pre_get_posts для фильтрации по датам:

  • Гибкость в изменении параметров запроса.
  • Возможность фильтровать записи без создания кастомных SQL-запросов.
  • Поддержка стандартных функций WordPress, включая пагинацию и кеширование.

Как фильтровать записи по конкретному периоду: пример кода

Рассмотрим пример, где мы хотим вывести записи, опубликованные в марте 2024 года на главной странице блога.

add_action('pre_get_posts', 'wplessons_filter_posts_by_date');
function wplessons_filter_posts_by_date($query) {
    if (!is_admin() && $query->is_main_query() && is_home()) {
        $query->set('date_query', array(
            array(
                'year'  => 2024,
                'month' => 3,
            ),
        ));
    }
}

Здесь мы проверяем, что:

  • Запрос не из административной панели !is_admin()
  • Это основной запрос $query->is_main_query()
  • И мы на главной странице блога is_home()

Далее задаём параметр date_query с указанием года и месяца. WordPress автоматически сформирует SQL-запрос с нужным диапазоном дат.

Расширенный фильтр по диапазону дат

Если нужно вывести записи за произвольный период, например с 1 по 15 марта 2024 года, можно использовать массивы after и before:

add_action('pre_get_posts', 'wplessons_filter_posts_custom_range');
function wplessons_filter_posts_custom_range($query) {
    if (!is_admin() && $query->is_main_query() && is_home()) {
        $query->set('date_query', array(
            array(
                'after'     => '2024-03-01',
                'before'    => '2024-03-15',
                'inclusive' => true,
            ),
        ));
    }
}

Параметр inclusive позволяет включить в выборку границы периода.

Фильтрация записей по дате с пользовательским параметром URL

Часто нужно делать фильтрацию по дате динамически, например, по GET-параметрам в URL (?year=2024&month=3). Рассмотрим, как это реализовать:

add_action('pre_get_posts', 'wplessons_filter_posts_by_url');
function wplessons_filter_posts_by_url($query) {
    if (!is_admin() && $query->is_main_query() && is_home()) {
        $year = get_query_var('year') ?: (isset($_GET['year']) ? intval($_GET['year']) : 0);
        $month = get_query_var('monthnum') ?: (isset($_GET['monthnum']) ? intval($_GET['monthnum']) : 0);

        if ($year && $month) {
            $query->set('date_query', array(
                array(
                    'year'  => $year,
                    'month' => $month,
                ),
            ));
        } elseif ($year) {
            $query->set('date_query', array(
                array('year' => $year),
            ));
        }
    }
}

Этот код позволяет пользователям фильтровать записи по году и месяцу, просто добавляя параметры в адресную строку.

Как сделать красивый URL для фильтрации по дате

Чтобы URL выглядел как /archive/2024/03/, можно зарегистрировать дополнительные rewrite правила и параметры запроса, но это выходит за рамки данной статьи. Для простых проектов подойдёт вариант с GET-параметрами.

Оптимизация и потенциальные ошибки при фильтрации по дате

При использовании date_query важно помнить:

  • Не используйте pre_get_posts для изменения запросов в админке без крайней необходимости, это может привести к неожиданным результатам.
  • Проверяйте, что фильтрация применяется только там, где нужно, чтобы не ломать другие запросы.
  • Если в запросе используется сложный date_query с несколькими условиями, проверьте правильность логики объединения условий — параметры relation (AND/OR) могут быть полезны.

Плагины для расширенной фильтрации по датам и дополнения к pre_get_posts

Если нужно более удобное управление фильтрацией по датам и другим параметрам без написания кода, можно использовать плагины:

  • Clearfy Pro — оптимизация запросов и расширенные настройки фильтров.
  • ABC Pagination — улучшенная пагинация при сложных запросах.

Эти инструменты помогут сделать фильтрацию более удобной и производительной, особенно на больших сайтах с большим количеством записей.

Пример интеграции с Clearfy Pro для оптимизации date_query

Clearfy Pro позволяет оптимизировать запросы, чтобы date_query не нагружал базу данных. В сочетании с кастомным кодом на pre_get_posts можно добиться максимальной производительности.

Подключение Clearfy Pro не требует дополнительного кода — плагин автоматически оптимизирует запросы.

Выводы и рекомендации по использованию pre_get_posts для фильтрации по датам

Использование хука pre_get_posts — это мощный и гибкий способ управлять выборкой записей по дате. Главное — внимательно контролировать условия, чтобы не нарушить работу других частей сайта.

Для начинающих рекомендую тестировать фильтры на локальном сервере и использовать логи запросов для отладки.

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

Как использовать хуки для автоматического изменения статусов заказов WooCommerce
27.04.2026
Как изменить URL авторских связей в WordPress без плагинов
11.12.2025
Как отключить Gutenberg и вернуть классический редактор WordPress
09.02.2026
Как автоматически удалить товар из заказов WooCommerce после отмены или возврата
18.04.2026
Как сделать автоматический импорт постов в WordPress из внешнего источника
25.03.2026