Диагностика задачи: зачем удалять товар после оплаты
В стандартной работе WooCommerce после оплаты товар остается в каталоге. В некоторых сценариях, например при продаже уникальных или ограниченных в наличии товаров (например, билетов, цифровых ключей, уникальных предметов), возникает необходимость полностью удалить товар из базы после успешной оплаты, чтобы избежать повторных продаж.
Важно понимать, что WooCommerce не предлагает встроенных возможностей для удаления товара после заказа. Задача требует кастомного кода, работающего с хуками WooCommerce.
Как определить, что оплата прошла успешно
Для запуска удаления товара нужно поймать событие успешной оплаты заказа. В WooCommerce для этого подходит хук woocommerce_order_status_completed — он срабатывает, когда заказ переводится в статус "завершён" (completed), что означает успешную оплату и обработку.
Пример использования:
add_action('woocommerce_order_status_completed', 'delete_products_after_payment', 10, 1);Пошаговое решение: удаление товаров из заказа
1. Подключаем функцию к хуку woocommerce_order_status_completed.
2. Получаем из заказа ID продуктов.
3. Удаляем каждый продукт программно с помощью функции wp_delete_post( $product_id, true ) (второй аргумент true для безвозвратного удаления).
4. Логируем или отправляем уведомление, чтобы отследить успешное удаление.
Код решения:
add_action('woocommerce_order_status_completed', 'delete_products_after_payment', 10, 1);
function delete_products_after_payment( $order_id ) {
if ( ! $order_id ) {
return;
}
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
$deleted_products = [];
foreach ( $order->get_items() as $item ) {
$product_id = $item->get_product_id();
if ( $product_id ) {
// Удаляем товар навсегда
wp_delete_post( $product_id, true );
$deleted_products[] = $product_id;
}
}
if ( ! empty( $deleted_products ) ) {
error_log( 'Deleted products after payment: ' . implode( ',', $deleted_products ) );
}
}Проверка результата после внедрения
- Создайте тестовый заказ с одним или несколькими товарами.
- Оплатите заказ через тестовый платежный шлюз или вручную обновите статус заказа на "завершён" в админке.
- Проверьте, что товары из заказа исчезли из списка товаров WooCommerce (в разделе Товары).
- Посмотрите логи PHP или error_log для записи об удалённых товарах.
Частые ошибки и как исправить
- Товары не удаляются: Проверьте правильность подключения функции к хуку, наличие прав на удаление постов, статус заказа должен быть "completed".
- Удаляются не те товары: Убедитесь, что берется именно
$item->get_product_id(), а не$item->get_variation_id(), если вариации не должны удаляться. - Потеря данных о товаре: Удаление товара необратимо, всегда делайте резервные копии базы данных перед внедрением.
Практические советы по безопасности и производительности
- Добавьте проверку пользовательских ролей или метаполей товара, чтобы удалять только определённые товары, например, с меткой "одноразовый".
- Используйте транзакции базы данных, если используете сложные операции с заказами и товарами, чтобы избежать частичного удаления.
- Рассмотрите возможность архивирования товара вместо удаления, если требуется сохранить историю.
Сравнение подходов: плагин vs кастомный код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин | Простота установки, поддержка, интерфейс Автоматизация без кода | Может быть избыточным, загружать сайт Не всегда есть подходящий плагин |
| Кастомный код | Точная настройка под задачу Меньше нагрузки на сайт | Требует знаний PHP и WooCommerce Риск ошибок при некорректной реализации |