Автоматическое удаление неактивных вариаций товаров в WooCommerce через код

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

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

Неактивные вариации обычно имеют статус "черновик" или "удалено" в базе, но могут оставаться в базе данных. Их накопление замедляет запросы и усложняет управление товарами.

Как проверить наличие неактивных вариаций

Для проверки можно использовать SQL-запрос или WP-CLI. Например, запрос для поиска вариаций в статусе "trash" или "draft":

SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product_variation' AND post_status IN ('draft', 'trash');

Если результат содержит большое количество записей — стоит автоматизировать их удаление.

Пошаговое решение: код для удаления неактивных вариаций

Реализуем PHP-функцию, которую можно запускать вручную или по крону, чтобы удалять вариации с указанными статусами.

function wc_delete_inactive_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => ['draft', 'trash'],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $variation_id) {
            wp_delete_post($variation_id, true); // Удаляем без возможности восстановления
        }
    }
}

Для автоматизации добавим задачу в планировщик WP-Cron:

add_action('wp_delete_inactive_variations_hook', 'wc_delete_inactive_variations');

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

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

После запуска функции проверьте:

  • В админке WooCommerce — исчезли ли вариации со статусами "черновик" и "удалено".
  • Через SQL-запрос (приведенный выше) — количество таких вариаций равно нулю.
  • Логи ошибок отсутствуют.

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

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

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

  • Запускать удаление по крону с интервалом не чаще одного раза в день, чтобы не нагружать базу.
  • Перед удалением делать резервную копию базы.
  • Использовать wp_delete_post с параметром $force_delete = true для полного удаления, а не перемещения в корзину.
  • Если вариаций много, разбивайте удаление на партии, чтобы избежать таймаута PHP.

Сравнение методов удаления неактивных вариаций

МетодПлюсыМинусы
Ручное удаление через админку Простота, визуальный контроль Долго и неудобно при большом количестве вариаций
SQL-запрос Быстрое удаление напрямую из базы Риск повредить данные, требует навыков SQL
PHP-скрипт + WP-Cron Автоматизация, безопасное удаление через API WordPress Требует настройки, отладки
Как удалить или отключить XML-RPC в WordPress: практическое руководство
12.01.2026
Как удалить ненужные метаданные в WordPress для ускорения сайта
02.04.2026
Как удалить или исключить плагины из загрузки WordPress для оптимизации сайта
03.02.2026
Как удалить заказы WooCommerce по дате и статусу с помощью кода
19.05.2026
Автоматическое удаление неактивных вариаций товаров в WooCommerce через код
13.05.2026