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

WooCommerce含指定商品订单自动设置为processing状态的实现问题

问题点说明

  • 循环语法错误:你使用if ( $items as $item )无法遍历订单内的商品列表,需要替换为foreach循环才能逐个读取商品ID
  • 钩子参数顺序错误:woocommerce_order_status_changed钩子的参数顺序为$order_id、$old_status、$new_status、$order,你写的参数顺序错误,导致无法获取到正确的订单对象
  • 死循环风险:在状态变更钩子内调用update_status方法会再次触发同一个钩子,造成无限循环,需要先判断订单状态是否已经是processing,避免重复执行

修正后代码

function action_woocommerce_order_status_changed( $order_id, $old_status, $new_status, $order ) {
    // 已经是processing状态直接跳过,避免死循环
    if ( $new_status === 'processing' ) {
        return;
    }
    
    // 遍历订单所有商品
    foreach ( $order->get_items() as $item ) {
        $product_id = $item->get_product_id();
        // 匹配到目标商品则修改状态并退出循环
        if ( $product_id == 1511 ) {
            $order->update_status( 'processing' );
            break;
        }
    }
}
add_action( 'woocommerce_order_status_changed', 'action_woocommerce_order_status_changed', 10, 4 );

补充兜底方案

如果需要覆盖用户刚下单未触发状态变更的场景,可以额外挂载woocommerce_thankyou钩子:

function custom_set_order_processing_for_product( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( !$order || $order->get_status() === 'processing' ) {
        return;
    }
    
    foreach ( $order->get_items() as $item ) {
        if ( $item->get_product_id() == 1511 ) {
            $order->update_status( 'processing' );
            break;
        }
    }
}
add_action( 'woocommerce_thankyou', 'custom_set_order_processing_for_product', 10, 1 );

内容的提问来源于stack exchange,提问作者Najm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:09:02