Диагностика задачи: зачем исключать товары из поиска и категорий
В WooCommerce иногда возникает необходимость скрыть отдельные товары из результатов поиска и списков категорий, но при этом оставить их доступными по прямой ссылке. Это может быть полезно для товаров, которые временно не продаются, эксклюзивных предложений или товаров под заказ. Стандартными средствами WooCommerce такой функционал не реализован, поэтому требуется вмешательство через код.
Как WooCommerce формирует выборки товаров для поиска и категорий
WooCommerce использует стандартный WP_Query и таксономию product_cat для вывода товаров по категориям, а для поиска – тип записи product с фильтрацией по названию, описанию и другим параметрам. Чтобы исключить товары из этих выборок, можно повлиять на запросы через хук pre_get_posts.
Пошаговое решение: исключение товаров из поиска и категорий
- Определите ID товаров, которые нужно скрыть. Это можно сделать вручную или динамически (например, меткой «скрыть»).
- Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
function wpma_exclude_products_from_search_and_cats( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
// ID товаров для исключения
$exclude_ids = array( 123, 456 ); // замените на нужные ID
// Исключаем из поиска по товарам
if ( $query->is_search() && $query->get('post_type') === 'product' ) {
$query->set('post__not_in', $exclude_ids);
}
// Исключаем из архивов категорий товаров
if ( is_tax('product_cat') ) {
$post__not_in = $query->get('post__not_in');
if ( ! is_array( $post__not_in ) ) {
$post__not_in = array();
}
$post__not_in = array_merge( $post__not_in, $exclude_ids );
$query->set('post__not_in', $post__not_in);
}
}
add_action( 'pre_get_posts', 'wpma_exclude_products_from_search_and_cats' );- Очистите кэш сайта (если используется) и обновите пермалинки (в админке «Настройки» → «Постоянные ссылки» без изменений → «Сохранить изменения»).
Проверка результата после внедрения
- Выполните поиск по сайту по названию одного из скрытых товаров – он не должен появляться в результатах.
- Перейдите на страницу категории, где был товар – товар не должен отображаться в списке.
- Перейдите по прямой ссылке на скрытый товар – страница должна открываться без ошибок.
Частые ошибки и как их исправить
- Товары не скрываются: проверьте, действительно ли указан правильный ID товара. Для проверки используйте
var_dump($exclude_ids)или выведите ID черезerror_log(). - Появляется ошибка 404 на странице товара: возможно, товар отключён или удалён. Убедитесь, что статус товара установлен как «Опубликовано».
- Исключение не работает в админке: код исключает только фронтенд-запросы. Это нормальное поведение.
- Нарушается пагинация: если вы меняете параметры запроса, убедитесь, что пагинация корректно обрабатывается. Обычно данный код пагинацию не ломает.
Практические советы по производительности и безопасности
- Храните список ID товаров для исключения в отдельной опции или transient, если он большой и формируется динамически, чтобы не нагружать каждый запрос.
- Если необходимо часто менять список исключённых товаров, реализуйте административный интерфейс для удобства управления.
- Избегайте отключения товаров через статус «Черновик» для этих целей, чтобы сохранить возможность прямого доступа.
- В случае большого каталога рассмотрите вариант исключения через SQL-запросы с фильтрацией, но будьте осторожны с производительностью.
Сравнение вариантов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук pre_get_posts | Фильтрация WP_Query во фронтенде | Гибкий, без плагинов, легко корректируется | Требуется код, может быть сложным для новичков |
| Плагин скрытия товаров | Использование сторонних плагинов | Простота установки, интерфейс | Зависимость от стороннего кода, нагрузка |
| Изменение статуса товара | Установка статуса как «Черновик» или «В архиве» | Простое решение | Товар недоступен по прямой ссылке |