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

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

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

Задача — автоматизировать удаление или скрытие товаров, которые не были в наличии более определенного времени, например 30 дней, чтобы каталог оставался актуальным.

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

1. Выбор метода хранения наличия

WooCommerce хранит количество в метаполе _stock, а статус наличия — в _stock_status (значения: instock, outofstock, onbackorder).

Для отслеживания времени отсутствия товара понадобится добавить метаполе с датой последнего появления в наличии, например, last_instock_date.

2. Добавление кода для обновления даты наличия

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

add_action('woocommerce_product_set_stock_status', 'update_last_instock_date', 10, 3);
function update_last_instock_date($product_id, $stock_status, $product) {
    if ($stock_status === 'instock') {
        update_post_meta($product_id, 'last_instock_date', current_time('mysql'));
    }
}

3. Создание планового задания для удаления товаров

Добавим WP-Cron задачу, которая будет ежедневно проверять товары с отсутствием в наличии более 30 дней и удалять их.

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

add_action('auto_delete_outofstock_products', 'delete_old_outofstock_products');

function delete_old_outofstock_products() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ],
            [
                'key'     => 'last_instock_date',
                'value'   => $date_threshold,
                'compare' => '<=',
                'type'    => 'DATETIME',
            ],
        ],
        'fields' => 'ids',
    ];

    $query = new WP_Query($args);
    if ($query->have_posts()) {
        foreach ($query->posts as $product_id) {
            wp_trash_post($product_id); // Можно заменить на wp_delete_post для полного удаления
        }
    }
}

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

1. Измените статус наличия товара на outofstock и убедитесь, что метаданные last_instock_date не обновляются.

2. Верните товар в наличие и проверьте, что дата обновилась в базе (через get_post_meta($product_id, 'last_instock_date', true)).

3. Для теста вручную запустите функцию delete_old_outofstock_products() через WP-CLI или временно вызовите с add_action('init', 'delete_old_outofstock_products'); и проверьте, что товары с датой наличия более 30 дней в прошлом переносятся в корзину.

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

  • Дата не обновляется при смене статуса: Проверьте, что хук woocommerce_product_set_stock_status срабатывает и функция корректно вызывается.
  • Товары не удаляются: Проверьте правильность даты в метаполе last_instock_date и формат сравнения в запросе.
  • Удаление не работает при большом количестве товаров: Разбейте удаление на чанки, чтобы избежать таймаута и нагрузок на базу.
  • Потеря данных при жестком удалении: Используйте wp_trash_post вместо wp_delete_post для возможности восстановления.

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

  • Резервное копирование базы перед автоматическим удалением — обязательная мера.
  • Для больших магазинов используйте WP-CLI для запуска удаления пакетами и мониторинга.
  • Добавьте логирование удаленных товаров в отдельный лог-файл для аудита.
  • Обеспечьте выполнение WP-Cron с помощью системного cron на сервере, чтобы задачи не зависали.

Сравнение подходов: плагин vs кастомный код

КритерийПлагин для очистки товаровКастомный код (описанный выше)
ГибкостьОграничена настройками плагинаПолный контроль и тонкая настройка
ЗависимостиЗависит от внешнего кода и обновленийМинимум сторонних зависимостей
ПроизводительностьМожет быть тяжеловеснымОптимизирован под задачи магазина
БезопасностьЗависит от качества плагинаМожно контролировать и логировать процесс
Успешная авторизация WordPress с использованием REST API
18.12.2025
Как создать динамические таблицы в WordPress с помощью шорткодов
12.12.2025
Как удалить неиспользуемые атрибуты и метаданные из WooCommerce
13.05.2026
Как создать автоматическое отключение плагинов при конфликтах в WordPress
04.04.2026
Автоматическое удаление старых товаров WooCommerce с помощью WP-Cron
28.05.2026