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

WooCommerce中自动将COD订单关联预订状态设为已确认的代码实现求助

WooCommerce中自动将COD订单关联预订状态设为已确认的代码实现求助

嘿,我看你已经搭好了代码的架子,这就帮你补全并优化一下,刚好能实现你要的需求——把COD订单关联的未支付/待处理状态的预订自动设为已确认~

先给你完整的可用代码:

add_action('woocommerce_thankyou', 'set_cod_booking_status_to_confirmed', 10, 1);
function set_cod_booking_status_to_confirmed($order_id) {
    // 安全判断:确保订单对象存在
    $order = wc_get_order($order_id);
    if (!$order) return;

    // 检查当前订单的支付方式是否为COD
    if ( $order->get_payment_method() === 'cod' ) {
        // 获取该订单下关联的所有预订
        $bookings = WC_Bookings_Controller::get_bookings_for_order($order_id);

        // 如果没有关联的预订,直接退出
        if (empty($bookings)) return;

        // 遍历所有预订(支持一个订单多个预订的场景)
        foreach ($bookings as $booking) {
            // 只处理状态为unpaid或pending的预订
            $current_status = $booking->get_status();
            if (in_array($current_status, ['unpaid', 'pending'])) {
                // 更新预订状态为已确认,同时添加状态变更备注
                $booking->update_status('confirmed', '自动更新:COD订单关联预订,状态设为已确认');
            }
        }
    }
}

再给你拆解下代码里的关键优化点:

  • 加了订单对象的安全判断,避免订单不存在时抛出错误
  • 把原来只处理第一个预订的逻辑改成了遍历所有预订,这样一个订单绑定多个预订的场景也能覆盖到
  • 增加了状态过滤,只对当前是unpaid或pending的预订做更新,完全匹配你的需求
  • 用WooCommerce Bookings官方推荐的update_status()方法更新状态,还加了备注,后台看状态变更记录时能清楚知道原因
  • 代码结构更清晰,每一步都有注释,后期维护也方便

另外给你提几个小提醒:

  • 这个woocommerce_thankyou钩子会在用户提交COD订单后触发,刚好符合“订单创建后自动更新”的需求
  • 确保你的WooCommerce和WooCommerce Bookings是最新稳定版,避免旧版本的方法兼容问题
  • 如果你的业务场景确实只需要处理第一个预订,把foreach循环改成$booking = reset($bookings);然后单独处理就行

备注:内容来源于stack exchange,提问作者devOP1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 15:09:32