Диагностика задачи: зачем удалять товар из заказа после оплаты
В WooCommerce стандартное поведение — после оплаты заказ считается завершённым и товаров в нём не меняют. Но бывают кейсы, когда нужно автоматически удалить определённые товары из заказа после успешной оплаты. Например, если товар — это одноразовая услуга или цифровой ключ, который нельзя повторно предоставить, или товар заменяется на другой автоматически.
Перед реализацией важно проверить, действительно ли требуется удалять товар из заказа, а не, например, менять статус заказа или создавать новый.
Пошаговое решение: удаление товара после оплаты через хук WooCommerce
WooCommerce предоставляет хук woocommerce_payment_complete, который срабатывает после успешной оплаты. На него можно повесить функцию, которая удалит нужные товары из заказа.
Пример кода для удаления товара с определённым ID из заказа после оплаты
add_action('woocommerce_payment_complete', 'wplock_remove_product_after_payment');
function wplock_remove_product_after_payment($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
$product_id_to_remove = 123; // ID товара, который нужно удалить
foreach ($order->get_items() as $item_id => $item) {
if ($item->get_product_id() == $product_id_to_remove) {
$order->remove_item($item_id);
}
}
$order->calculate_totals(); // Пересчитать итоговую сумму
$order->save(); // Сохранить изменения
}
Этот код удалит из заказа товар с ID 123 после оплаты. Можно адаптировать условие, например, удалить все товары определённой категории или по метке.
Проверка результата после внедрения
- Создайте тестовый заказ с нужным товаром.
- Оплатите заказ (используйте тестовый платежный шлюз, например,
ChequeилиCash on deliveryдля проверки). - Перейдите в админку WooCommerce — заказы и откройте заказ.
- Убедитесь, что товар с указанным ID отсутствует в списке товаров заказа.
- Проверьте итоговую сумму заказа — она должна быть пересчитана без стоимости удалённого товара.
Частые ошибки и как их исправить
- Товар не удаляется после оплаты
Проверьте, правильно ли указан ID товара. Используйтеerror_logилиvar_dumpвнутри функции, чтобы убедиться, что она вызывается. - Заказ не пересчитывается и итоговая сумма не меняется
Убедитесь, что вы вызываете$order->calculate_totals();и$order->save();после удаления товаров. - Функция вызывается несколько раз
Хукwoocommerce_payment_completeможет срабатывать повторно. Добавьте проверку-флаг в мета заказа, чтобы избежать повторного удаления. - Ошибка при удалении товаров с вариациями
При работе с вариациями проверяйте$item->get_variation_id(), если нужно удалить вариацию.
Практические советы по безопасности и производительности
- Не удаляйте товары из заказов, если они нужны для истории покупок или аналитики. Лучше менять статус или создавать дополнительный мета-поле.
- Удаление товаров — операция с изменением данных заказа. Всегда делайте резервные копии базы перед внедрением.
- Используйте проверку nonce и права пользователя, если добавляете интерфейс для удаления товаров вручную.
- Оптимизируйте работу с заказом, минимизируя количество вызовов
save(), вызывайте её один раз после всех изменений.
Сравнение подходов удаления товаров из заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Удаление через хук woocommerce_payment_complete | Автоматическая очистка после оплаты | Автоматизация, простой код | Может нарушить историю заказов, риск ошибок |
| Изменение статуса товара или заказа | Меняем статус вместо удаления | Сохраняется история, безопаснее | Требует дополнительной логики отображения |
| Создание нового заказа без удалённых товаров | Переносим товары в новый заказ | Полный контроль над заказом | Сложнее реализовать, больше операций с БД |