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

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

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

Определяем критерии для удаления вариантов

Чаще всего варианты товаров удаляют, если:

  • нет остатков на складе;
  • вариант не продавался длительное время (например, 6 месяцев);
  • вариант устарел по срокам действия или акциям;
  • вариант был отключен администратором, но не удалён.

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

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

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

function wpb_delete_variations_no_stock() {
    $args = array(
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => '_stock_status',
                'value' => 'outofstock',
            ),
        ),
        'fields' => 'ids',
    );
    $variations = get_posts($args);

    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true);
        }
    }
}

2. Добавляем WP-Cron задачу для регулярного запуска

Чтобы функция запускалась автоматически, регистрируем событие с интервалом, например, раз в сутки.

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

add_action('wpb_daily_variation_cleanup', 'wpb_delete_variations_no_stock');

3. Оптимизируем выборку, чтобы не нагружать сайт

Если каталог большой, лучше обрабатывать варианты партиями, чтобы не превышать лимиты памяти и времени выполнения.

function wpb_delete_variations_no_stock_batch($batch_size = 50) {
    $args = array(
        'post_type' => 'product_variation',
        'posts_per_page' => $batch_size,
        'meta_query' => array(
            array(
                'key' => '_stock_status',
                'value' => 'outofstock',
            ),
        ),
        'fields' => 'ids',
    );
    $variations = get_posts($args);

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

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true);
    }
}

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

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

  • Проверьте наличие вариантов с _stock_status = outofstock в базе данных (wp_postmeta) до и после запуска.
  • Вручную вызовите функцию wpb_delete_variations_no_stock() через консоль WP-CLI или временно в шаблоне.
  • Просмотрите логи сервера на наличие ошибок при выполнении задачи WP-Cron.
  • Посмотрите в админке WooCommerce, что устаревшие варианты исчезли.

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

  • WP-Cron не запускается: Убедитесь, что на вашем хостинге разрешено выполнение wp-cron, или настройте системный cron для вызова wp-cron.php вручную.
  • Удаление не происходит: Проверьте, что функция корректно ищет варианты. Используйте var_dump для отладки массива ID.
  • Удаляются не те варианты: Проверьте мета-ключи и значения, используемые в meta_query. Возможно, у вас другая логика хранения статуса.
  • Высокая нагрузка при удалении большого количества вариантов: Используйте пакетную обработку и увеличьте интервал запуска.

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

  • Всегда делайте резервную копию базы перед массовым удалением.
  • Для крупных магазинов лучше использовать WP-CLI скрипты для запуска удаления в off-peak часы.
  • Добавьте логирование в функцию удаления, чтобы отслеживать, сколько вариантов и когда удалено.
  • Подумайте о создании интерфейса в админке для ручного запуска и просмотра статуса очистки.

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

МетодПлюсыМинусы
WP-Cron + кастомная функция (код)Гибкость, нет лишних плагинов, легко кастомизируетсяТребует знаний PHP, возможны проблемы с cron на хостингах
Плагины для очистки WooCommerceПростота установки, готовые интерфейсыМогут быть тяжелыми, лишние зависимости, платные функции
WP-CLI скриптыВысокая производительность, удобство для больших магазиновТребуется доступ к серверу и знания консоли
Как использовать хуки в WordPress для расширения функциональности
30.11.2025
Как добавить уникальные метаполя для продукта WooCommerce с примером кода
24.02.2026
WooCommerce: как найти и исправить дублирующиеся артикулы (SKU) в продуктах
04.05.2026
Как использовать методы оптимизации базы данных WordPress для ускорения сайта
28.03.2026
Как удалить данные пользователя из базы WordPress без ошибок
19.02.2026