Почему стандартный архив WooCommerce не всегда подходит для кастомных категорий
WooCommerce по умолчанию выводит товары в категориях с пагинацией и стандартным набором параметров запроса. Однако, часто возникает задача изменить логику выборки товаров для конкретных категорий: например, исключить определённые товары, изменить порядок сортировки или вывести товары из нескольких категорий одновременно. Для этого используется хук pre_get_posts, который позволяет вмешиваться в основной запрос WordPress до его выполнения.
Диагностика проблемы: когда нужно менять запрос для категорий WooCommerce
Проверьте, подходит ли стандартный вывод категорий WooCommerce для вашего проекта. Если необходимо:
- Вывести товары из нескольких категорий на одной странице
- Исключить конкретные товары из категории
- Изменить порядок сортировки товаров (например, по метаполю)
- Добавить фильтрацию товаров по дополнительным параметрам
— значит, стандартный шаблон не справляется, и нужно использовать pre_get_posts.
Пошаговое решение: как правильно использовать pre_get_posts для категорий WooCommerce
1. Добавляем функцию в файл functions.php вашей темы или в кастомный плагин
add_action('pre_get_posts', 'custom_woocommerce_category_query');
function custom_woocommerce_category_query($query) {
// Проверяем, что это главный запрос и фронтенд
if (is_admin() || !$query->is_main_query()) {
return;
}
// Проверяем, что это архив категории товаров WooCommerce
if (is_tax('product_cat')) {
// Получаем текущий объект термина
$term = get_queried_object();
// Пример: если категория с слагом 'sale', изменяем запрос
if ($term && $term->slug === 'sale') {
// Исключаем товар с ID 123
$query->set('post__not_in', array(123));
// Меняем порядок сортировки по кастомному метаполю '_custom_price'
$query->set('meta_key', '_custom_price');
$query->set('orderby', 'meta_value_num');
$query->set('order', 'ASC');
}
// Пример: выводим товары из нескольких категорий
if ($term && $term->slug === 'featured') {
$tax_query = array(
'relation' => 'OR',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('featured', 'new-arrivals'),
),
);
$query->set('tax_query', $tax_query);
}
}
}2. Сохраняем изменения и проверяем вывод на фронтенде
Зайдите на страницу категории с слагом sale или featured и убедитесь, что товары отображаются согласно новым условиям.
Проверка результата после внедрения
- Откройте страницу категории товаров, где вы изменяли запрос.
- Проверьте, что товары отсортированы по нужному метаполю (
_custom_price) и исключён товар с ID 123. - Для категории
featuredубедитесь, что выводятся товары из двух категорий одновременно. - Если вы используете кэш, очистите его, чтобы увидеть изменения.
Частые ошибки и как их исправить
- Ошибка: Изменения не применяются — возможно, не главный запрос.
Решение: Проверьте условие$query->is_main_query()и используйте его обязательно. - Ошибка: Неправильное таксономическое имя.
Решение: Для категорий WooCommerce используйтеproduct_cat, а неcategory. - Ошибка: Конфликт с другими плагинами, которые тоже меняют запрос.
Решение: Попробуйте увеличить приоритет хука (например,add_action('pre_get_posts', 'func', 20)) или отладить последовательность. - Ошибка: Некорректный синтаксис массива
tax_query.
Решение: Внимательно проверьте структуру массива и параметры.
Практические советы по безопасности и производительности
- Избегайте сложных запросов с большим количеством
meta_query, так как они могут сильно замедлить сайт. - Используйте правильные индексы в базе данных для метаполей, если сортируете по ним.
- Очистите кэш WooCommerce и серверный кэш после внесения изменений.
- Тестируйте изменения на тестовом сайте, чтобы исключить сбои на рабочем ресурсе.
Сравнение вариантов изменения запроса WooCommerce категорий
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| pre_get_posts | Полный контроль над запросом, без плагинов | Требует понимания WP_Query и может вызвать конфликты | Кастомизация запросов, фильтрация, сортировка |
| Плагины фильтрации WooCommerce | Простота установки, готовые интерфейсы | Могут замедлять сайт, меньше гибкости | Если нужен быстрый функционал без кода |
| Кастомные шаблоны архивов | Гибкость вывода и дизайна | Требует поддержки при обновлениях, не меняет запрос | Если нужна кастомизация внешнего вида |