WooCommerce: автоматическое удаление отсутствующих товаров

Диагностика проблемы с отсутствующими товарами в WooCommerce

В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары долго отсутствуют на складе, но остаются в каталоге. Это негативно влияет на UX, SEO и приводит к снижению конверсии. Следует определить, какие товары считаются «отсутствующими» для автоматического удаления или архивирования.

Как определить «отсутствующий товар»?

Отсутствующий товар — это товар с нулевым запасом _stock и статусом управления запасами manage_stock = yes. Можно дополнительно учитывать дату последнего обновления или статус видимости товара.

Диагностика через базу данных и админку

  • В админке WooCommerce перейдите в Товары и отфильтруйте по статусу запасов.
  • Через phpMyAdmin выполните запрос для поиска товаров с нулевым запасом:
SELECT ID, post_title, meta_value as stock FROM wp_posts p
JOIN wp_postmeta pm_stock ON p.ID = pm_stock.post_id AND pm_stock.meta_key = '_stock'
JOIN wp_postmeta pm_manage ON p.ID = pm_manage.post_id AND pm_manage.meta_key = '_manage_stock'
WHERE pm_manage.meta_value = 'yes' AND pm_stock.meta_value = '0' AND p.post_type = 'product';

Это поможет проверить, какие товары можно считать для автоматического удаления.

Пошаговое решение: автоматическое удаление отсутствующих товаров

1. Создаем функцию удаления

Добавим в файл functions.php темы или в отдельный плагин код, который будет удалять товары с нулевым запасом старше 30 дней.

function wpstuff_delete_out_of_stock_products() {
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => '_manage_stock',
                'value' => 'yes',
            ),
            array(
                'key' => '_stock',
                'value' => '0',
                'compare' => '='
            ),
        ),
        'date_query' => array(
            array(
                'column' => 'post_modified_gmt',
                'before' => '30 days ago',
            ),
        ),
        'fields' => 'ids',
    );

    $products = get_posts($args);

    foreach ($products as $product_id) {
        wp_delete_post($product_id, true); // true — принудительное удаление без корзины
    }
}

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

Чтобы автоматизировать процесс, добавим событие в WP-Cron, которое будет запускать функцию раз в сутки.

function wpstuff_schedule_delete_event() {
    if (!wp_next_scheduled('wpstuff_daily_delete_out_of_stock')) {
        wp_schedule_event(time(), 'daily', 'wpstuff_daily_delete_out_of_stock');
    }
}
add_action('wp', 'wpstuff_schedule_delete_event');

add_action('wpstuff_daily_delete_out_of_stock', 'wpstuff_delete_out_of_stock_products');

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

  • В админке WooCommerce проверьте список товаров с нулевым запасом старше 30 дней — они должны исчезнуть после запуска события.
  • Для теста можно временно изменить период в условии 'before' => '1 day ago' или вызвать функцию вручную:
wpstuff_delete_out_of_stock_products();
  • Проверьте логи сервера или используйте плагин Debug Bar для отладки выполнения WP-Cron.
  • Частые ошибки и как их исправить

    • Функция не запускается по расписанию: убедитесь, что WP-Cron работает (например, посетите сайт, чтобы активировать cron). Можно заменить WP-Cron на системный cron для надежности.
    • Удаляются товары, которые не нужно удалять: проверьте корректность условий в meta_query и date_query, особенно дату последнего обновления.
    • Проблемы с правами: функция wp_delete_post требует прав администратора или соответствующих ролей. Запуск из WP-Cron выполняется от имени сервера.

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

    • Перед удалением товаров создавайте резервную копию базы данных.
    • Для больших магазинов с тысячами товаров делайте удаление пакетами, например, по 50 товаров за один запуск, чтобы не нагружать сервер.
    • Добавьте логирование удалений в отдельный файл для аудита и восстановления при необходимости.
    • Если используется кэширование (например, Object Cache, Redis), очищайте кэш после удаления товаров.

    Сравнение способов автоматического удаления отсутствующих товаров

    СпособПреимуществаНедостатки
    Плагин (например, WP Bulk Delete)Простота, интерфейс настройки, безопасностьОграниченная кастомизация, может нагружать базу
    Собственный код с WP-CronГибкость, точечное управление, масштабируемостьТребует навыков, нужно тестировать и отлаживать
    Ручное удаление через админкуПростота, полный контрольТрудозатратно при большом количестве товаров
    Как использовать Custom Post Types в WordPress для создания нестираемых структур
    04.04.2026
    Как отладить проблемы с кэшированием в WooCommerce
    25.04.2026
    Как отключить AJAX в WooCommerce без потери функциональности
    21.04.2026
    Как создать многоуровневую навигацию в WordPress с примерами кода
    18.02.2026
    Как создать автоматический импорт постов из Telegram в WordPress
    18.03.2026