Диагностика: зачем исключать товар из каталога, но не удалять его
Иногда в WooCommerce возникает задача временно скрыть товар из каталога и поиска, чтобы он не отображался покупателям, но при этом сохранить все данные и возможность быстро вернуть товар в продажу. Простое удаление товара или перевод в черновик не всегда подходит — требуется именно исключение из видимости без потери информации и истории заказов.
Как понять, что товар исключён из каталога
- Витрина и страницы категории не показывают товар;
- Поиск по сайту не возвращает этот товар;
- Товар доступен по прямой ссылке (если нужно);
- Товар продолжает отображаться в админке WooCommerce;
- Заказы с этим товаром в истории сохраняются.
Пошаговое решение: код для исключения товара из каталога и поиска
Используем стандартный метаполе _visibility, но с современным подходом через фильтр woocommerce_product_is_visible и дополнительные проверки. Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpmax_exclude_product_from_catalog( $visible, $product_id ) {
// ID товара, который нужно исключить
$excluded_ids = array(123, 456); // замените на нужные ID
if ( in_array( $product_id, $excluded_ids ) ) {
return false; // товар не виден в каталоге и поиске
}
return $visible;
}
add_filter( 'woocommerce_product_is_visible', 'wpmax_exclude_product_from_catalog', 10, 2 );Для более гибкого управления можно использовать метаполе товара, например _exclude_from_catalog (значение 'yes'). Тогда проверка будет такой:
function wpmax_exclude_product_from_catalog_meta( $visible, $product_id ) {
$exclude = get_post_meta( $product_id, '_exclude_from_catalog', true );
if ( 'yes' === $exclude ) {
return false;
}
return $visible;
}
add_filter( 'woocommerce_product_is_visible', 'wpmax_exclude_product_from_catalog_meta', 10, 2 );Как добавить метаполе в админку продукта
Чтобы проще управлять исключением без прямого редактирования кода, добавим метаполе в редактор товара:
function wpmax_add_exclude_checkbox() {
woocommerce_wp_checkbox( array(
'id' => '_exclude_from_catalog',
'label' => __('Исключить из каталога и поиска', 'woocommerce'),
'description' => __('Если отмечено, товар не будет показываться в каталоге и поиске', 'woocommerce'),
) );
}
add_action( 'woocommerce_product_options_general_product_data', 'wpmax_add_exclude_checkbox' );
function wpmax_save_exclude_checkbox( $post_id ) {
$exclude = isset( $_POST['_exclude_from_catalog'] ) ? 'yes' : 'no';
update_post_meta( $post_id, '_exclude_from_catalog', $exclude );
}
add_action( 'woocommerce_process_product_meta', 'wpmax_save_exclude_checkbox' );Проверка результата
- Перейдите в админку товара и отметьте чекбокс «Исключить из каталога и поиска». Сохраните товар.
- Очистите кеш сайта и браузера.
- Проверьте страницу категории — товар должен исчезнуть из списка.
- Проверьте поиск по сайту — товар не должен отображаться.
- Перейдите по прямой ссылке товара — он должен быть доступен (если это нужно). Если хотите скрыть и прямую ссылку, дополнительно отключайте доступ через
template_redirect.
Частые ошибки и как их исправить
- Товар всё ещё отображается в каталоге: возможно, включен кэш плагина или сервера — очистите все уровни кеша.
- Чекбокс не сохраняется: проверьте, что функция сохранения подключена и нет конфликтов с другими плагинами.
- Товар виден в поиске, но не в каталоге: фильтр
woocommerce_product_is_visibleвлияет и на поиск, но если используется кастомный поиск, проверьте его настройки. - Товар недоступен по прямой ссылке, но нужно чтобы был: код дополнительно ограничивает доступ — уберите фильтр
template_redirectили настройте разрешения.
Практические советы по производительности и безопасности
- Не храните длинные списки ID товаров для исключения в коде, используйте метаполя или таксономии.
- Для больших магазинов создайте отдельный метаповод или пользовательское поле с индексом, чтобы быстро фильтровать товары на уровне запросов.
- При использовании кеширующих плагинов убедитесь, что страницы с исключёнными товарами корректно обновляются.
- Не удаляйте товары, если на них есть заказы — лучше скрывайте их, чтобы не потерять историю.
Сравнительная таблица способов исключения товаров из каталога
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Удаление товара | Простота, освобождение места | Потеря истории, невозможность быстрого возврата | Редкие случаи, когда товар больше не нужен |
| Перевод в черновик | Легко вернуть, скрывает из каталога | Товар может быть виден в некоторых темах и плагинах | Подходит для временного скрытия |
Код с фильтром woocommerce_product_is_visible | Гибко, не влияет на базу данных | Требует навыков программирования | Лучший для точного контроля |
| Использование метаполя и чекбокса | Удобно для админов, гибко | Нужно добавить код и валидацию | Оптимально для магазинов средней и большой сложности |