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

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

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

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

  • Товары имеют специальный статус или метку, например, 'outofstock' или пользовательское поле 'inactive'.
  • Товары не обновлялись длительное время (например, более 6 месяцев).
  • Накопилось большое количество устаревших товаров, замедляющих работу сайта.

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

1. Определение признака неактивного товара

В WooCommerce стандартно нет статуса "неактивный", но можно использовать кастомное поле или тег для пометки товаров, которые нужно удалять.

Например, добавим мета-ключ _inactive_product со значением yes для таких товаров.

2. Создание WP-Cron задачи для регулярной проверки

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

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

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

Функция будет искать товары с мета-ключом _inactive_product == yes и датой последнего обновления старше заданного срока (например, 30 дней), затем удалять их без возможности восстановления.

function wc_delete_inactive_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'   => '_inactive_product',
                'value' => 'yes',
            ],
        ],
        'date_query' => [
            [
                'column' => 'post_modified_gmt',
                'before' => '30 days ago',
            ],
        ],
        'fields' => 'ids',
    ];

    $query = new WP_Query( $args );

    if ( ! empty( $query->posts ) ) {
        foreach ( $query->posts as $product_id ) {
            wp_delete_post( $product_id, true ); // true = безвозвратное удаление
        }
    }
}
add_action( 'wc_delete_inactive_products_daily', 'wc_delete_inactive_products' );

4. Проверка работы задачи WP-Cron

Убедитесь, что WP-Cron активен и запускается регулярно. Для проверки можно использовать плагин WP Crontrol или выполнить вручную:

do_action('wc_delete_inactive_products_daily');

Если товары с указанной меткой и датой удаления есть, они будут удалены сразу.

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

  1. Добавьте тестовый товар с мета-ключом _inactive_product = yes и датой обновления более 30 дней назад (можно вручную в БД или через код).
  2. Запустите вручную задачу или дождитесь автоматического запуска WP-Cron.
  3. Проверьте, что товар был удалён (не отображается в админке и базе данных).
  4. Проверьте логи ошибок и уведомления сервера, чтобы убедиться в отсутствии проблем.

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

  • Товары не удаляются: проверьте, что WP-Cron работает, а событие wc_delete_inactive_products_daily запланировано. Можно временно заменить 'daily' на 'hourly' для теста.
  • Удаляются не те товары: убедитесь, что мета-ключ и значение заданы корректно. Проверьте запрос WP_Query отдельно.
  • WP-Cron не запускается на сервере: настройте системный cron, если сайт не получает посетителей, либо используйте плагин для запуска cron задач вручную.
  • Потеря важных товаров: добавьте дополнительную проверку или уведомление перед удалением, например, отправку письма админу.

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

  • Используйте безвозвратное удаление (wp_delete_post($id, true)) только если уверены, что резервное копирование настроено.
  • Для больших баз делайте удаление партиями (например, по 20 товаров за раз), чтобы избежать таймаутов. Пример:
function wc_delete_inactive_products_batch() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => 20,
        'meta_query'     => [
            [
                'key'   => '_inactive_product',
                'value' => 'yes',
            ],
        ],
        'date_query' => [
            [
                'column' => 'post_modified_gmt',
                'before' => '30 days ago',
            ],
        ],
        'fields' => 'ids',
    ];

    $query = new WP_Query( $args );

    if ( ! empty( $query->posts ) ) {
        foreach ( $query->posts as $product_id ) {
            wp_delete_post( $product_id, true );
        }
    }
}
  • Резервное копирование перед удалением — обязательная мера.
  • Для более сложных сценариев можно интегрировать с плагинами типа Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wponline.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-tovarov-po-neaktivnomu-statusu) для дополнительной оптимизации базы.

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

МетодПреимуществаНедостаткиРекомендации
WP-Cron с кастомным кодом (как в статье) Гибкость, возможность тонкой настройки Зависимость от работы WP-Cron, требует навыков программирования Лучше для опытных разработчиков, требует тестирования
Плагины автоматизации (например, WP Bulk Delete) Удобный интерфейс, быстрое внедрение Меньше контроля, возможны конфликты Подходит для простых случаев, если не требуется кастомизация
Ручное удаление через админку Простота, нет кода Трудозатратно, риск ошибок при больших объемах Использовать только для единичных удалений
Как удалить старые мета-данные в WordPress: практическое руководство
12.03.2026
Как удалить изменяемые поля в WordPress при удалении записи
06.01.2026
Как удалить пустые HTML-теги в WordPress
02.01.2026
Как настроить автоматическое удаление неиспользуемых вариаций товаров в WooCommerce
27.04.2026
Как автоматически удалять старые пункты в меню WordPress по дате создания
01.03.2026