Диагностика задачи: зачем исключать товары из поиска WooCommerce?
В стандартном поиске WooCommerce выводятся все товары, которые опубликованы. Однако, бывают ситуации, когда нужно скрыть определённые товары из результатов поиска, например, товары, находящиеся в черновиках, товары с определённой меткой, или товары для внутреннего использования. Без корректной фильтрации такие товары могут мешать клиентам, снижать релевантность и приводить к ошибкам.
Проверка текущего поведения поиска
Для начала убедитесь, что поиск WooCommerce действительно выдает товары, которые вы хотите исключить:
- Выполните поиск по ключевому слову, связанному с товаром, который хотите скрыть.
- Проверьте, отображается ли товар в результатах.
- Обратите внимание на атрибуты и таксономии этого товара (статус, категория, тег, мета-поля).
Если товар отображается, значит требуется вмешательство в запрос.
Пошаговое решение: исключаем товары из поиска с помощью фильтра pre_get_posts
Самый надёжный способ — использовать хук pre_get_posts для изменения параметров основного запроса WordPress на страницах поиска.
Пример кода для исключения товаров с определённым ID или мета-полем:
function exclude_products_from_search( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
// Ограничиваем поисковый запрос только товарами WooCommerce
$post_type = $query->get('post_type');
if ( empty( $post_type ) || $post_type === 'product' || ( is_array( $post_type ) && in_array( 'product', $post_type ) ) ) {
// Пример: исключить товары с ID 123 и 456
$excluded_ids = array( 123, 456 );
$query->set( 'post__not_in', $excluded_ids );
// Или исключить по мета-ключу '_exclude_from_search' = 'yes'
$meta_query = array(
array(
'key' => '_exclude_from_search',
'value' => 'yes',
'compare' => '!='
),
);
$query->set( 'meta_query', $meta_query );
}
}
}
add_action( 'pre_get_posts', 'exclude_products_from_search' );Обратите внимание, что в этом примере мы комбинируем исключение по ID и мета-полю. Вы можете использовать один из вариантов или оба.
Как добавить мета-поле к товару для управления исключением
Чтобы управлять исключением через админку, добавьте пользовательское поле _exclude_from_search со значением yes к нужным товарам. Можно сделать вручную через кастомные поля или использовать Advanced Custom Fields.
Проверка результата после внедрения
После добавления кода в functions.php или в кастомный плагин:
- Очистите кэш сайта и браузера.
- Откройте фронтенд и выполните поиск по ключевым словам, связанным с исключёнными товарами.
- Убедитесь, что товары не отображаются в результатах.
- Проверьте, что остальные товары видны как обычно.
Частые ошибки и как их исправить
- Код не работает — товары не исключаются: Проверьте, что код добавлен в правильный файл и что он не конфликтует с другими плагинами или темой. Убедитесь, что условие
is_search()срабатывает именно на странице поиска. - Исключение не срабатывает на пользовательских поисках или AJAX: В таких случаях дополнительно нужно фильтровать запросы в AJAX-хендлерах или кастомных шаблонах.
- Неправильное использование
post__not_inвместе с другими параметрами запроса: Если в запросе уже естьpost__inилиmeta_query, объединяйте их аккуратно, чтобы избежать конфликтов. - Проблемы с производительностью при большом количестве исключений: Используйте мета-поля вместо списка ID, чтобы не перегружать запрос.
Практические советы по производительности и безопасности
- Используйте индексированные мета-поля для фильтрации, чтобы не замедлять запросы.
- При большом количестве товаров лучше избегать
post__not_inс длинными списками ID — используйте таксономии или мета-поля. - Регулярно проверяйте, не конфликтует ли ваш код с обновлениями WooCommerce и WordPress.
- Для удобства администрирования создайте пользовательский UI (через ACF или кастомные мета-боксы) для установки мета-поля
_exclude_from_search.
Сравнение методов исключения товаров из поиска WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
Исключение по ID через post__not_in | Просто реализуется, быстро работает при небольшом количестве ID | Плохо масштабируется, неудобно поддерживать длинные списки |
Исключение по мета-полю в meta_query | Гибкость, легко управлять через админку, масштабируемость | Может замедлять запросы без индексации мета-полей |
| Исключение через таксономии (категории, теги) | Удобно группировать, легко изменять | Требует дополнительной настройки таксономий |