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

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

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

Задача — настроить автоматическое удаление неактивных (например, с нулевым остатком или отмеченных специальным флагом) вариантов товаров по расписанию, без установки дополнительных плагинов. Это позволит поддерживать базу в актуальном состоянии и снизит нагрузку.

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

Чаще всего под неактивными понимаются варианты, у которых:

  • Сток равен нулю и нет возможности предзаказа;
  • Активность отключена вручную (статус варианта или мета-поле);
  • Определенная метка или пользовательское поле, указывающее на устаревание.

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

Пошаговое решение: удаление неактивных вариантов с WP-Cron

1. Создаем функцию удаления неактивных вариантов

function wpb_delete_inactive_product_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => '0',
                'compare' => '=',
                'type'    => 'NUMERIC',
            ),
            array(
                'key'     => '_backorders',
                'value'   => 'no',
                'compare' => '=',
            ),
        ),
        'fields' => 'ids',
    );

    $variations = get_posts($args);

    if (empty($variations)) {
        return;
    }

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // Удаляем вариант без возможности восстановления
    }
}

2. Регистрируем событие WP-Cron для ежедневного запуска

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

add_action('wpb_daily_inactive_variation_deletion', 'wpb_delete_inactive_product_variations');

3. Добавляем возможность очистки cron-события при деактивации темы или плагина

function wpb_clear_scheduled_deletion() {
    $timestamp = wp_next_scheduled('wpb_daily_inactive_variation_deletion');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpb_daily_inactive_variation_deletion');
    }
}
register_deactivation_hook(__FILE__, 'wpb_clear_scheduled_deletion');

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

Для проверки, что решение работает:

  • Создайте вариант товара с запасом 0 и без разрешения предзаказа;
  • Запустите вручную функцию wpb_delete_inactive_product_variations() через консоль WP-CLI или временно добавьте вызов этой функции в шаблон;
  • Проверьте, что вариант удалился (его нет в админке, ID отсутствует);
  • Дождитесь однодневной работы WP-Cron или запустите его вручную (wp cron event run wpb_daily_inactive_variation_deletion если есть WP-CLI);
  • Просмотрите логи ошибок и убедитесь, что удаление прошло без проблем.

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

  • Варианты не удаляются: проверьте, что WP-Cron запущен, и событие активировано. Для локальной разработки WP-Cron может не работать без посещения сайта.
  • Удаляются не те варианты: проверьте условия meta_query. Возможно, в вашем магазине используются другие поля для учета запасов или предзаказа.
  • Ошибка прав доступа: убедитесь, что пользователь с правами администратора или скрипт имеет права удалять посты типа product_variation.
  • Потеря данных: wp_delete_post с параметром true удаляет вариант без возможности восстановления. Сделайте резервную копию базы перед внедрением.

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

  • Функция удаления выполняет запрос с posts_per_page = -1. Для магазинов с тысячами вариантов лучше реализовать пакетную обработку по 100–200 штук за раз, чтобы избежать таймаутов.
  • Запускайте WP-Cron на сервере через системный cron (например, через crontab) для надежности и предсказуемого расписания.
  • Добавьте логирование удаляемых вариантов для аудита и отката при необходимости.
  • Перед удалением можно отправлять уведомления администратору с перечнем удаляемых вариантов.

Сравнение подходов к автоматическому удалению неактивных вариантов

МетодПлюсыМинусы
Собственный код с WP-CronБез плагинов, гибко, контролируем процессТребует навыков разработки, поддержка кода на вас
Плагины очистки WooCommerceПростота установки, поддержка и обновленияМогут быть ресурсоёмкими, не всегда подходят под точные требования
Ручное удалениеМаксимальный контрольТрудозатратно и риск ошибок при большом каталоге
Как удалить старые изображения в WordPress без риска для сайта
21.03.2026
Как отключить REST API в WordPress без потери функциональности
01.04.2026
WooCommerce: как автоматически удалять неактивные варианты товаров
13.06.2026
Автоматическое удаление неактивных вариантов товаров WooCommerce по расписанию без плагинов
24.06.2026
Как добавить поле с вариантами в выводе продуктов WooCommerce для удобства выбора
13.12.2025