Диагностика задачи: зачем удалять товар после оплаты в WooCommerce
В некоторых сценариях, например, при продаже уникальных товаров или ограниченных лотов, может потребоваться автоматически удалять товар из каталога сразу после успешной оплаты заказа. Это предотвращает повторную покупку и упрощает управление ассортиментом. В типичной установке WooCommerce такой функционал отсутствует, поэтому его нужно реализовать вручную или через кастомный код.
Пошаговое решение: удаление товара после оплаты
1. Подключение к хуку смены статуса заказа
Для автоматизации удаления товара после оплаты используем хук woocommerce_order_status_completed, который срабатывает при переходе заказа в статус «завершён».
2. Получение товаров из заказа
Из объекта заказа получаем все позиции товаров, чтобы затем удалить соответствующие записи товаров.
3. Удаление товаров программно
Удаляем товары вызовом функции wp_delete_post с ID товара. Важно указать аргумент true, чтобы удалить пост без возможности восстановления.
add_action('woocommerce_order_status_completed', 'wpid_delete_products_after_payment', 10, 1);
function wpid_delete_products_after_payment($order_id) {
$order = wc_get_order($order_id);
if (!$order) {
return;
}
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if ($product_id) {
wp_delete_post($product_id, true); // удаляем товар без возможности восстановления
}
}
}
4. Дополнительные проверки перед удалением
Чтобы не удалять товары случайно, можно добавить проверку категории или метаполя, например, только удалять товары из категории "Уникальные". Это снизит риск ошибок.
add_action('woocommerce_order_status_completed', 'wpid_delete_unique_products_after_payment', 10, 1);
function wpid_delete_unique_products_after_payment($order_id) {
$order = wc_get_order($order_id);
if (!$order) {
return;
}
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if ($product_id && has_term('unikalnye', 'product_cat', $product_id)) {
wp_delete_post($product_id, true);
}
}
}
Проверка результата после внедрения
- Создайте тестовый товар в категории "Уникальные".
- Создайте заказ с этим товаром и оплатите его (можно в режиме теста).
- После смены статуса заказа на "завершён" проверьте, что товар удалился из каталога (админка WooCommerce — Товары).
- Если товар остался, проверьте логи ошибок и наличие категории у товара.
Частые ошибки и как исправить
- Товар не удаляется: Проверьте, правильно ли указан ID товара, и что хук срабатывает при смене статуса. Используйте
error_logдля отладки. - Удаляются не те товары: Добавьте фильтр по категории или метаполю, чтобы ограничить действие.
- Удаление вызывает ошибки: Убедитесь, что у пользователя, под которым работает код, есть права на удаление постов.
- Удалённый товар остаётся в кэше: Очистите кэш сайта и браузера после тестирования.
Практические советы по безопасности и производительности
- Удаляйте товары только после подтверждения оплаты — используйте статус
completed, а неprocessing, чтобы избежать удаления при отменённых платежах. - Для больших заказов с множеством товаров можно реализовать пакетное удаление с ограничением по времени выполнения, чтобы избежать таймаутов PHP.
- Резервное копирование перед внедрением кода — обязательно, чтобы восстановить данные при ошибках.
- Для сайтов с высокой нагрузкой удаление товаров вручную может быть затратным — рассмотрите отложенное удаление через крон-задачи.
Сравнение вариантов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Код через хук woocommerce_order_status_completed | Прямое удаление товара после оплаты | Простота, контроль | Риск удаления нужных товаров, требует проверки |
| Плагин для управления товарами | Использование готовых решений с настройками | Удобство, интерфейс | Может быть избыточным, нагрузка |
| Отложенное удаление через WP-Cron | Удаление по расписанию после проверки | Безопаснее, меньше риска ошибок | Задержки в удалении |