WooCommerce: как автоматически удалять товары из каталога при отсутствии на складе

Диагностика проблемы: почему товары остаются в каталоге без наличия

В стандартной настройке WooCommerce товар со значением "нет в наличии" по умолчанию не удаляется из каталога, а просто отображается как отсутствующий. Это может приводить к путанице пользователей и снижению конверсии, так как товары, которых нет в продаже, занимают место в каталоге и снижают удобство навигации. Чтобы решить эту задачу, необходимо автоматически удалять или скрывать такие товары.

Варианты решения: удалить или скрыть товары без наличия

Перед тем как реализовать удаление, рассмотрим 3 варианта действий с отсутствующими товарами:

  • Автоматическое удаление товара из каталога — полностью удаляет товар (вместе с метаданными и изображениями).
  • Автоматическое скрытие товара — меняет статус товара на черновик или скрытый, чтобы исключить из каталога, но сохранить данные.
  • Отключение отображения товаров без наличия стандартными средствами WooCommerce — настройка фильтров отображения.

Каждый вариант имеет свои плюсы и минусы, которые стоит учитывать:

ВариантПлюсыМинусы
Удаление товараПолное удаление, освобождение базы данных и улучшение удобстваПотеря данных, если нет резервных копий; восстановление возможно только через импорт/резерв
Скрытие товараСохраняет историю и данные, легко вернуть товар в каталогЗанимает место в базе, требуется дополнительный фильтр для исключения из каталога
Фильтрация отображенияСамый простой метод, без удаления и изменения статусаТовар остается доступен по прямой ссылке, не освобождает базу

Пошаговое решение: автоматическое удаление товаров без наличия при обновлении запасов

1. Создаем функцию для удаления товаров без наличия

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:

function wpaction_delete_out_of_stock_products() {
    // Параметры запроса для получения всех товаров без наличия
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_stock_status',
                'value' => 'outofstock',
            ],
        ],
        'fields' => 'ids',
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // true — удаление без корзины
        }
    }
}

2. Запускаем функцию по расписанию с помощью WP-Cron

Добавьте расписание, чтобы функция запускалась, например, ежедневно:

if (! wp_next_scheduled('wpaction_daily_delete_outofstock')) {
    wp_schedule_event(time(), 'daily', 'wpaction_daily_delete_outofstock');
}

add_action('wpaction_daily_delete_outofstock', 'wpaction_delete_out_of_stock_products');

3. Запуск функции вручную для проверки

Во время разработки или тестирования можно вызвать функцию вручную, например, через админку или wp-cli:

wpaction_delete_out_of_stock_products();

Как проверить, что решение сработало

  • Перейдите в админку WooCommerce > Товары и отфильтруйте по статусу "нет в наличии". После выполнения скрипта таких товаров не должно остаться.
  • Проверьте на сайте каталог — отсутствующие товары должны исчезнуть.
  • Для проверки cron-заданий используйте плагин WP Crontrol или команду wp cron event list через wp-cli.

Частые ошибки и как их исправить

  • Функция не удаляет товары — проверьте правильность ключа метаполя: WooCommerce использует _stock_status со значениями instock, outofstock.
  • Удаляются товары с наличием — убедитесь, что сравнение сделано строго на outofstock, без лишних условий.
  • Проблемы с WP-Cron — на некоторых серверах cron не работает без посещения сайта. Проверьте работу через wp-cli или настройте системный cron для вызова wp-cron.php.
  • Удаление без возможности восстановления — используйте вторую копию сайта или тестовую базу для отладки. Для безопасности лучше сначала реализовать скрытие, а не удаление.

Практические советы по безопасности и производительности

  • Перед автоматическим удалением товаров сделайте резервную копию базы данных.
  • Если каталог очень большой, выполняйте удаление пакетами, чтобы избежать превышения времени выполнения PHP. Например, лимитируйте количество товаров в запросе и повторяйте обработку несколько раз.
  • Для повышения производительности используйте fields => 'ids' в запросах WP_Query.
  • Если хотите скрыть товары без удаления, используйте изменение статуса:
wp_update_post([
  'ID' => $product_id,
  'post_status' => 'draft' 
]);
  • Проверяйте, что в шаблонах магазина не выводятся товары со статусом 'draft'.

Вывод

Автоматическое удаление товаров без наличия в WooCommerce помогает поддерживать каталог актуальным и облегчает навигацию для покупателей. Главное — подходить к этой задаче с осторожностью, тестировать код на тестовом сайте и обязательно иметь резервные копии. Для более гибкого управления товарами рассмотрите возможность скрытия вместо удаления.

WooCommerce: как автоматически отключить отложенные оплаты при превышении срока
21.06.2026
Как удалить по умолчанию скрипты и стили в WooCommerce для ускорения сайта
10.05.2026
Как отключить REST API в WordPress для защиты сайта
13.02.2026
Как создать собственный вид записей в WordPress
25.11.2025
Автоматическое удаление неиспользуемых шорткодов в WordPress
03.04.2026