需求: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
相关产品推荐
相关产品推荐

