Проблема: необходимость удаления заказов после успешной оплаты
Иногда возникает задача автоматически удалять заказы WooCommerce после того, как оплата подтверждена. Это может быть актуально для цифровых товаров с ограниченным тиражом, тестовых заказов или для очищения базы от неактуальных записей.
По умолчанию WooCommerce не предоставляет встроенного инструмента для удаления заказов после оплаты. Нужно реализовать кастомное решение, учитывая, что удаление заказов напрямую может повлиять на отчёты и интеграции.
Диагностика проблемы: почему заказы не удаляются автоматически
- Отсутствует триггер на событие успешной оплаты заказа.
- Попытка удаления заказа происходит раньше, чем WooCommerce обновит статус.
- Удаление через нестандартные методы приводит к ошибкам в базе.
Пошаговое решение: удаление заказов после смены статуса на "оплачен"
1. Используем хук woocommerce_order_status_completed
Этот хук срабатывает, когда заказ меняет статус на "завершён" — обычно после успешной оплаты.
2. Добавляем функцию удаления заказа
add_action('woocommerce_order_status_completed', 'wp24_delete_order_after_payment', 10, 1);
function wp24_delete_order_after_payment($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Проверка типа заказа (например, только цифровые товары)
$items = $order->get_items();
$only_virtual = true;
foreach ($items as $item) {
if (!$item->get_product()->is_virtual()) {
$only_virtual = false;
break;
}
}
if ($only_virtual) {
// Удаляем заказ
wp_delete_post($order_id, true);
}
}В данном примере удаляем только заказы с виртуальными товарами. При необходимости условие можно менять под свои требования.
Проверка результата после внедрения
- Создайте тестовый заказ с виртуальным товаром.
- Произведите оплату, чтобы статус заказа сменился на «завершён».
- Проверьте в админке WooCommerce, что заказ исчез из списка.
- Можно проверить через запрос к базе данных:
SELECT * FROM wp_posts WHERE ID = {order_id} AND post_type = 'shop_order'— запись должна отсутствовать.
Частые ошибки и как их исправить
- Удаление заказов с неправильным статусом: убедитесь, что хук
woocommerce_order_status_completedподходит для вашего сценария. Если оплата подтверждается другим статусом, используйте соответствующий хук, например,woocommerce_payment_complete. - Ошибка при получении объекта заказа: проверьте, что
wc_get_order($order_id)возвращает объект, а неfalse. - Удаление заказов с физическими товарами: если не хотите удалять такие заказы, добавьте проверку на виртуальный товар, как в примере.
- Проблемы с правами доступа: убедитесь, что код работает с правильными правами и не вызывается в неподходящее время.
Практические советы по безопасности и производительности
- Удаление заказов — необратимая операция, лучше делать резервное копирование базы перед внедрением.
- Не удаляйте заказы, если у вас включена интеграция с учётом, отчётностью или сторонними CRM — это может нарушить целостность данных.
- Вместо удаления можно рассмотреть перевод заказа в отдельный статус «архивный» и скрытие его из списка заказов через фильтры.
- Если заказов много, массовое удаление лучше выполнять через WP CLI или отдельный скрипт по крону, чтобы избежать тайм-аутов.
Сравнение вариантов удаления заказов после оплаты
| Метод | Реализация | Плюсы | Минусы |
|---|---|---|---|
Удаление через хук woocommerce_order_status_completed | PHP код в functions.php, см. пример выше | Автоматизация, простота реализации | Риск удаления важных заказов, влияет на отчёты |
| Перевод заказа в архивный статус | Создание кастомного статуса, фильтрация в админке | Безопасно, сохраняются данные для отчётов | Не освобождает место в базе |
| Ручное удаление через админку или WP CLI | Админка или консольные команды WP CLI | Контроль, безопасно | Трудоемко при большом количестве заказов |