Диагностика задачи: зачем автоматически удалять вариации товаров
В интернет-магазинах на WooCommerce иногда возникает необходимость автоматически удалять вариации товара после того, как покупатель совершил первый заказ с этими вариантами. Такая схема полезна для магазинов с ограниченным количеством уникальных вариаций, либо в случаях с эксклюзивными товарами, где после продажи вариация должна быть недоступна.
Типичные ситуации:
- Ограниченный склад и уникальные варианты (цвет, размер и т.п.).
- Избежание повторных продаж одной и той же вариации.
- Автоматическая очистка каталога от проданных вариантов для упрощения управления.
Как определить, что вариация удаляется корректно
Перед автоматизацией важно проверить, что WooCommerce правильно идентифицирует вариацию, связанную с заказом. Для этого:
- Создайте тестовый заказ с вариацией товара.
- Через отладчик или логи найдите ID вариации из заказа.
- Убедитесь, что при удалении вариация исчезает из каталога, но основные данные товара остаются.
Пошаговое решение: код для автоматического удаления вариации после первого заказа
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('woocommerce_order_status_completed', 'delete_variations_after_first_order', 10, 1);
function delete_variations_after_first_order($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if (!$product) continue;
// Проверяем, что это вариация
if ($product->is_type('variation')) {
$variation_id = $product->get_id();
// Проверяем, не было ли уже заказов с этой вариацией
$args = [
'limit' => 1,
'status' => ['completed', 'processing'],
'meta_query' => [[
'key' => '_product_id',
'value' => $variation_id,
'compare' => '='
]],
];
// Альтернативный способ проверки заказов с вариацией
$has_orders = false;
$orders = wc_get_orders(['limit' => -1, 'status' => ['completed', 'processing']]);
foreach ($orders as $order_check) {
foreach ($order_check->get_items() as $order_item) {
if ($order_item->get_product_id() == $variation_id) {
$has_orders = true;
break 2;
}
}
}
// Удаляем вариацию, если это первый заказ
if ($has_orders) {
// Не удаляем, если есть другие заказы
continue;
} else {
wp_delete_post($variation_id, true); // жесткое удаление
}
}
}
}
Объяснение: Хук woocommerce_order_status_completed срабатывает при смене статуса заказа на «завершен». Функция проверяет все товары в заказе, и если это вариация, пытается удалить ее из базы, если это первый заказ с этой вариацией.
Проверка результата после внедрения
- Создайте тестовый заказ с вариацией.
- Обновите статус заказа на «завершен» в админке WooCommerce.
- Проверьте, что вариация товара исчезла из каталога (раздел «Товары» в админке).
- Создайте еще один заказ с этой же вариацией — он должен быть невозможен, так как вариация удалена.
Частые ошибки и как их исправить
- Вариации не удаляются после заказа: Убедитесь, что хук
woocommerce_order_status_completedсрабатывает. Возможно, статус заказа не меняется на «завершен» автоматически — проверьте это вручную. - Удаляются не те товары: Проверьте, что условие
$product->is_type('variation')корректно определяет вариации. - Ошибки в логах PHP: Проверьте синтаксис кода и наличие всех функций WooCommerce. Возможно, потребуется подключить зависимости.
- Повторные заказы с удалённой вариацией: Очистите кэш сайта и браузера, убедитесь, что вариация действительно удалена, а не отключена.
Практические советы по безопасности и производительности
- Безопасность: Используйте
wp_delete_post()с параметромtrueдля полного удаления вариации, чтобы не оставлять «мусор» в базе. - Производительность: Проверка всех заказов в коде может стать узким местом на больших базах. Для оптимизации можно хранить в метаполях информацию о статусе вариации или использовать кеширование.
- Резервное копирование: Перед внедрением автоматического удаления создайте резервную копию базы данных.
Сравнение способов удаления вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке WooCommerce | Простота, контроль | Трудозатратно при большом объеме |
| Автоматизация с хуком на статус заказа (код) | Полное удаление без участия администратора | Требует тестирования, нагрузка при большом кол-ве заказов |
| Использование сторонних плагинов | Готовые решения, поддержка | Могут быть избыточными, влиять на производительность |