Диагностика задачи: зачем удалять заказы после оплаты в WooCommerce
Иногда требуется автоматически удалять заказы из WooCommerce сразу после успешной оплаты. Это может быть полезно для магазинов с цифровыми товарами, где сам платеж подтверждает выполнение обязательств, а хранение заказов не требуется, чтобы снизить нагрузку на базу данных. Также удаление старых оплаченных заказов помогает оптимизировать производительность.
Однако в стандартном функционале WooCommerce нет опции автоматического удаления заказов после смены статуса на «завершён» или «оплачен».
Пошаговое решение: автоматическое удаление заказа после успешной оплаты
Использование хука woocommerce_payment_complete
Для удаления заказа сразу после оплаты можно использовать хук woocommerce_payment_complete, который срабатывает при успешном завершении оплаты. В обработчике нужно получить ID заказа и вызвать функцию удаления.
add_action('woocommerce_payment_complete', 'wpload_delete_order_after_payment', 10, 1);
function wpload_delete_order_after_payment( $order_id ) {
if ( ! $order_id ) {
return;
}
// Получаем объект заказа
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
// Проверяем статус заказа, чтобы удалять только оплаченные
if ( $order->get_status() === 'processing' || $order->get_status() === 'completed' ) {
// Удаляем заказ
wp_delete_post( $order_id, true );
}
}
Альтернативный подход: удаление по cron для заказов старше N дней
Если нужно удалять не сразу, а периодически чистить заказов, можно создать cron-задачу, которая будет удалять заказы со статусом "completed" старше определённого времени.
function wpload_delete_old_completed_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-completed'],
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$orders = get_posts( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
// Добавляем событие раз в сутки
if ( ! wp_next_scheduled( 'wpload_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpload_daily_order_cleanup' );
}
add_action( 'wpload_daily_order_cleanup', 'wpload_delete_old_completed_orders' );
Проверка результата после внедрения
- Создайте тестовый заказ и оплатите его через выбранный способ оплаты.
- Убедитесь, что после оплаты заказ исчез из админки WooCommerce в разделе «Заказы».
- Для cron-подхода проверьте, что заказы старше нужного срока удаляются после запуска задачи (можно инициировать вручную через
do_action('wpload_daily_order_cleanup')). - Проверьте логи ошибок WordPress для исключения проблем с удалением.
Частые ошибки и как их исправить
- Заказы не удаляются сразу после оплаты: возможно, хук
woocommerce_payment_completeне срабатывает из-за нестандартного платежного шлюза. Проверьте совместимость и попробуйте использовать другой хук, например,woocommerce_order_status_completed. - Удаление приводит к потере данных, нужных для бухгалтерии: убедитесь, что автоматическое удаление разрешено политиками вашей компании и местным законодательством.
- Ошибка при вызове
wp_delete_post: проверьте, что у пользователя, под которым выполняется код, есть права на удаление заказов, а также что заказ существует. - Cron-задачи не запускаются: убедитесь, что у вас настроен wp-cron или используйте системный cron для запуска, иначе задачи не будут выполняться.
Практические советы по безопасности и производительности
- Всегда используйте
wp_delete_post($order_id, true)с параметромtrueдля полного удаления без помещения в корзину, чтобы не загромождать базу данных. - Перед массовым удалением делайте резервные копии базы данных.
- Ограничьте права пользователей на удаление заказов, чтобы избежать случайного удаления вручную.
- Если удаляете заказы сразу после оплаты, убедитесь, что все необходимые данные (например, для отчетности) сохранены в других системах.
- Для больших магазинов с тысячами заказов лучше использовать cron-подход с пакетной обработкой, чтобы не перегружать сервер.
Сравнение подходов: моментальное удаление vs cron
| Критерий | Моментальное удаление | Удаление по cron |
|---|---|---|
| Время удаления | Сразу после оплаты | Периодически (например, раз в сутки) |
| Нагрузка на сервер | Минимальная, единичные операции | Может быть высокая при большом объеме заказов |
| Контроль и проверка | Требуется проверка при каждой оплате | Проще отслеживать и логировать |
| Риск потери данных | Высокий, если не настроена резервная копия | Средний, можно отложить удаление |
| Совместимость с платежными системами | Зависит от хука оплаты | Независим от платежных систем |