Проблема: необходимость автоматического удаления заказов в WooCommerce
В стандартном функционале WooCommerce нет опции для автоматического удаления заказов по определённому статусу после оплаты. Это может быть актуально, если нужно очистить базу от тестовых или разовых заказов, чтобы не загромождать базу данных и админку.
Диагностика
- Проверьте, есть ли заказы нужного статуса в админке WooCommerce (WooCommerce > Заказы).
- Убедитесь, что вы понимаете, какой статус заказа должен запускать удаление (например, "completed" или кастомный статус).
- Проверьте, что у вас есть доступ к FTP или файловому менеджеру для добавления кода в тему или плагин.
Пошаговое решение: автоматическое удаление заказов по статусу
Для реализации автоматического удаления заказов после смены их статуса можно использовать хук woocommerce_order_status_changed. Ниже — пример кода, который удаляет заказы сразу после перевода в статус completed.
add_action('woocommerce_order_status_changed', 'auto_delete_order_on_status', 10, 4);function auto_delete_order_on_status($order_id, $old_status, $new_status, $order) { // Указываем статус для удаления $target_status = 'completed'; if ($new_status === $target_status) { // Удаляем заказ программно wp_trash_post($order_id); // Если нужно полностью удалить, можно использовать: // wp_delete_post($order_id, true); }}Код добавьте в файл functions.php активной темы или в кастомный плагин.
Подробности реализации
- Хук получает ID заказа, старый и новый статус, а также объект заказа.
- Функция проверяет, совпадает ли новый статус с целевым.
- Заказ переносится в корзину или удаляется безвозвратно (зависит от используемой функции).
- Используйте
wp_trash_post, если хотите иметь возможность восстановить заказ из корзины. - Для полного удаления используйте
wp_delete_postс параметромtrue.
Проверка результата
- Создайте тестовый заказ через фронтенд с нужным статусом (например, завершённый).
- После смены статуса на
completedпроверьте, исчез ли заказ из списка заказов WooCommerce. - Зайдите в корзину WordPress (если используете
wp_trash_post) и убедитесь, что заказ там. - Если использовали
wp_delete_post, заказ должен быть полностью удалён.
Частые ошибки и как их исправить
- Код не срабатывает: проверьте, что код добавлен в активную тему или плагин и что нет синтаксических ошибок.
- Неправильный статус: убедитесь, что в переменной
$target_statusуказан правильный статус (например,completed,processing). - Заказы остаются в базе: может срабатывать кеширование или ограничения по ролям пользователя. Проверьте права и кеш.
- Удаление приводит к ошибкам в админке: проверьте совместимость с другими плагинами, которые могут работать с заказами.
Практические советы по безопасности и производительности
- Не удаляйте заказы без резервного копирования базы, чтобы избежать потери данных.
- Используйте
wp_trash_postвместо полного удаления, чтобы иметь возможность восстановления. - Проверьте, что удаление заказов не нарушает отчётность и аналитику вашего магазина.
- Если удалять много заказов, делайте это пачками через WP-CLI или WP Cron, чтобы не перегружать сервер.
Сравнение вариантов удаления заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| wp_trash_post() | Перемещает заказ в корзину WordPress | Можно восстановить; безопаснее | Заказы остаются в базе; занимает место |
| wp_delete_post(true) | Полностью удаляет заказ из базы | Чистит базу полностью | Невозможно восстановить; риск потери данных |
Дополнительный пример: удаление заказов по кастомному статусу
add_action('woocommerce_order_status_changed', 'delete_order_on_custom_status', 10, 4);function delete_order_on_custom_status($order_id, $old_status, $new_status, $order) { $target_status = 'custom-status'; // замените на ваш статус if ($new_status === $target_status) { wp_trash_post($order_id); }}