Диагностика проблемы: зачем исключать товар из поиска и каталога
В WooCommerce часто возникает задача временно скрыть товар из каталога и поиска, но при этом не удалять его из базы, чтобы сохранить все данные и отзывы. Например, товар временно отсутствует на складе или идет подготовка к новой версии. Стандартных настроек в WooCommerce для этого нет, поэтому нужно реализовать кастомное решение.
Пошаговое решение: исключаем товар из поиска и каталога через код
1. Получение ID товара
Для исключения нужно знать ID товара. Его можно посмотреть в админке WooCommerce на странице Товары. Например, пусть ID товара — 123.
2. Добавление кода в functions.php или плагин
Добавим следующий код, который исключит товар с ID 123 из результатов поиска и каталога:
function exclude_product_from_shop_and_search( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
// Исключаем из каталога
if ( is_shop() || is_product_category() || is_product_tag() ) {
$query->set( 'post__not_in', array( 123 ) );
}
// Исключаем из поиска
if ( is_search() ) {
$query->set( 'post__not_in', array( 123 ) );
}
}
}
add_action( 'pre_get_posts', 'exclude_product_from_shop_and_search' );Этот код проверяет, что мы не в админке, и основной запрос — магазин или поиск. Затем исключает указанный товар по ID.
3. Массовое исключение нескольких товаров
Если нужно исключить несколько товаров, замените array( 123 ) на массив с нужными ID, например:
$exclude_ids = array( 123, 456, 789 );
$query->set( 'post__not_in', $exclude_ids );Проверка результата после внедрения
- Перейдите на страницу магазина WooCommerce: товар с ID 123 должен отсутствовать в списке.
- Выполните поиск по названию исключенного товара — он не должен появляться в результатах.
- При переходе по прямой ссылке на товар страница должна открываться (товар не удален).
Частые ошибки и как их исправить
- Товар все еще отображается в виджетах или на других страницах: проверьте, что код добавлен в правильное место и нет конфликтов с другими плагинами, которые формируют запросы.
- Пустая страница магазина: если в
post__not_inпередается пустой массив, это может влиять на запрос. Добавляйте проверку, что массив не пуст:
if ( ! empty( $exclude_ids ) ) {
$query->set( 'post__not_in', $exclude_ids );
}- Код не работает настраиваемых страницах или с кэшированием: очистите кэш сайта и браузера. Если используете плагин кеширования, проверьте настройки исключений.
Альтернативные способы и их сравнение
| Метод | Плюсы | Минусы |
|---|---|---|
| Добавление кода в functions.php | Быстро, не требует плагинов, гибко | Требует навыков, легко сломать сайт неправильным кодом |
| Плагины для скрытия товаров (например, WooCommerce Catalog Visibility Options) | Простой интерфейс, дополнительные функции | Может замедлять сайт, требует обновления, не всегда бесплатны |
| Изменение статуса товара на "Скрытый" | Стандартный функционал WooCommerce | Не всегда полностью исключает из поиска и каталога, зависит от темы |
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или собственный плагин, чтобы не потерять изменения при обновлении.
- Избегайте тяжелых запросов в
pre_get_posts, старайтесь минимизировать количество исключаемых товаров. - Тестируйте изменения на тестовом сайте, чтобы избежать сбоев на боевом.
- Если используете кэширование, добавьте исключения для страниц с изменениями.