Диагностика проблемы: почему нужно исключать товары и варианты из поиска и категорий
В интернет-магазинах на WooCommerce часто возникает задача скрыть определённые товары или их вариации из результатов поиска и списков категорий, не удаляя их из каталога. Например, товары с нулевым остатком, устаревшие коллекции или товары с ограниченным доступом. Без правильной настройки такие позиции продолжают показываться, что ухудшает пользовательский опыт и может привести к снижению конверсии.
Для проверки, какие товары отображаются в поиске и категориях, откройте фронтенд сайта и выполните поиск по ключевому слову или перейдите в нужную категорию. Если вы видите товары, которые должны быть скрыты, значит задача актуальна.
Пошаговое решение: исключение товаров и вариантов из поиска и категорий
1. Исключение товаров по атрибуту или метаполю через фильтр запроса
В WooCommerce вывод товаров в списках и поиске управляется WP_Query с параметром post_type=product. Чтобы исключить товары по заданному условию, можно использовать хук pre_get_posts и добавить условие исключения.
Пример: исключаем товары, у которых метаполе _hide_from_search установлено в yes.
add_action('pre_get_posts', 'exclude_products_from_search_and_cat');
function exclude_products_from_search_and_cat($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
if ($query->is_search() || is_product_category() || is_shop()) {
$meta_query = $query->get('meta_query');
if (!is_array($meta_query)) {
$meta_query = [];
}
$meta_query[] = [
'key' => '_hide_from_search',
'value' => 'yes',
'compare' => '!='
];
$query->set('meta_query', $meta_query);
}
}Чтобы использовать этот метод, в админке или через импорт нужно выставить у товара метаполе _hide_from_search со значением yes для скрытия.
2. Исключение вариантов товаров (variations) из отображения
Варианты товаров — отдельные записи типа product_variation, которые по умолчанию не отображаются в списках, но если у вас настроена кастомная логика или плагин, показывающий их, можно исключить их в том же фильтре:
add_action('pre_get_posts', 'exclude_variations_from_shop');
function exclude_variations_from_shop($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
if ($query->is_search() || is_product_category() || is_shop()) {
$post_type = $query->get('post_type');
if (empty($post_type)) {
$post_type = ['product'];
}
if (is_array($post_type)) {
$post_type = array_diff($post_type, ['product_variation']);
$query->set('post_type', $post_type);
} elseif ($post_type === 'product_variation') {
$query->set('post_type', 'product');
}
}
}Проверка результата после внедрения
Чтобы проверить, что скрытие работает:
- Откройте страницу поиска с ключевым словом, по которому ранее показывались скрытые товары.
- Перейдите в категории, где были эти товары.
- Убедитесь, что товары с метаполем
_hide_from_search = yesне отображаются. - Если вы скрывали вариации, проверьте, что они не выводятся в списках и поиске.
Для дополнительной проверки можно выполнить WP_Query вручную в консоли или через плагин Debug Bar, убедившись, что запрос не возвращает скрытые товары.
Частые ошибки и как их исправить
- Не работает условие фильтрации: проверьте, что хук
pre_get_postsподключён правильно и что условиеis_main_query()не блокирует ваш код. - Метаполе не установлено или неверно задано: убедитесь, что метаполе
_hide_from_searchдействительно есть у товаров и имеет значениеyes(строчное). - Кэширование: если используется кэш (например, плагин кэширования или серверный), очистите кэш после внесения изменений.
- Плагины с кастомным выводом товаров: некоторые плагины могут игнорировать стандартный WP_Query. В этом случае нужно изучать их API или отключать отображение вариантов в настройках.
Практические советы по производительности
- Используйте
meta_queryс минимальным количеством условий, так как запросы по метаполям влияют на скорость. - Индексация метаполей в базе данных значительно ускорит фильтрацию. Рассмотрите индексацию, если у вас большой каталог.
- Если скрывать нужно много товаров, лучше использовать таксономию или статус публикации, а не метаполя, чтобы оптимизировать запросы.
Сравнение способов исключения товаров из поиска и категорий
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Фильтр pre_get_posts с метаполем |
Гибкий, не требует плагинов, точечное управление | Нагрузка на БД при большом количестве товаров, требует правильного задания метаполей | Использовать для небольших и средних магазинов |
| Использование статуса публикации (например, черновик) | Простота реализации, быстрый фильтр | Товар не будет доступен в каталоге и для заказов | Когда нужно полностью скрыть товар |
| Плагины с управлением видимостью товаров | Удобный UI, дополнительные функции | Дополнительная нагрузка, возможные конфликты | Для магазинов с большим количеством условий и пользователей |