如何修复自动取消30天未完成WooCommerce处理订单的无效代码?
修复WooCommerce自动取消30天未完成处理订单的代码
原代码的核心问题
- 用
get_posts获取WooCommerce订单:WooCommerce有专属的订单查询函数wc_get_orders,更适配订单数据结构,避免兼容性问题 - 错误使用
post_modified_gmt判断日期:需求是创建之日起30天,应使用订单创建时间post_date_gmt(或直接用wc_get_orders的date_created参数) - 直接调用
wp_update_post改状态:这会绕过WooCommerce的状态变更逻辑,无法触发钩子、生成订单日志,属于不规范操作 - 调度事件触发时机不合理:
wp钩子会在前端每次访问时执行,改用init钩子更合适,减少不必要的执行
修复后的完整代码
// 自动取消30天前创建的处理中订单 function cwpai_mark_cancelled_orders() { // 使用WooCommerce官方订单查询函数 $args = array( 'limit' => -1, // 获取所有符合条件的订单 'status' => 'processing', // 筛选处理状态的订单 'date_created' => '<' . date('Y-m-d H:i:s', strtotime('-30 days')), // 筛选30天前创建的订单 'return' => 'objects', // 返回订单对象而非数组 ); $orders = wc_get_orders($args); if (!empty($orders)) { foreach ($orders as $order) { // 使用WooCommerce官方方法更新状态,同时添加订单备注 $order->update_status('cancelled', '自动取消:创建后30天未完成处理', true); } } } // 调度每日执行的事件 function cwpai_schedule_cancelled_orders_event() { if (!wp_next_scheduled('cwpai_mark_cancelled_orders_event')) { wp_schedule_event(time(), 'daily', 'cwpai_mark_cancelled_orders_event'); } } add_action('init', 'cwpai_schedule_cancelled_orders_event'); // 绑定调度事件到处理函数 add_action('cwpai_mark_cancelled_orders_event', 'cwpai_mark_cancelled_orders');
关键改进说明
- 使用
wc_get_orders:专门针对WooCommerce订单设计,支持更多订单专属参数,兼容性更强 - 日期判断精准匹配创建时间:通过
date_created参数直接筛选30天前创建的订单,符合需求逻辑 - 用
update_status方法:这是WooCommerce推荐的订单状态更新方式,自动触发状态变更钩子、生成订单备注,保证订单流程完整性 - 优化调度钩子:改用
init钩子,避免前端不必要的执行,确保调度逻辑在合适时机初始化
内容的提问来源于stack exchange,提问作者user1381985
相关产品推荐
相关产品推荐

