Диагностика проблемы: почему товары без склада остаются в каталоге
В WooCommerce товары с нулевым или отрицательным количеством на складе часто продолжают отображаться на сайте, если не настроена автоматическая фильтрация. Это приводит к неудобствам для пользователей и снижению конверсии. Особенно актуально для магазинов с большим ассортиментом и частыми изменениями наличия товаров.
Проверьте текущие настройки WooCommerce в разделе WooCommerce > Настройки > Товары > Запасы. Опция «Скрывать товары без наличия» должна быть включена для базового решения. Однако она не всегда работает с кастомными типами товаров или при использовании сложных плагинов.
Как проверить, что товары без склада отображаются
- Откройте каталог магазина и найдите товары с количеством на складе 0 или меньше.
- В панели администратора перейдите в список товаров, включите столбец «Наличие» и убедитесь, что такие товары видны на сайте.
Пошаговое решение: автоматическое удаление товаров без склада из каталога
1. Включение стандартной опции скрытия товаров без наличия
Перейдите в WooCommerce > Настройки > Товары > Запасы и активируйте галочку «Скрывать товары без наличия». Это базовое решение, но не всегда достаточно.
2. Добавление кастомного кода для удаления таких товаров из каталога
Для более надежной фильтрации подойдет добавление фильтра к основному запросу WooCommerce, исключающего товары с запасом 0 или ниже. Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
add_action('pre_get_posts', 'exclude_out_of_stock_products_from_catalog');
function exclude_out_of_stock_products_from_catalog($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
if (is_shop() || is_product_taxonomy()) {
$meta_query = (array) $query->get('meta_query');
$meta_query[] = array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
);
$query->set('meta_query', $meta_query);
}
}Этот код исключает из каталога все товары с мета-ключом _stock_status, равным outofstock, то есть без наличия.
3. Удаление товаров без склада из базы (если требуется полный CleanUp)
Если нужно не просто скрыть, а полностью удалить такие товары, можно создать WP-CLI команду или скрипт для удаления:
function delete_out_of_stock_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
),
),
'fields' => 'ids',
);
$products = get_posts($args);
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // true — безвозвратно
}
}Вызовите эту функцию вручную или настройте WP-Cron для периодического запуска.
Проверка результата
- Обновите страницу каталога и убедитесь, что товары с нулевым или отрицательным запасом не отображаются.
- В админке проверьте, что товары без склада либо скрыты, либо удалены (в зависимости от выбранного метода).
- Для полного удаления — проверьте таблицу
wp_postsи наличие товаров сpost_type = 'product'и_stock_status = 'outofstock'.
Частые ошибки и их исправление
- Код не работает на странице архива — проверьте, что условие
is_shop() || is_product_taxonomy()охватывает все нужные страницы (например, категории товаров). При необходимости добавьте другие условные теги. - Плагин кэширования мешает изменениям — очистите кэш сайта и браузера после внесения изменений.
- Метаданные товаров не обновлены — убедитесь, что у товаров корректно установлен
_stock_status, например с помощью плагина «Adminer» или через консоль MySQL. - Удаление товаров происходит не полностью — проверьте права пользователя, под которым запускается скрипт, и убедитесь, что
wp_delete_postвызывается с параметромtrueдля безвозвратного удаления.
Практические советы по безопасности и производительности
- Перед массовым удалением товаров сделайте резервную копию базы данных.
- Если товаров очень много, удаление лучше выполнять пакетами, чтобы не перегружать сервер.
- Для фильтрации товаров по складу используйте мета-ключ
_stock_status, а не_stock, так как первый оптимизирован WooCommerce для таких запросов. - Для улучшения производительности используйте объектный кеш и избегайте избыточных запросов в цикле.
- Если используете сторонние плагины управления запасами, убедитесь, что они совместимы с вашим кодом.
Сравнение методов удаления товаров без склада
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Настройка WooCommerce | Включение опции скрытия товаров без наличия | Простота, не требует кода | Не всегда работает с кастомами, не удаляет товары |
| Фильтр pre_get_posts | Исключение товаров с _stock_status=outofstock из вывода | Гибко, работает для всех страниц каталога | Товары остаются в базе, требуют поддержки |
| Массовое удаление через скрипт | Безвозвратное удаление товаров из БД | Полное очищение каталога | Риск потери данных, требует резервного копирования |