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

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

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

Как определить варианты товаров для удаления

Первый шаг — сформулировать конкретное условие удаления. Например:

  • Варианты с мета-данными, указывающими на устаревание (например, _expiration_date меньше текущей даты).
  • Варианты с определённым атрибутом (например, цвет Синий в коллекции 2022 года).
  • Варианты без остатков на складе более 30 дней.

В этом примере рассмотрим удаление вариантов с мета-ключом _expiration_date, у которого дата истекла:

expiration_date < date('Y-m-d')

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

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин. Код запускается через WP-Cron по расписанию (ежедневно) и удаляет устаревшие варианты:

function wpacademy_delete_expired_variations() {
    $today = date('Y-m-d');

    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_expiration_date',
                'value'   => $today,
                'compare' => '<',
                'type'    => 'DATE',
            ],
        ],
        'fields' => 'ids',
    ];

    $expired_variations = get_posts($args);

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

// Регистрируем ежедневное событие
if (!wp_next_scheduled('wpacademy_delete_expired_variations_hook')) {
    wp_schedule_event(time(), 'daily', 'wpacademy_delete_expired_variations_hook');
}
add_action('wpacademy_delete_expired_variations_hook', 'wpacademy_delete_expired_variations');

Объяснение:

  • get_posts выбирает все вариации с датой истечения меньше текущей.
  • wp_delete_post удаляет варианты без возможности восстановления.
  • WP-Cron запускает функцию ежедневно, чтобы автоматизировать процесс.

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

1. В админке WooCommerce перейдите в список вариаций и проверьте, что устаревшие варианты удалены.

2. Можно вывести в лог ID удалённых вариантов, добавив в функцию:

error_log('Deleted variation ID: ' . $variation_id);

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

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

  • Функция не удаляет варианты: проверьте, что мета-ключ _expiration_date существует и хранится в формате Y-m-d.
  • WP-Cron не срабатывает: убедитесь, что на сайте есть посещения или используйте системный cron для запуска wp-cron.php.
  • Удаляются не те варианты: проверьте условие в meta_query, возможно, дата сравнивается неправильно или используются другие мета-данные.
  • Удаление занимает много времени: используйте постраничный запрос с posts_per_page, чтобы удалять частями.

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

  • Перед удалением создавайте резервную копию базы данных.
  • Для больших магазинов ограничьте количество удаляемых вариантов за один запуск (например, posts_per_page => 100).
  • Добавьте логирование в файл, чтобы отслеживать работу скрипта.
  • Используйте транзакции базы данных для предотвращения частичных удалений при ошибках (требуется дополнительно через $wpdb).
  • Отключите WP-Cron в wp-config.php и настройте системный cron для стабильной работы.

Сравнение способов удаления вариантов WooCommerce

МетодПлюсыМинусы
Ручное удаление в админкеПростота, контрольТрудозатратно, риск ошибок
Удаление через плагин (например, WP Bulk Delete)Простота настройки, без кодаЗависимость от стороннего кода, нагрузка на сервер
Кодовое решение с WP-Cron (как в статье)Автоматизация, гибкость, без плагиновНеобходимы навыки разработки, настройка cron
Как создать производительный кеш для WordPress без плагинов
25.02.2026
Автоматическое удаление вариантов товаров WooCommerce по условию
24.05.2026
Использование WooCommerce Cart Cookies для правильного отображения корзины
29.07.2026
Как использовать WPGeneratePress для оптимальной настройки темы WordPress
16.12.2025
Автоматическое удаление незаконченых заказов WooCommerce
16.05.2026