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

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

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

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

WooCommerce хранит данные о наличии товара в метаполях, связанных с управляющими запасами:

  • _stock_status — статус наличия, обычно instock, outofstock или onbackorder;
  • _manage_stock — включено ли управление запасами (значение yes или no);
  • _stock — остаток запасов (число).

Для простого продукта статус outofstock означает отсутствие товара.

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

1. Настроить функцию для очистки каталога

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

function wpa_auto_delete_outofstock_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);

    if (!empty($products)) {
        foreach ($products as $product_id) {
            wp_trash_post($product_id); // отправляем в корзину, можно заменить на wp_delete_post для полного удаления
        }
    }
}

2. Запустить очистку по расписанию

Чтобы запускать функцию регулярно, используйте WP-Cron:

if (!wp_next_scheduled('wpa_daily_outofstock_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpa_daily_outofstock_cleanup');
}
add_action('wpa_daily_outofstock_cleanup', 'wpa_auto_delete_outofstock_products');

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

Для отладки вызовите функцию напрямую:

add_action('admin_init', function() {
    if (current_user_can('manage_options') && isset($_GET['run_outofstock_cleanup'])) {
        wpa_auto_delete_outofstock_products();
        echo 'Очистка выполнена';
        exit;
    }
});

После добавления этого кода в админке перейдите по адресу yourdomain.com/wp-admin/?run_outofstock_cleanup=1 для теста.

Проверка результата после внедрения

  • В админке WooCommerce перейдите в "Товары" и убедитесь, что товары с состоянием outofstock перемещены в корзину или удалены.
  • Проверьте фронтенд — они должны исчезнуть из каталога.
  • Ручной запуск функции через URL (как описано выше) должен показывать сообщение об успешном выполнении.

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

  • Товары не удаляются: проверьте, что в базе действительно есть товары со статусом outofstock. Иногда статус не обновляется автоматически. Можно временно включить управление запасами для теста.
  • Функция не запускается по расписанию: WP-Cron зависит от посещений сайта. Для надежности настройте системный cron или используйте плагин WP Crontrol для диагностики.
  • Удаление слишком радикально: вместо wp_trash_post можно использовать wp_delete_post($product_id, false) для полного удаления или изменить логику на скрытие (смена статуса на черновик).

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

  • Не удаляйте товары без резервного копирования — используйте корзину WordPress (wp_trash_post) для безопасности.
  • Если товаров много, разбивайте запросы на пачки (например, по 50 товаров), чтобы избежать перегрузки сервера.
  • Используйте WP-CLI для запуска очистки при больших объемах данных — это ускорит процесс и снизит нагрузку.
  • Проверяйте, что ваша тема и плагины корректно обновляют статусы товаров при изменении запасов.

Сравнение вариантов удаления товаров

МетодОписаниеПлюсыМинусы
wp_trash_postПеремещение товара в корзинуБезопасно, можно восстановитьТовары остаются в базе, занимают место
wp_delete_post (полное удаление)Полное удаление товара из базыОсвобождает место, нет мусораНевозможно восстановить без резервной копии
Изменение статуса на 'черновик'Скрывает товар из каталогаНе удаляет данные, можно быстро вернутьТовар все еще в базе, могут быть видны в админке
Как использовать WPCommunity для создания собственного форума на WordPress
26.03.2026
Автоматическое удаление неиспользуемых шорткодов в WordPress
03.04.2026
Как создать автоматический импорт продуктов в WooCommerce из внешнего источника
07.02.2026
Как избежать проблем с кэшированием в WordPress: практические решения
01.01.2026
Как отключить автоматические обновления в WordPress с помощью кода
04.03.2026