В этой статье мы подробно рассмотрим, как с помощью хука 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 и помогают создавать продвинутые решения.