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

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

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

Типичные признаки необходимости автоматизации:

  • Товары с остатком 0 не обновляются и не удаляются;
  • Товары с истекшим сроком публикации продолжают отображаться;
  • Отсутствие единого процесса очистки каталога приводит к накоплению неактуальных продуктов.

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

1. Использование WP-Cron для регулярной проверки товаров

WP-Cron позволяет запускать задачи по расписанию без необходимости внешних cron-сервисов.

2. Функция для удаления товаров с нулевым остатком

Пример функции, которая находит и удаляет товары с запасом 0:

function wc_delete_products_out_of_stock() {
    $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_delete_post($product_id, true); // жесткое удаление
        }
    }
}

3. Функция для удаления товаров по дате публикации

Удаляем товары старше определенной даты, например, 180 дней:

function wc_delete_old_products() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'date_query'     => array(
            array(
                'before'    => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'fields'         => 'ids',
    );

    $old_products = get_posts($args);
    if (!empty($old_products)) {
        foreach ($old_products as $product_id) {
            wp_delete_post($product_id, true);
        }
    }
}

4. Регистрация cron-задачи и запуск функций

Добавляем событие при активации темы или плагина:

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

add_action('wc_daily_product_cleanup', 'wc_delete_products_out_of_stock');
add_action('wc_daily_product_cleanup', 'wc_delete_old_products');

Чтобы отменить задачу (например, при деактивации плагина), используйте:

function wc_unschedule_product_cleanup() {
    $timestamp = wp_next_scheduled('wc_daily_product_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_daily_product_cleanup');
    }
}

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

  • Запустить вручную wc_delete_products_out_of_stock() и wc_delete_old_products() через WP-CLI или временно вызвать в functions.php — проверить, что товары с нулевым остатком и старше 180 дней удаляются.
  • Через админку WooCommerce убедиться, что таких товаров больше нет.
  • Проверить логи сервера на наличие ошибок при выполнении cron-задачи.
  • Отслеживать поведение сайта в течение нескольких дней — автоматическое удаление должно происходить ежедневно.

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

  • Не запускается WP-Cron: убедитесь, что на хостинге разрешен WP-Cron или настройте системный cron для вызова wp-cron.php.
  • Удаляются не те товары: проверьте правильность условий meta_query и date_query. Не используйте post_status="publish", если хотите удалить и черновики.
  • Функции не вызываются: проверьте регистрацию хуков add_action, убедитесь, что код загружается (например, в functions.php темы или в плагине).
  • Отсутствует резервное копирование: всегда делайте бэкап базы перед автоматическим удалением данных.

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

  • Перед удалением товаров можно отправлять уведомление администратору с количеством и ID удаляемых товаров.
  • Для больших магазинов разбивайте удаление на партии по 50-100 товаров, чтобы избежать таймаутов и превышения памяти.
  • Используйте транзакции базы данных (если возможно) или логируйте удаленные товары для возможности восстановления.
  • Отключайте WP-Cron и используйте системный cron на высоконагруженных сайтах для стабильности.

Сравнение вариантов автоматического удаления товаров

МетодПлюсыМинусыРекомендации
Код на PHP с WP-CronГибкость, без плагинов, точная кастомизацияЗависимость от WP-Cron, требует навыковЛучше для опытных разработчиков и средних магазинов
Плагины очистки каталогаПростота установки, GUIМогут грузить сайт, ограниченные настройкиПодходит для небольших магазинов
Системный cron с WP-CLIСтабильность, высокая производительностьТребует доступа к серверу, знания командной строкиЛучший вариант для больших проектов
Как закрыть дубли страниц от пагинации в WordPress через robots, noindex и canonical
13.08.2026