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

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

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

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

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

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

  • Цена вариации не задана или равна 0
  • Артикул (SKU) отсутствует
  • Статус вариации — черновик или скрыт
  • Отсутствует физический запас товара (stock = 0 и управление запасами включено)

В админке WooCommerce можно фильтровать вариации по статусу, но для комплексной проверки нужна кастомная выборка.

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

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

1. Создаем функцию для поиска и удаления

function wptest_delete_empty_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => ['publish', 'private', 'draft'],
    ];

    $variations = get_posts($args);
    $deleted = 0;

    foreach ($variations as $variation) {
        $variation_id = $variation->ID;
        $price = get_post_meta($variation_id, '_price', true);
        $sku = get_post_meta($variation_id, '_sku', true);
        $stock_qty = get_post_meta($variation_id, '_stock', true);
        $manage_stock = get_post_meta($variation_id, '_manage_stock', true);

        // Критерии удаления
        if ((empty($price) || $price == 0) && empty($sku)) {
            wp_delete_post($variation_id, true);
            $deleted++;
            continue;
        }

        // Если управление запасами включено и запас равен 0
        if ($manage_stock === 'yes' && intval($stock_qty) <= 0) {
            wp_delete_post($variation_id, true);
            $deleted++;
        }
    }

    return $deleted;
}

2. Запуск функции вручную или по расписанию

Для теста можно вызвать функцию в файле functions.php или через админ-панель, например, с помощью админ-страницы или плагина для запуска PHP кода.

add_action('admin_init', function() {
    if (isset($_GET['wptest_delete_variations'])) {
        $count = wptest_delete_empty_variations();
        echo "Удалено пустых вариаций: " . $count;
        exit;
    }
});

Для автоматизации стоит добавить WP-Cron задачу:

if (!wp_next_scheduled('wptest_cron_delete_empty_variations')) {
    wp_schedule_event(time(), 'daily', 'wptest_cron_delete_empty_variations');
}
add_action('wptest_cron_delete_empty_variations', 'wptest_delete_empty_variations');

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

  • Перейдите в WooCommerce → Товары → Вариации и убедитесь, что пустых вариаций больше нет.
  • Выполните SQL-запрос для проверки количества вариаций с пустой ценой:
    SELECT COUNT(*) FROM wp_posts p
    JOIN wp_postmeta pm ON p.ID = pm.post_id
    WHERE p.post_type = 'product_variation'
    AND pm.meta_key = '_price'
    AND (pm.meta_value IS NULL OR pm.meta_value = '' OR pm.meta_value = '0');
  • Проверьте логи ошибок и подтверждение удаления (если реализовано логирование).

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

  • Неправильный пост-тип или статус: убедитесь, что ищете именно product_variation с нужными статусами (publish, private, draft).
  • Удаление вариаций, которые используются: проверьте, что вариация не связана с активными товарами, иначе удаление приведет к ошибкам на фронтенде.
  • Отсутствие прав на удаление: функция должна запускаться с правами администратора или через WP-Cron.
  • WP-Cron не работает: проверьте, что на сервере включен WP-Cron и нет блокировок.

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

  • Перед массовым удалением всегда создавайте резервную копию базы данных.
  • Используйте wp_delete_post($id, true), чтобы полностью удалить вариацию, включая метаданные.
  • Для больших магазинов ограничьте количество удаляемых вариаций за один запуск, чтобы избежать таймаутов:
function wptest_delete_empty_variations_chunked($limit = 50) {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => $limit,
        'post_status'    => ['publish', 'private', 'draft'],
    ];
    // ... остальной код как в основной функции
}
  • Регулярно очищайте базу данных с помощью плагинов вроде Clearfy Pro для удаления мусорных данных.
  • Логируйте удаление, чтобы отслеживать процесс и ошибки.
Как создать автотагировку постов в WordPress: практическое руководство
02.04.2026
Как правильно удалить вариации товаров в WooCommerce
02.05.2026
Как автоматизировать удаление старых записей в WordPress через WP-Cron
23.02.2026
Как сделать безопасный вход в WordPress с помощью двухфакторной авторизации
26.11.2025
Как установить ограничения на размер загружаемых файлов в WordPress
29.12.2025