Диагностика проблемы: зачем удалять отменённые и возвращённые заказы WooCommerce
В стандартном WooCommerce отменённые и возвращённые заказы сохраняются в базе данных, что со временем может привести к её раздуванию и усложнению отчётности. Если ваша задача — именно очистка от таких заказов для поддержания базы в порядке, стоит автоматизировать процесс удаления, чтобы не делать это вручную.
Однако важно понимать, что удаление заказов — операция необратимая. Убедитесь, что вам действительно нужно удалять данные, а не просто менять их статус или архивировать.
Пошаговое решение: удаление заказов по изменению статуса
Шаг 1. Подключение к хуку изменения статуса заказа
WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при изменении статуса заказа. Используем его, чтобы ловить переходы в статусы cancelled и refunded.
Шаг 2. Добавление кода в functions.php или в кастомный плагин
add_action('woocommerce_order_status_changed', 'auto_delete_cancelled_or_refunded_orders', 10, 4);
function auto_delete_cancelled_or_refunded_orders($order_id, $old_status, $new_status, $order) {
if (in_array($new_status, array('cancelled', 'refunded'))) {
wp_delete_post($order_id, true); // true — принудительное удаление без перемещения в корзину
}
}
Этот код удалит заказ сразу после смены статуса на отменённый или возвращённый.
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce.
- Измените его статус на
cancelledилиrefundedчерез админку. - Проверьте, что заказ исчез из списка заказов.
- Для уверенности можно проверить базу данных MySQL, например, запросом
SELECT * FROM wp_posts WHERE ID = {ID_заказа}— запись должна отсутствовать.
Частые ошибки и как их исправить
- Заказы не удаляются после смены статуса: проверьте, что код подключён и активен, а функция
wp_delete_postвызывается. Убедитесь, что при тестировании статусы меняются именно наcancelledилиrefunded, а не на пользовательские. - Удаляются не все нужные заказы: если вы используете кастомные статусы, добавьте их в массив статусов в
in_array. - Ошибка при удалении из-за прав: убедитесь, что пользователь, под которым работает код (обычно — процесс PHP), имеет права на удаление записей (обычно это не проблема).
- Удаление слишком быстрое, нарушает логи: можно добавить проверку, например, удалять только заказы старше определённого времени, чтобы сохранить статистику за последнюю неделю.
Практические советы по безопасности и производительности
- Перед удалением заказов делайте резервную копию базы, так как восстановить данные из корзины WordPress невозможно.
- Если объём заказов большой, добавьте ограничение по времени или по дате создания заказа, чтобы не удалять последние транзакции.
- Можно реализовать отложенную очистку через WP-Cron, чтобы удалять заказы пакетно, не нагружая сервер.
- Для дополнительной безопасности можно логировать удаляемые ID заказов в отдельный файл или таблицу.
Расширение: удаление заказов по дате и статусу через WP-Cron
Для автоматизации очистки заказов старше 30 дней со статусом cancelled или refunded можно добавить следующий код:
if (!wp_next_scheduled('wc_delete_old_cancelled_refunded_orders')) {
wp_schedule_event(time(), 'daily', 'wc_delete_old_cancelled_refunded_orders');
}
add_action('wc_delete_old_cancelled_refunded_orders', 'delete_old_cancelled_refunded_orders');
function delete_old_cancelled_refunded_orders() {
$args = array(
'status' => array('cancelled', 'refunded'),
'date_created' => '<' . (time() - 30 * DAY_IN_SECONDS),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}
Этот код запускает ежедневную очистку заказов старше 30 дней, что снижает нагрузку и сохраняет актуальность данных.
Сравнение подходов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Удаление сразу при смене статуса | Мгновенное удаление, простота реализации | Риск потери данных, невозможность отката |
| Удаление по расписанию (WP-Cron) | Контроль по дате, меньше ошибок, можно логировать | Задержка удаления, чуть более сложная реализация |
| Ручное удаление через админку | Безопасно, пользователь контролирует процесс | Трудоёмко, не подходит для большого количества заказов |