You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:WooCommerce自动取消9天后的On-hold订单(巴西线下支付场景)

嘿,我来帮你梳理并优化这个自动取消On-hold状态过期订单的需求,让代码逻辑更清晰易用!

实现WooCommerce自动取消9天过期的On-hold状态订单(巴西银行票据场景)

核心需求拆解

  • 针对巴西银行票据支付的订单,当订单处于On-hold状态且超过9天时,自动取消订单(此时票据已过期)
  • 参考了现有Pending状态订单的取消逻辑,但原代码逻辑混乱,需要优化
  • 需要结合date_modified参数拉取最近更新的订单,避免全量查询拖慢系统性能

优化后的代码实现

我整理了逻辑清晰、性能更优的代码,你可以直接放到主题的functions.php里,或者用自定义插件来部署:

/**
 * 自动取消9天前处于On-hold状态的订单(巴西银行票据场景)
 */
function auto_cancel_expired_on_hold_orders() {
    // 只在后台执行,避免前端加载时消耗资源
    if ( !is_admin() ) return;

    // 设置过期时间:9天(转换为秒数)
    $expiration_period = 9 * 24 * 60 * 60;
    // 拉取最近1小时内更新的On-hold订单(缩小查询范围,提升性能)
    $one_hour_ago = current_time('timestamp') - (60 * 60);

    // 查询符合条件的订单
    $orders = wc_get_orders( array(
        'status'        => 'on-hold',
        'date_modified' => '<' . date('Y-m-d H:i:s', $one_hour_ago),
        'date_created'  => '<' . date('Y-m-d H:i:s', current_time('timestamp') - $expiration_period),
        'limit'         => 100, // 每次处理100个订单,防止脚本超时
        'return'        => 'ids',
    ) );

    // 遍历订单并执行取消操作
    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        // 再次校验订单状态,避免并发操作导致的状态不一致
        if ( $order && $order->has_status('on-hold') ) {
            // 添加取消备注,方便后续查账和客户沟通
            $order->add_order_note( '订单因银行票据过期(超过9天未支付)自动取消' );
            // 更新订单状态为已取消
            $order->update_status( 'cancelled', '银行票据过期自动取消' );
        }
    }
}
// 设置定时任务:每天执行一次(可根据需求调整频率)
add_action('wp_scheduled_auto_cancel_orders', 'auto_cancel_expired_on_hold_orders');

// 激活时添加定时任务
function setup_auto_cancel_schedule() {
    if ( !wp_next_scheduled('wp_scheduled_auto_cancel_orders') ) {
        wp_schedule_event( current_time('timestamp'), 'daily', 'wp_scheduled_auto_cancel_orders' );
    }
}
add_action('init', 'setup_auto_cancel_schedule');

// 停用插件/主题时清除定时任务
function remove_auto_cancel_schedule() {
    $timestamp = wp_next_scheduled('wp_scheduled_auto_cancel_orders');
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wp_scheduled_auto_cancel_orders' );
    }
}
register_deactivation_hook( __FILE__, 'remove_auto_cancel_schedule' );

代码逻辑说明

  • 性能优化:通过date_modified筛选最近1小时更新的订单,再结合date_created判断是否超过9天,避免一次性查询所有历史On-hold订单,减轻数据库压力
  • 状态校验:取消前再次确认订单状态,防止并发操作导致的状态异常
  • 定时任务:默认每天执行一次,你也可以改成hourly(每小时)或者自定义Cron表达式调整频率
  • 清晰溯源:给订单添加明确的取消备注,方便后续运营查账和客户理解

注意事项

  • 确保你的WooCommerce版本在3.0以上(支持wc_get_orders函数)
  • 测试时可以临时把$expiration_period改成1分钟,快速验证逻辑是否生效,测试完成后改回9天
  • 如果订单量很大,可以把limit值调小,避免脚本超时

内容的提问来源于stack exchange,提问作者Daniel Romagnoli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:21:03