自定义订单状态变更时同步更新WooCommerce预订状态问题
解决WooCommerce自定义支付状态与预订状态同步问题
我来帮你梳理下这个问题:其实完全可以不用额外代码实现同步,核心是你在创建自定义订单状态时的配置没到位,WooCommerce Bookings插件本身就和订单状态有默认的关联逻辑。
不用代码的解决步骤
- 打开WooCommerce后台的「Order Status Manager」设置页面,找到你创建的那个自定义已支付状态(也就是你代码里的
pool-payment-rec)。 - 在这个状态的配置项里,找到**「Order Status Type」(订单状态类型)的选项,把它设置为「Paid」(已支付)类型**。WooCommerce Bookings会自动识别所有标记为“已支付”类型的订单状态,同步将关联的预订状态更新为
paid。 - 保存设置后,触发一次这个自定义订单状态的变更,就能看到预订状态自动同步了。
关于你之前的代码错误
你给出的代码片段没写完,但从开头看大概率是函数名拼写不全(auto_chan...应该是auto_change_booking_status_to_paid),或者没有正确调用WooCommerce Bookings的预订操作函数,才导致了致命错误。如果上面的配置方法不生效,你可以试试下面的完整代码(注意要放到主题的functions.php里,或者用代码片段插件添加):
add_action('woocommerce_order_status_pool-payment-rec', 'auto_change_booking_status_to_paid', 10, 1); function auto_change_booking_status_to_paid($order_id) { // 获取订单对象 $order = wc_get_order($order_id); if (!$order) return; // 遍历订单内的所有预订项目 foreach ($order->get_items('booking') as $booking_item) { $booking_id = $booking_item->get_meta('_booking_id'); $booking = get_wc_booking($booking_id); if ($booking) { // 将预订状态更新为paid $booking->update_status('paid'); } } }
不过还是优先推荐用插件配置的方式,既简单又能避免代码出错的风险。
内容的提问来源于stack exchange,提问作者Thorned Rose
相关产品推荐
相关产品推荐

