wpload.ru wordpress WPLoad.ru

WooCommerce: как автоматически удалять заказ после успешной оплаты

Диагностика задачи: зачем удалять заказы после оплаты в 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
Время удаленияСразу после оплатыПериодически (например, раз в сутки)
Нагрузка на серверМинимальная, единичные операцииМожет быть высокая при большом объеме заказов
Контроль и проверкаТребуется проверка при каждой оплатеПроще отслеживать и логировать
Риск потери данныхВысокий, если не настроена резервная копияСредний, можно отложить удаление
Совместимость с платежными системамиЗависит от хука оплатыНезависим от платежных систем
×

Пора действовать!

Скидки на
WordPress!

-20%
на премиум темы

Успей купить ⋙