Диагностика проблемы: почему товары с нулевым запасом остаются в каталоге
В стандартной конфигурации WooCommerce товары с количеством на складе равным нулю не удаляются и продолжают отображаться на сайте, что может вводить покупателей в заблуждение. Это особенно критично для магазинов с большим ассортиментом и быстрым обновлением запасов. Основная причина в том, что WooCommerce по умолчанию лишь скрывает товары, если включена опция "Скрывать товары, которых нет в наличии", но не удаляет их из каталога, а также не удаляет из базы данных.
Проверить текущие настройки можно в админке в разделе WooCommerce → Настройки → Товары → Запасы. Здесь есть опция Скрывать товары при отсутствии на складе. Но если она не активирована или если нужна именно автоматическая удаление товара из каталога (а не просто скрытие), потребуется кастомное решение.
Пошаговое решение: автоматическое удаление товаров с нулевым запасом
1. Проверка включения управления запасами
Убедитесь, что управление запасами включено глобально и отдельно для каждого товара:
function is_stock_management_enabled() {
return wc_stock_enabled();
}2. Создание WP-Cron задачи для регулярной проверки товаров
Добавим функцию, которая будет запускаться ежедневно и удалять товары с запасом 0:
function wpaction_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',
);
$query = new WP_Query($args);
if ( ! empty($query->posts) ) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true - удалить без возможности восстановления
}
}
}
// Регистрация события для cron
if (! wp_next_scheduled('wpaction_daily_delete_out_of_stock_products')) {
wp_schedule_event(time(), 'daily', 'wpaction_daily_delete_out_of_stock_products');
}
add_action('wpaction_daily_delete_out_of_stock_products', 'wpaction_delete_out_of_stock_products');3. Немедленное удаление товара при обновлении запаса (опционально)
Если нужно, чтобы товар удалялся сразу, как только запас стал 0, можно повесить хук на обновление мета поля:
function wpaction_delete_product_if_out_of_stock($meta_id, $post_id, $meta_key, $meta_value) {
if ($meta_key === '_stock_status' && $meta_value === 'outofstock') {
wp_delete_post($post_id, true);
}
}
add_action('updated_postmeta', 'wpaction_delete_product_if_out_of_stock', 10, 4);
add_action('added_postmeta', 'wpaction_delete_product_if_out_of_stock', 10, 4);Проверка результата после внедрения
- Зайдите в админку WooCommerce → Товары и убедитесь, что товары с запасом 0 отсутствуют.
- Для теста вручную установите запас товара в 0 и обновите метаданные. Проверьте, что товар удалился автоматически.
- Проверьте в базе данных наличие постов с post_type = 'product' и meta_key = '_stock_status', равным 'outofstock'. Их не должно быть.
Частые ошибки и как их исправить
- Товары не удаляются после установки запаса 0
Проверьте, включено ли управление запасами глобально и для товара. Без этого поле_stock_statusне обновляется. - Удаление происходит не сразу
Если вы используете только cron-задачу, удаление произойдет в момент срабатывания cron (обычно раз в сутки). Чтобы ускорить, используйте хук на обновление мета-поля. - Удалённые товары можно восстановить
Если хотите полностью удалить, используйтеwp_delete_post($id, true), иначе товар попадёт в корзину. - Потеря данных о товаре
Перед внедрением решения сделайте резервную копию базы данных.
Практические советы по безопасности и производительности
- Добавьте проверку прав пользователя и nonce, если реализуете удаление через AJAX или действия вручную.
- Для больших магазинов с тысячами товаров используйте
WP_Queryс постраничной загрузкой (pagedиposts_per_page), чтобы избежать превышения лимитов памяти. - Регулярно проверяйте логи ошибок и статус выполнения WP-Cron, чтобы убедиться в работе задачи.
- Используйте плагин Clearfy Pro для удаления дублей и оптимизации базы данных после массового удаления товаров: https://wpshop.ru/plugins/clearfy?utm_source=wpaction.ru&utm_medium=article&utm_campaign=woocommerce-udalit-tovar-pri-otsutstvii-na-sklade
Сравнение вариантов удаления товаров с нулевым запасом
| Метод | Плюсы | Минусы |
|---|---|---|
| Включить "Скрывать товары при отсутствии на складе" | Простота настройки, без кода | Товар остается в базе и может отображаться в поиске |
| WP-Cron для массового удаления | Автоматизация, удаление из базы | Удаление происходит с задержкой, нагрузка при больших объемах |
| Хук на обновление мета-поля | Мгновенное удаление, точечное | Повышенная нагрузка на сайт при частых изменениях |
| Плагин для управления запасами | Готовое решение, поддержка и обновления | Дополнительные расходы и возможные конфликты |