Проблема: необходимость удалить товар из каталога после успешной оплаты
В некоторых интернет-магазинах требуется, чтобы после покупки товар удалялся из каталога — например, при продаже единичных уникальных товаров или цифровых продуктов с ограниченным доступом. WooCommerce по умолчанию не удаляет товар после оплаты, и для этого часто используют плагины, что не всегда удобно. Рассмотрим, как реализовать эту логику программно, без плагинов.
Диагностика задачи
Чтобы понять, когда именно удалять товар, нам нужно отследить завершение заказа и проверить его статус. WooCommerce меняет статус заказа на completed после успешной оплаты и обработки. Значит, нужно повесить обработчик на событие смены статуса заказа.
Какие хуки подходят для отслеживания успешной оплаты?
woocommerce_order_status_completed— вызывается при смене статуса на "completed"woocommerce_payment_complete— вызывается сразу после оплаты, но до смены статуса
Для надежности используем woocommerce_order_status_completed, так как это финальная точка, когда заказ полностью обработан.
Пошаговое решение
Ниже пример кода, который удаляет все товары из заказа после смены его статуса на "completed".
add_action('woocommerce_order_status_completed', 'wpmart_remove_products_after_payment', 10, 1);
function wpmart_remove_products_after_payment($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) {
// Удаляем продукт из базы данных
wp_delete_post($product_id, true); // true — без возможности восстановления
}
}
}
Этот код удалит все продукты, входящие в заказ, сразу после того, как заказ сменит статус на "completed".
Объяснение кода
- Хук
woocommerce_order_status_completedпередает ID заказа - Получаем объект заказа через
wc_get_order() - Перебираем все товары заказа
$order->get_items() - Извлекаем ID товара и удаляем его через
wp_delete_post()с параметромtrueдля полного удаления
Проверка результата после внедрения
- Создайте тестовый продукт и добавьте его в корзину
- Оформите заказ и переведите статус заказа вручную в панеле администратора в "Completed" или оплатите тестовой оплатой
- После смены статуса проверьте, что товар удалился из списка продуктов (
Товары → Все товары) - Если товар исчез — решение работает
- Для дополнительной проверки можно посмотреть в базе данных wp_posts, что запись о товаре удалена
Частые ошибки и как их исправить
- Товар не удаляется после оплаты: проверьте, что хук действительно срабатывает. Добавьте
error_log('Order completed: '.$order_id);внутри функции и проверьте логи. - Удаляется не тот товар или несколько раз: убедитесь, что вы используете
$item->get_product_id(), а не$item->get_variation_id()(если у вас вариации, возможно, нужна дополнительная логика) - Удаляется товар, который не нужно удалять: добавьте дополнительные проверки, например, по категории или метаполям, чтобы удалять только определенные товары
- Ошибка при удалении товара: проверьте права пользователя, от имени которого выполняется код, и что товар действительно существует
Практические советы по безопасности и производительности
- Удаление товаров — необратимая операция. Рекомендуется делать резервные копии базы данных перед внедрением такого функционала.
- Если у вас большой магазин, удаление большого количества товаров одновременно может вызвать нагрузку. Можно реализовать очередь на удаление через WP Cron.
- Для избирательного удаления добавьте проверку по метаполям, категориям или тегам, например:
if (has_term('unique', 'product_cat', $product_id)) {
wp_delete_post($product_id, true);
}
- Для логирования и отладки используйте
error_log()или плагины для мониторинга хуков. - Если вы используете кастомные типы продуктов, проверьте, что удаление не ломает связи с заказами и отчетами.
Сравнение методов удаления товара после оплаты
| Метод | Реализация | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Хук woocommerce_order_status_completed + wp_delete_post() | Быстро, без плагинов, гибко | Нужна аккуратность, риск удаления лишнего |
| Плагин | Плагины для управления товарами после оплаты | Простота, готовые настройки | Нагрузка, зависимости, может быть платным |
| Ручная очистка | Удаление товара вручную после оплаты | Безопасно, контроль | Трудоемко, не автоматично |