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

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

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

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

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

1. Определяем условие для удаления

Для примера удалим все вариации товара, у которых остаток на складе равен нулю.

2. Получаем ID товаров-родителей и их вариаций

Для выборки используем WP_Query с пост-типом product_variation и мета-запросом по запасам (_stock).

3. Используем функцию wp_delete_post() для удаления вариаций

Удаление происходит в цикле после проверки условия.

Пример кода:

function wc_delete_variations_with_zero_stock() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock',
                'value'   => '0',
                'compare' => '=',
                'type'    => 'NUMERIC'
            ]
        ],
        'fields'         => 'ids',
    ];

    $variations = get_posts($args);

    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true); // true - без перемещения в корзину
        }
    }
}

// Запускаем функцию один раз (например, через хук admin_init)
add_action('admin_init', 'wc_delete_variations_with_zero_stock');

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

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

  • Перейдите в редактирование родительского товара в админке WooCommerce и проверьте вкладку вариаций — вариации с остатком 0 должны исчезнуть.
  • Выполните SQL-запрос напрямую в базе для проверки отсутствия удалённых вариаций (если есть доступ):
SELECT ID, post_parent FROM wp_posts WHERE post_type = 'product_variation' AND ID IN (список удалённых ID) LIMIT 10;

Результат должен быть пустым.

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

  • Вариации не удаляются: Проверьте, что функция вызывается и что запрос возвращает вариации. Добавьте error_log() для отладки.
  • Удаляются не те вариации: Убедитесь, что условие meta_query корректно сформировано и ключ _stock используется именно для запасов.
  • После удаления появляются ошибки в заказах: Это значит, что заказы ссылаются на удалённые вариации. Отслеживайте связи и при необходимости удаляйте или обновляйте заказы.
  • Производительность снижается: При большом количестве вариаций разбивайте удаление на части, используйте WP-Cron для постепенного удаления.

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

  • Резервное копирование: Всегда создавайте бэкап базы перед массовым удалением данных.
  • Пакетное удаление: Не удаляйте тысячи вариаций за один запрос. Делайте это партиями по 100-200 штук.
  • Тестирование на копии сайта: Запускайте скрипты сначала на тестовом или локальном сервере.
  • Логирование: Добавляйте логи для контроля процесса удаления.
  • Оптимизация запросов: Индексируйте мета-ключи WooCommerce, если база большая.

Сравнение вариантов удаления вариаций

Метод Плюсы Минусы Когда применять
Удаление через админку Просто, визуально Много времени при большом количестве Малое число вариантов
Код на PHP (wp_delete_post) Автоматизация, точечные условия Требует навыков, риски ошибок Средние и большие магазины
SQL-запросы напрямую Быстро и массово Риск повреждения данных Эксперты с бэкапами
Как удалить комментарии по автору в WordPress
22.01.2026
Как избежать проблем с кешированием в WooCommerce: практическое руководство
23.05.2026
Автоматическое удаление старых transient через transient в WordPress
15.12.2025
Как удалить автоматически создаваемые категории в WordPress
03.04.2026
Использование хука woocommerce_checkout_create_order_line_items для изменения товаров в заказе WooCommerce
09.06.2026