Диагностика задачи: зачем удалять товар после продажи в WooCommerce?
В стандартной логике WooCommerce товары остаются в каталоге после продажи, что удобно для повторных заказов. Однако в некоторых нишах — например, при продаже уникальных или лимитированных товаров — нужно автоматически удалять товар после первой успешной покупки, чтобы предотвратить повторные заказы и избежать ручной работы.
Проверим, есть ли у вас подобная задача. Если вы продаёте уникальные вещи, единичные билеты, услуги с ограниченным числом или цифровые продукты с лимитом, автоматическое удаление избавит вас от ошибок и ускорит обработку заказов.
Как реализовать автоматическое удаление товара после успешного заказа
1. Критерии срабатывания
Удалять нужно только те товары, которые были куплены в завершённом (статус "завершён") заказе. Лучше ограничить по типу товара или категории, чтобы не удалять все подряд.
2. Используем хук woocommerce_order_status_completed
Этот хук срабатывает при смене статуса заказа на «завершённый». Напишем функцию, которая проверит товары в заказе и удалит их.
add_action('woocommerce_order_status_completed', 'wpq_delete_products_after_sale', 10, 1);
function wpq_delete_products_after_sale($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();
$product = wc_get_product( $product_id );
// Проверяем тип товара, например, только простые
if ( $product && $product->is_type('simple') ) {
// Удаляем товар
wp_delete_post( $product_id, true );
}
}
}
3. Ограничение удаления по категории
Если нужно удалять товары только из конкретной категории, добавьте проверку:
if ( has_term( 'unikalnye-tovary', 'product_cat', $product_id ) ) {
wp_delete_post( $product_id, true );
}
Проверка результата после внедрения
1. Создайте тестовый товар и добавьте его в заказ.
2. Измените статус заказа на завершён вручную в админке WooCommerce.
3. Проверьте, что товар исчез из каталога (в разделе Товары).
4. Убедитесь, что удаление произошло без ошибок — проверьте логи сервера и ошибок WordPress (если включён WP_DEBUG).
Частые ошибки и как их исправить
- Товар не удаляется: проверьте права пользователя, под которым выполняется код; убедитесь, что ваш код подключен и хук срабатывает.
- Удаляются не те товары: добавьте дополнительные проверки по типу и категории товара.
- Удаление приводит к ошибкам базы: убедитесь, что используете
wp_delete_post( $product_id, true )с параметром true для полного удаления. - Удалённые товары остаются в кэше: очистите кэш сайта и кэш браузера.
Практические советы по безопасности и производительности
- Перед удалением товара можно создать резервную копию или переместить его в черновики, заменив
wp_delete_postнаwp_trash_post. - Если на сайте много заказов одновременно, удаление большого количества товаров может нагружать сервер — оптимальнее удалять товары пакетно через cron.
- Ограничьте удаление только товарами нужного типа и категории, чтобы избежать случайного удаления.
- Добавьте логирование действий удаления, чтобы отслеживать процесс и ошибки.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
Удаление с помощью хука woocommerce_order_status_completed | Простая реализация, удаление сразу после покупки | Нагрузка при большом числе заказов, риск удаления нужных товаров без фильтров | Малые и средние магазины с уникальными товарами |
| Удаление по cron с периодической проверкой заказов | Меньшая нагрузка, возможность пакетной обработки | Задержка удаления, сложнее в реализации | Большие магазины, много заказов |
| Ручное удаление через админку | Максимальный контроль | Ручной труд, риск ошибки | Магазины с редкими уникальными товарами |