wpwebsite.ru wordpress WPWebSite

Как удалить вариант товара WooCommerce после первой продажи

Почему возникает задача удаления варианта товара после первой продажи

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

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

Диагностика: как определить, что вариант продан

В WooCommerce каждый вариант товара — это отдельный продукт с типом product_variation. Информация о продажах хранится в мета-данных заказов и связана с ID товара.

Чтобы проверить, был ли продан вариант товара, нужно:

  • Получить ID варианта.
  • Проверить наличие заказов, где этот вариант встречается и статус заказа — completed или processing.

Для диагностики можно выполнить SQL-запрос или использовать WP_Query с мета-запросом по заказам.

Шаги решения: удаление варианта товара после первой продажи

1. Создаем функцию, которая проверяет первые продажи варианта

function is_variation_sold( $variation_id ) {
    $args = array(
        'limit' => 1,
        'status' => array( 'completed', 'processing' ),
        'return' => 'ids',
        'meta_query' => array(
            array(
                'key' => '_product_id',
                'value' => $variation_id,
                'compare' => '='
            ),
        ),
    );

    $orders = wc_get_orders( $args );
    return ! empty( $orders );
}

Примечание: В WooCommerce нет стандартного мета-поля _product_id в заказах, поэтому для проверки продаж варианта нужно использовать функцию обхода позиций заказа (line items).

2. Правильная проверка продаж варианта по позициям заказа

function is_variation_sold( $variation_id ) {
    $args = array(
        'limit' => -1,
        'status' => array( 'completed', 'processing' ),
    );
    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        foreach ( $order->get_items() as $item ) {
            if ( $item->get_variation_id() === $variation_id ) {
                return true;
            }
        }
    }
    return false;
}

3. Автоматическое удаление варианта после первой продажи с помощью хука

Используем хук woocommerce_order_status_completed — срабатывает при смене статуса заказа на «завершен».

add_action( 'woocommerce_order_status_completed', 'remove_variations_after_first_sale' );

function remove_variations_after_first_sale( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        return;
    }

    foreach ( $order->get_items() as $item ) {
        $variation_id = $item->get_variation_id();
        if ( $variation_id && is_variation_sold( $variation_id ) ) {
            // Удаляем вариант
            wp_delete_post( $variation_id, true );
        }
    }
}

Обратите внимание: функция wp_delete_post с параметром true удаляет вариант без возможности восстановления. Если хотите временно скрыть вариант, рассмотрите изменение статуса публикации на draft.

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

  • Создайте тестовый вариант и оформите заказ с его использованием.
  • Переведите заказ в статус completed.
  • Проверьте, удалился ли вариант из админки WooCommerce (Продукты → Вариации).
  • Попробуйте оформить новый заказ с этим вариантом — он должен быть недоступен.

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

1. Функция не находит проданный вариант

Причина: неправильная проверка позиций заказа. Нужно использовать $item->get_variation_id(), а не $item->get_product_id() или мета-поля.

2. Вариант не удаляется после смены статуса заказа

Проверьте, что хук подключен правильно и что статус заказа действительно меняется на completed. Для отладки можно добавить временный лог:

error_log( 'Order status changed: ' . $order_id );

3. Удаление варианта приводит к ошибкам на сайте

Удаление варианта — необратимая операция. Если на сайте используются ссылки на этот вариант или он в корзине, могут появиться ошибки. Вместо удаления лучше менять статус варианта на draft:

wp_update_post( array(
    'ID' => $variation_id,
    'post_status' => 'draft'
) );

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

  • Оптимизация запросов: При большом количестве заказов функция is_variation_sold может работать медленно. Для оптимизации можно добавить кеширование результата или использовать прямые SQL-запросы с JOIN по таблицам WooCommerce.
  • Безопасность: Убедитесь, что код запускается только для администраторов или доверенных ролей, если добавляете UI для удаления вариантов вручную.
  • Журналирование: Ведите лог удалений вариантов для возможности восстановления или аудита.
  • Резервное копирование: Настройте автоматические бэкапы сайта (например, с помощью Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wpwebsite.ru&utm_medium=article&utm_campaign=woocommerce-udalenie-variantov-posle-pervoj-prodazhi) перед внедрением удаления вариантов.

Сравнение подходов удаления вариантов WooCommerce

СпособПреимуществаНедостаткиПример кода
Удаление варианта (wp_delete_post) Полное удаление, освобождение места Невозможность восстановления, риск ошибок при ссылках
wp_delete_post( $variation_id, true );
Отключение варианта (post_status = draft) Вариант скрыт, можно восстановить Занимает место в базе, не удаляет данные
wp_update_post( [ 'ID' => $variation_id, 'post_status' => 'draft' ] );
Отключение варианта через атрибуты (custom field) Гибкое управление отображением Требует доработок шаблонов Добавление мета-поля и фильтрация вывода
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »