Диагностика задачи: зачем удалять товар после первого заказа
В некоторых сценариях требуется, чтобы товар исчезал из каталога сразу после того, как его купят впервые. Например, при продаже уникальных лотов, ограниченных по количеству, или при реализации акций с единичными товарами. WooCommerce по умолчанию не умеет автоматически удалять продукты после покупки — для этого нужна кастомизация.
Как понять, что товар не удаляется автоматически
- Товар остаётся в каталоге даже после оформления заказа с ним.
- Запись товара не меняет статус, не скрывается и не удаляется.
- В админке WooCommerce товар по-прежнему отображается как опубликованный.
Пошаговое решение: автоматическое удаление товара после первого заказа
Для реализации решения нам нужно:
- Отслеживать статус заказа, когда он становится «завершённым» (completed).
- Выбирать все товары из заказа.
- Удалять товары программно, используя стандартные функции WordPress.
Для этого добавим следующий код в functions.php вашей темы или в кастомный плагин:
add_action('woocommerce_order_status_completed', 'wc_delete_products_after_first_order', 10, 1);
function wc_delete_products_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_id = $item->get_product_id();
if ($product_id) {
// Проверяем, существует ли товар
$product = wc_get_product($product_id);
if ($product) {
// Удаляем товар без возможности восстановления (force delete)
wp_delete_post($product_id, true);
}
}
}
}Объяснение кода:
- Хук
woocommerce_order_status_completedвызывается при смене статуса заказа на «завершённый». - Функция получает объект заказа, перебирает все позиции (товары) и удаляет их с помощью
wp_delete_postс параметромtrue, чтобы обойти корзину.
Вариант с изменением статуса товара вместо удаления
Если хотите не удалять сразу, а скрывать товар (например, чтобы сохранить данные), замените удаление на смену статуса:
$product->set_status('draft');
$product->save();Проверка результата после внедрения
- Создайте тестовый заказ с одним или несколькими товарами.
- Переведите его статус в «завершённый» через админку WooCommerce.
- Проверьте каталог товаров: заказанные позиции должны исчезнуть (либо стать черновиками).
- В админке WordPress убедитесь, что товары удалены или имеют нужный статус.
Частые ошибки и как их исправить
- Товары не удаляются: Проверьте, что код добавлен в правильное место и активен. Убедитесь, что хук
woocommerce_order_status_completedсрабатывает (можно добавитьerror_logдля отладки). - Удаляются не все товары из заказа: Возможно, некоторые товары — вариации. Используйте
$item->get_variation_id()для удаления вариаций, если нужно. - Удаление товара нарушает работу связанных данных: Обдумайте, не нужны ли вам связи с заказами, статистикой или SEO. Вместо удаления можно переводить товар в статус «черновик».
- Проблемы с правами: Убедитесь, что пользователь, под которым запускается код, имеет права на удаление постов.
Практические советы по безопасности и производительности
- Удаление товаров — необратимая операция, лучше делать резервные копии базы перед внедрением.
- Если магазин большой, удаление многих товаров одновременно может замедлить работу. Рассмотрите отложенную обработку через WP-Cron.
- Для прозрачности и аудита можно логировать ID удаляемых товаров в отдельный файл или метаполе.
- В случае использования вариаций учитывайте, что их нужно удалять отдельно от родительского товара.
Сравнение методов удаления товара после заказа
| Метод | Плюсы | Минусы |
|---|---|---|
| Полное удаление (wp_delete_post) | Товар полностью исчезает, экономия места | Невозможность восстановления, потеря связанной статистики |
| Перевод в статус черновика | Можно восстановить, сохраняется история | Товар остаётся в базе, может отображаться в поиске, если не фильтровать |
| Удаление вариаций отдельно | Точный контроль над данными вариаций | Сложнее реализовать, нужен дополнительный код |