Как использовать хук pre_get_posts для отображения категорий в WooCommerce

Почему стандартный архив 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Простота установки, готовые интерфейсыМогут замедлять сайт, меньше гибкостиЕсли нужен быстрый функционал без кода
Кастомные шаблоны архивовГибкость вывода и дизайнаТребует поддержки при обновлениях, не меняет запросЕсли нужна кастомизация внешнего вида
Как сделать отзывы с фотографиями в WordPress
11.04.2026
Как автоматизировать удаление ревизий записей в WordPress для оптимизации базы данных
29.01.2026
Как автоматически отключать неиспользуемые плагины в WordPress по расписанию
26.04.2026
Как разрешить доступ к файлам WordPress через .htaccess для конкретных IP
17.04.2026
Как установить ограничение на загрузку файлов в WordPress
02.02.2026