Диагностика задачи: зачем удалять товар после первого заказа
В некоторых нишах интернет-магазинов на WooCommerce требуется, чтобы товар удалялся сразу после его первой продажи. Например, уникальные лимитированные товары, цифровые лицензии с одним доступом, или товары, которые нельзя продавать повторно. В стандартном WooCommerce нет такой функции, поэтому приходится реализовывать это самостоятельно или с помощью кастомных хаков.
Пошаговое решение: удаление товара после первого заказа
1. Подключение к событию создания заказа
Для начала нужно отследить момент, когда заказ успешно создан и оплачен. Для этого лучше использовать хук woocommerce_order_status_completed, который срабатывает при смене статуса заказа на «завершён». Такой подход гарантирует, что заказ действительно оплачен.
add_action('woocommerce_order_status_completed', 'remove_products_after_first_order');
function remove_products_after_first_order($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
wp_delete_post($product_id, true); // Полное удаление товара
}
}
2. Дополнительная проверка — удалять только уникальные товары
Если в магазине много товаров, и удалять нужно только определённые (например, с мета-полем или определённой категорией), добавьте проверку:
add_action('woocommerce_order_status_completed', 'remove_unique_products_after_order');
function remove_unique_products_after_order($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$is_unique = get_post_meta($product_id, '_is_unique_product', true);
if ($is_unique) {
wp_delete_post($product_id, true);
}
}
}
Для пометки товара как уникального добавьте мета-ключ _is_unique_product со значением 1.
Проверка результата после внедрения
Для проверки:
- Создайте тестовый заказ с товаром, который должен удаляться.
- Измените статус заказа на «завершён» в админке WooCommerce.
- Проверьте в админке «Товары» — товар должен исчезнуть.
- Проверьте в базе данных (таблица wp_posts) — соответствующая запись должна быть удалена.
Частые ошибки и их исправление
- Товар не удаляется после смены статуса заказа. Проверьте, срабатывает ли хук
woocommerce_order_status_completed. Можно добавитьerror_logвнутри функции для отладки. - Удаляется не тот товар. Убедитесь, что используете
$item->get_product_id(), а не$item->get_variation_id(), если товары вариативные. Для вариаций может потребоваться удалять именно вариацию. - Удаление вызывает ошибки или удаляется продукт с заказами. Убедитесь, что используется
wp_delete_post($product_id, true)для полного удаления, и что нет ограничений на удаление в вашей базе. - Функция удаляет все товары. Добавьте условия для фильтрации товаров, если нужно удалять не все.
Практические советы по безопасности и производительности
- Удаление товара — необратимая операция. Рекомендуется делать резервные копии базы данных перед внедрением.
- Если товаров много или заказы создаются часто, удаление может нагружать сервер. Для оптимизации можно ставить удаление в очередь с помощью WP-Cron.
- Для безопасности проверьте права пользователя и не запускайте удаление, если заказ создан в тестовом режиме.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
Удаление через хук woocommerce_order_status_completed | Простая реализация, удаление после оплаты | Нельзя отменить удаление, нагрузка при массовых заказах |
| Добавление флага и удаление через отдельный WP-Cron | Контролируемая нагрузка, можно отменить удаление | Сложнее в реализации, задержка удаления |
| Использование плагина для управления продажами уникальных товаров | Готовое решение, дополнительный функционал | Дополнительные расходы, возможная избыточность |