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

