Как использовать хук pre_get_posts для фильтрации товаров в WooCommerce

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

Что такое хук pre_get_posts и зачем он нужен для WooCommerce

Хук pre_get_posts вызывается перед выполнением основного SQL-запроса для выборки записей (постов, товаров и пр.). С его помощью можно изменить параметры запроса, например, добавить условия фильтрации, изменить порядок сортировки или ограничить выборку.

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

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

Пример: фильтрация товаров по цене с помощью pre_get_posts

Допустим, нам нужно вывести только товары с ценой от 1000 руб. и выше на главной странице магазина. Для этого мы изменим параметры запроса WooCommerce.

add_action('pre_get_posts', 'wptemy_filter_woocommerce_products_by_price');
function wptemy_filter_woocommerce_products_by_price($query) {
    // Проверяем, что это главный запрос и фронтенд
    if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_category())) {
        // Добавляем мета-запрос для фильтрации по цене
        $meta_query = $query->get('meta_query') ?: [];
        $meta_query[] = [
            'key' => '_price',
            'value' => 1000,
            'compare' => '>=',
            'type' => 'NUMERIC'
        ];
        $query->set('meta_query', $meta_query);
    }
}

В этом коде мы проверяем, что текущий запрос — это главная выборка товаров (страница магазина или категории). Затем добавляем мета-запрос, который фильтрует товары по метаполю _price, отвечающему за цену товара.

Фильтрация товаров по атрибутам и кастомным полям

Фильтрация по цене — только один вариант. Вы можете использовать pre_get_posts для фильтрации по любым параметрам: цвет, размер, бренд, наличие на складе и пр. В WooCommerce атрибуты товаров хранятся в таксономиях, а дополнительные данные — в метаполях.

Например, чтобы вывести товары с атрибутом "цвет" равным "красный" (slug категории атрибута pa_color), можно использовать так:

add_action('pre_get_posts', 'wptemy_filter_products_by_color');
function wptemy_filter_products_by_color($query) {
    if (!is_admin() && $query->is_main_query() && is_shop()) {
        $tax_query = $query->get('tax_query') ?: [];
        $tax_query[] = [
            'taxonomy' => 'pa_color',
            'field' => 'slug',
            'terms' => 'krasnyj',
            'operator' => 'IN'
        ];
        $query->set('tax_query', $tax_query);
    }
}

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

Советы по использованию pre_get_posts в WooCommerce

  • Всегда проверяйте контекст запроса: используйте проверки is_shop(), is_product_category(), is_main_query(), чтобы не сломать другие части сайта.
  • Аккуратно работайте с мета- и таксономическими запросами: объединяйте их с помощью массивов meta_query и tax_query, следите за правильным форматом.
  • Тестируйте производительность: сложные запросы могут замедлять сайт. Если фильтров много, рассмотрите использование специализированных плагинов или внешних решений.
  • Интеграция с плагинами: если вы используете плагины вроде Clearfy Pro, они могут помочь оптимизировать работу запросов и избежать конфликтов.

Пример комплексной фильтрации: цена, цвет и наличие

Объединим фильтрацию по цене, цвету и наличию товара на складе:

add_action('pre_get_posts', 'wptemy_complex_woocommerce_filter');
function wptemy_complex_woocommerce_filter($query) {
    if (!is_admin() && $query->is_main_query() && is_shop()) {
        // Фильтрация по цене
        $meta_query = $query->get('meta_query') ?: [];
        $meta_query[] = [
            'key' => '_price',
            'value' => 1000,
            'compare' => '>=',
            'type' => 'NUMERIC'
        ];
        // Фильтрация по наличию (в наличии)
        $meta_query[] = [
            'key' => '_stock_status',
            'value' => 'instock'
        ];
        $query->set('meta_query', $meta_query);

        // Фильтрация по цвету
        $tax_query = $query->get('tax_query') ?: [];
        $tax_query[] = [
            'taxonomy' => 'pa_color',
            'field' => 'slug',
            'terms' => 'krasnyj'
        ];
        $query->set('tax_query', $tax_query);
    }
}

Такой код позволяет вывести только красные товары с ценой выше 1000 рублей и имеющиеся в наличии.

Как отладить и проверить работу фильтров pre_get_posts

Иногда сложно понять, почему фильтрация не сработала. Вот несколько советов:

  • Временно добавляйте вывод параметров запроса, например через var_dump($query->query_vars).
  • Используйте плагин WPRemark для визуализации данных и проверки правильности запросов.
  • Проверяйте наличие конфликтов с другими плагинами, временно отключая их.
  • Чистите кэш сайта и браузера, если используете кеширующие плагины.

Вывод

Хук pre_get_posts — мощный инструмент для тонкой настройки вывода товаров в WooCommerce. С его помощью можно быстро и эффективно реализовать любые фильтры без лишних плагинов и нагромождения кода. Главное — внимательно проверять условия и тестировать изменения на разных страницах.

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

Как использовать хук pre_get_posts для фильтрации товаров в WooCommerce
21.01.2026
Как изменить URL адрес постов в WordPress без пересмотра ссылок
09.11.2025
Как использовать хуки WordPress для решения конфликтов плагинов
08.12.2025
Как использовать хуки для отрывных настроек в WordPress
05.01.2026
Как добавить собственные типы записей в WordPress с примерами кода
17.12.2025