Почему возникает задача удаления варианта товара после первой продажи
В интернет-магазинах на 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) | Полное удаление, освобождение места | Невозможность восстановления, риск ошибок при ссылках | |
| Отключение варианта (post_status = draft) | Вариант скрыт, можно восстановить | Занимает место в базе, не удаляет данные | |
| Отключение варианта через атрибуты (custom field) | Гибкое управление отображением | Требует доработок шаблонов | Добавление мета-поля и фильтрация вывода |