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

Диагностика проблемы с вариациями в WooCommerce

На больших интернет-магазинах WooCommerce часто накапливаются неиспользуемые вариации товаров — например, вариации без заказов, которые создавались для тестов или остались от изменённых атрибутов. Такие вариации занимают место в базе данных, замедляют загрузку страниц и усложняют управление товарами.

Чтобы определить, есть ли неиспользуемые вариации, можно проверить наличие вариаций без продаж и без наличия на складе. Простой SQL-запрос для диагностики:

SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_woocommerce_order_itemmeta oim ON p.ID = oim.meta_value
WHERE p.post_type = 'product_variation'
AND oim.meta_key = '_variation_id'
AND oim.meta_value IS NULL;

Этот запрос возвращает вариации, которые не связаны с заказами в магазине.

Пошаговое решение: удаление неиспользуемых вариаций через PHP

1. Создаём функцию для выборки неиспользуемых вариаций

Ниже пример кода, который ищет вариации без заказов и без остатков на складе, а затем удаляет их:

function delete_unused_variations() {
    global $wpdb;

    // Получаем ID вариаций без заказов
    $variations = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON p.ID = oim.meta_value AND oim.meta_key = '_variation_id'
         LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_stock'
         WHERE p.post_type = 'product_variation'
         GROUP BY p.ID
         HAVING COUNT(oim.meta_value) = 0 AND (pm.meta_value IS NULL OR pm.meta_value = '0')"
    );

    if (empty($variations)) {
        return "Не найдено неиспользуемых вариаций для удаления.";
    }

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true);
    }

    return 'Удалено вариаций: ' . count($variations);
}

2. Запуск функции через WP-CLI или временный вызов

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

add_action('init', function() {
    if (current_user_can('administrator') && isset($_GET['delete_unused_variations'])) {
        echo delete_unused_variations();
        exit;
    }
});

После вызова удалите этот код или уберите параметр из URL.

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

  • Запустите SQL-запрос из раздела «Диагностика» повторно. Он должен вернуть пустой результат.
  • Проверьте админку WooCommerce — количество вариаций должно уменьшиться.
  • Просмотрите журнал ошибок и логи сервера: не должно быть ошибок удаления.

Частые ошибки и способы их исправления

  • Удаляются активные вариации с остатками — Проверьте правильность условий в запросе, особенно проверку наличия на складе (_stock).
  • Функция ничего не удаляет — Возможно, вариаций без заказов и остатков нет. Проверьте выборку в SQL отдельно.
  • Зависания при большом количестве вариаций — Реализуйте удаление пакетами, добавляя LIMIT и вызывая функцию несколько раз.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Используйте WP-CLI для запуска массовых операций — это снижает нагрузку на сайт и позволяет удобнее контролировать процесс.
  • Удаляйте вариации пакетами по 100–200 штук, чтобы избежать тайм-аутов.
  • Для автоматизации можно настроить WP-Cron с запуском функции удаления раз в месяц.

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

МетодПреимуществаНедостатки
Плагин (например, WP Sweep, Advanced Database Cleaner)Удобный интерфейс, безопасные проверки, автоматизацияМогут быть избыточными, влияют на производительность, не всегда гибкие
Код (как в статье)Полный контроль, минимальная нагрузка, гибкость под задачуТребует навыков, риск ошибок без тестирования
Как создать динамический список постов с фильтрами в WordPress без плагинов
19.12.2025
Настройка отправки сообщений из WPForms через SMTP SendGrid
11.02.2026
Как заблокировать и удалить злоупотребления в WooCommerce через .htaccess
02.05.2026
WooCommerce: как автоматически удалять неиспользуемые вариации товаров после продажи
23.07.2026
Как создать свой плагин для WordPress с настройками
19.11.2025