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

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

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

Для диагностики проблемы проверьте, как WooCommerce обрабатывает статус «нет в наличии» и как долго отсутствующие товары остаются в базе. По умолчанию WooCommerce не удаляет отсутствующие товары — они просто помечаются статусом outofstock.

Проверьте наличие отсутствующих товаров через SQL-запрос к базе данных:

SELECT ID, post_title FROM wp_posts WHERE ID IN (SELECT post_id FROM wp_postmeta WHERE meta_key='_stock_status' AND meta_value='outofstock') AND post_type='product';

Если таких товаров много и они не управляются вручную, стоит автоматизировать удаление.

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

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

В примере ниже товары, которые находятся в статусе outofstock более 30 дней, будут удалены из базы данных.

function wpmy_delete_old_outofstock_products() {
    $days_threshold = 30; // количество дней отсутствия товара
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));

    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'meta_query' => array(
            array(
                'key' => '_stock_status',
                'value' => 'outofstock',
            ),
            array(
                'key' => '_stock_last_changed', // кастомное поле с датой изменения наличия
                'value' => $date_threshold,
                'compare' => '<=',
                'type' => 'DATETIME',
            ),
        ),
        'fields' => 'ids',
        'posts_per_page' => -1,
    );

    $products = get_posts($args);

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

// Добавляем запись в cron на ежедневное выполнение
if (!wp_next_scheduled('wpmy_daily_delete_outofstock_products')) {
    wp_schedule_event(time(), 'daily', 'wpmy_daily_delete_outofstock_products');
}
add_action('wpmy_daily_delete_outofstock_products', 'wpmy_delete_old_outofstock_products');

2. Обновляем дату последнего изменения статуса наличия товара

Для работы функции нужно отслеживать дату, когда товар стал отсутствовать. Добавим хук, который обновляет мета поле _stock_last_changed при смене статуса:

add_action('woocommerce_product_set_stock_status', function($product_id, $stock_status) {
    if ($stock_status === 'outofstock') {
        update_post_meta($product_id, '_stock_last_changed', current_time('mysql'));
    } else {
        delete_post_meta($product_id, '_stock_last_changed');
    }
}, 10, 2);

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

Чтобы проверить, что автоматическое удаление работает:

  • Создайте тестовый товар и установите ему статус outofstock.
  • Убедитесь, что мета поле _stock_last_changed установлено и содержит текущую дату.
  • Измените дату в базе данных на дату более 30 дней назад для теста.
  • Запустите событие cron вручную, например, через плагин WP Crontrol или вызовите функцию напрямую.
  • Проверьте, что товар удалился из каталога и базы данных.

Частые ошибки и способы их исправления

  • Отсутствует мета поле _stock_last_changed: функция удаления не сработает, если это поле не установлено. Обязательно добавьте хук для его обновления.
  • Запланированное событие cron не срабатывает: проверьте, работает ли системный cron WordPress, или используйте плагин WP Crontrol для диагностики и запуска событий вручную.
  • Удаление не происходит из-за прав доступа: убедитесь, что у пользователя, под которым выполняется скрипт, есть права на удаление постов.
  • Неправильный формат даты: убедитесь, что даты сравниваются в формате Y-m-d H:i:s и с правильной временной зоной WordPress.

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

  • Всегда делайте резервную копию базы данных перед внедрением автоматического удаления.
  • Для больших магазинов с тысячами товаров используйте пагинацию при выборке товаров для удаления, чтобы избежать превышения лимитов памяти и времени выполнения.
  • Используйте wp_delete_post($id, true) для полного удаления, а не перемещения в корзину, чтобы не захламлять базу.
  • Ограничивайте права доступа к коду, добавляющему автоматизацию, чтобы предотвратить злоупотребления.

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

СпособПреимуществаНедостатки
Ручное удаление через админкуПростота, нет дополнительного кодаЗатратно по времени, риск забыть
Плагин автоматизацииУдобство, готовое решениеМожет нагружать сайт, не всегда бесплатно
Кодовое решение с wp-cron (как в статье)Точный контроль, оптимизация под сайтТребует навыков разработки, настройка cron
Как создать свой плагин WordPress с нуля: пошаговое руководство
08.11.2025
Оптимизация изображений WordPress: автоматическое изменение размера и сжатие
13.03.2026
Как автоматизировать создание и удаление черновиков в WordPress
07.02.2026
Защита WordPress от Brute Force атак с помощью кода
10.12.2025
Как установить просмотр и управление ролями пользователей в WordPress
24.02.2026