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

如何修复自动取消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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:17:23