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

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

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

Проверить наличие неиспользуемых вариаций можно так:

SELECT p.ID, p.post_title, p.post_parent FROM wp_posts p
WHERE p.post_type = 'product_variation'
AND p.ID NOT IN (
  SELECT order_item_meta.meta_value FROM wp_woocommerce_order_itemmeta AS order_item_meta
  JOIN wp_woocommerce_order_items AS order_items ON order_item_meta.order_item_id = order_items.order_item_id
  WHERE order_items.order_item_type = 'line_item' AND order_item_meta.meta_key = '_variation_id'
);

Этот запрос возвращает вариации, которые не связаны с заказами, то есть фактически не используются в продажах.

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

  • Оптимизация базы данных — уменьшение таблиц wp_posts и wp_postmeta
  • Ускорение работы админки при редактировании товаров
  • Избежание путаницы при обновлении каталога

Пошаговое решение: автоматизация удаления вариаций после продажи

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

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

function wc_delete_unused_variations_after_order( $order_id ) {
    if ( ! $order_id ) return;

    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    $variations_to_check = [];

    foreach ( $order->get_items() as $item ) {
        $variation_id = $item->get_variation_id();
        if ( $variation_id ) {
            $variations_to_check[] = $variation_id;
        }
    }

    foreach ( $variations_to_check as $variation_id ) {
        // Проверяем, есть ли другие заказы с этой вариацией
        $args = [
            'post_type'      => 'shop_order',
            'post_status'    => [ 'wc-completed', 'wc-processing', 'wc-on-hold' ],
            'posts_per_page' => 1,
            'meta_query'     => [
                [
                    'key'     => '_variation_id',
                    'value'   => $variation_id,
                    'compare' => '=',
                ],
            ],
            'fields'         => 'ids',
            'exclude'        => [ $order_id ],
        ];

        $query = new WP_Query( $args );

        if ( ! $query->have_posts() ) {
            // Нет других заказов с этой вариацией — удаляем
            wp_delete_post( $variation_id, true );
        }
    }
}
add_action( 'woocommerce_thankyou', 'wc_delete_unused_variations_after_order' );

Шаг 2. Проверяем корректность работы функции

Сделайте тестовый заказ с новой вариацией, затем отмените или удалите все заказы с этой вариацией. После оплаты заказа функция проверит, есть ли другие продажи с этим вариантом, и если нет — удалит вариацию.

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

  • Запустите запрос из раздела диагностики до и после покупки
  • Проверьте в админке WooCommerce, что неиспользуемые вариации исчезают
  • Убедитесь, что вариации, которые все ещё продаются, не удаляются

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

  • Вариации удаляются слишком рано: Проверьте, что в запросе к заказам учитываются статусы wc-completed, wc-processing, wc-on-hold, а не только текущий заказ.
  • Удаление не происходит: Убедитесь, что хук woocommerce_thankyou вызывается и функция подключена.
  • Удаление вариаций влияет на текущие заказы: Всегда исключайте текущий заказ из запроса на поиск других заказов с вариацией.

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

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

Сравнение вариантов удаления неиспользуемых вариаций

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудозатратно, риск пропустить вариации
SQL-запросы для массового удаленияБыстрое удаление, подходит для админов с опытомРиск повредить данные, требует резервного копирования
Автоматизация через хук woocommerce_thankyouАвтоматически очищает базу, минимальные усилия после настройкиНагрузка при большом количестве заказов, требует тестирования
Как удалить дубликаты постов в WordPress с помощью кода
08.03.2026
WooCommerce: настройка и решение проблем с отпуском товаров
21.04.2026
Как удалить заблокированных пользователей в WordPress
05.03.2026
Как удалить пустые метаполя в WordPress с помощью кода
01.04.2026
WooCommerce: решение проблемы с неотображением вариаций товаров
02.06.2026