WooCommerce: как автоматически удалять неактивные вариации товаров

Что такое неактивные вариации товаров в WooCommerce и почему их нужно удалять

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

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

Для начала нужно понять, какие вариации считаются неактивными. Чаще всего:

  • Вариации имеют статус private или draft.
  • Наличие статуса publish, но запас товара равен нулю (_stock = 0) и нет возможности заказа под заказ.
  • Вариации отключены через мета-поля или плагин.

Для диагностики можно выполнить SQL-запрос в базе (через phpMyAdmin или WP-CLI):

SELECT p.ID, p.post_title, pm.meta_key, pm.meta_value FROM wp_posts p JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND (p.post_status != 'publish' OR (pm.meta_key = '_stock' AND pm.meta_value = '0'));

Этот запрос покажет вариации с неактивным статусом или с нулевым запасом.

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

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

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:

function wpcore_delete_inactive_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => array('draft', 'private', 'trash'),
        'meta_query'     => array(
            'relation' => 'OR',
            array(
                'key'     => '_stock',
                'value'   => '0',
                'compare' => '=',
            ),
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ),
        ),
    );

    $variations = get_posts($args);

    foreach ($variations as $variation) {
        wp_delete_post($variation->ID, true); // Полное удаление
    }
}

2. Автоматизируем задачу с помощью WP-Cron

Чтобы запускать очистку регулярно, подключите функцию к WP-Cron. Добавьте в functions.php:

if (!wp_next_scheduled('wpcore_delete_inactive_variations_cron')) {
    wp_schedule_event(time(), 'daily', 'wpcore_delete_inactive_variations_cron');
}
add_action('wpcore_delete_inactive_variations_cron', 'wpcore_delete_inactive_variations');

Этот код инициирует ежедневный запуск очистки.

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

1. Выполните SQL-запрос из раздела диагностики — количество неактивных вариаций должно быть уменьшено или равно нулю.
2. В админке WooCommerce проверьте список вариаций для товаров — неактивные вариации удалены.
3. Просмотрите логи ошибок, чтобы убедиться, что функция не вызывает сбои.
4. Для теста можно временно изменить расписание WP-Cron на более частое (например, hourly) и проверить результаты.

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

  • Удаляются нужные вариации. Проверьте условия post_status и meta_query. Возможно, стоит добавить дополнительные фильтры, например, исключить вариации с определенными атрибутами.
  • Функция не запускается по расписанию. Проверьте, работает ли WP-Cron на сервере. Можно протестировать вручную через do_action('wpcore_delete_inactive_variations_cron');.
  • Высокая нагрузка при удалении большого количества вариаций. Разбейте процесс на партии с помощью параметра 'posts_per_page' и пагинации.

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

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

Сравнение подходов: плагин vs код vs компромисс

ПодходПлюсыМинусы
Плагин (например, WP Sweep)Простота использования, готовый интерфейсМожет удалять лишнее, нагрузка на сайт, ограниченная кастомизация
Код (как в статье)Точная настройка, автоматизация, контрольТребует навыков разработки, возможны ошибки при неправильном коде
Компромисс (плагин + кастомный код)Быстрый старт + гибкостьСложнее поддерживать, возможны конфликты
Как отключить автоматические обновления в WordPress: подробное руководство
24.02.2026
WooCommerce: как автоматически очищать базу от старых и отменённых заказов
16.05.2026
Как автоматически отключать неиспользуемые плагины в WordPress
14.01.2026
WooCommerce: как автоматически удалять отменённые заказы по дате
05.05.2026
WooCommerce: автоматическое удаление неактивных заказов по дате
20.04.2026