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

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

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

Как понять, что вариации неиспользуемы?

  • Вариация не отображается на странице товара;
  • Вариация не участвует в заказах после определенного срока;
  • Вариация отсутствует в списках доступных для покупки;
  • В базе данных вариация присутствует, но ее количество равно 0 и она не активна.

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

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

<?php
add_action('woocommerce_order_status_completed', 'auto_delete_unused_variations_after_sale', 10, 1);
function auto_delete_unused_variations_after_sale($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if ($product && $product->is_type('variation')) {
            $parent_id = $product->get_parent_id();
            $variation_id = $product->get_id();

            // Проверяем, есть ли еще продажи этой вариации
            $args = array(
                'post_type' => 'shop_order',
                'post_status' => array('wc-completed', 'wc-processing'),
                'posts_per_page' => 1,
                'meta_query' => array(
                    array(
                        'key' => '_product_id',
                        'value' => $variation_id,
                        'compare' => '=',
                    ),
                ),
            );

            $query = new WP_Query($args);

            if ($query->found_posts <= 1) { // Только текущий заказ содержит эту вариацию
                // Удаляем вариацию
                wp_delete_post($variation_id, true);
            }
            wp_reset_postdata();
        }
    }
}
?>

Пояснения к коду:

  • Хук запускается при смене статуса заказа на «завершен»;
  • Для каждого варианта товара проверяется, встречается ли он в других заказах с активным статусом;
  • Если вариация больше не используется, удаляем ее без возможности восстановления (wp_delete_post($variation_id, true));
  • Используйте с осторожностью, обязательно тестируйте на тестовой среде.

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

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

  1. Создайте тестовый заказ с вариацией товара;
  2. Завершите заказ, изменив его статус на «завершен»;
  3. Проверьте в админке WooCommerce, существует ли вариация товара;
  4. Если вариация использовалась только в данном заказе и больше не нужна, она должна быть удалена;
  5. Для проверки состояния базы данных можно использовать запрос в phpMyAdmin:
SELECT ID, post_title FROM wp_posts WHERE post_parent = [ID_родительского_товара] AND post_type = 'product_variation';
<

Если вариация удалена — запроса не вернет ее.

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

  • Вариации не удаляются после продажи: Проверьте правильность ID вариаций и статусов заказов. Возможно, в базе данных мета-ключ _product_id не используется для хранения вариаций — тогда нужно искать другие способы проверки заказов с вариациями.
  • Удаление нужных вариаций: Скрипт удаляет вариации без проверки их использования на сайте. Добавьте дополнительные проверки наличия вариации в каталоге или запасах.
  • Ошибка при работе с WP_Query: Ключ _product_id может не соответствовать таблице. Вместо этого можно использовать фильтрацию через woocommerce_order_items и woocommerce_order_itemmeta для получения вариаций из заказа.

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

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

Альтернативные методы: плагин vs код

МетодПреимуществаНедостатки
Самописный код (как в статье)Точный контроль логики, отсутствие лишних функций, высокая производительностьТребует навыков программирования, риск ошибочного удаления, необходимость тестирования
Плагины очистки WooCommerceПростота использования, наличие дополнительных функций (например, резервное копирование)Часто перегружены функциями, могут замедлять сайт, возможны конфликты с другими плагинами
⭐⭐⭐⭐⭐