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

WooCommerce按产品变体自定义感谢页跳转失败排查

代码错误分析及修正方案

核心错误点

  • 提前跳转导致后续逻辑失效:原代码中第一个if (! $order->has_status('failed'))判断后直接执行跳转并exit,所有非失败状态的订单都会立刻跳转到默认感谢页,后续针对特定产品变体的检查代码完全没有执行机会。
  • in_array函数参数误用:你写的in_array(12345, 123456, $product_ids)不符合函数语法。in_array的正确格式是in_array(查找值, 目标数组, 严格匹配开关),若要同时检查多个ID,需用逻辑或拆分判断,或把目标ID存入数组后用交集判断。
  • 变量作用域隐患:$redirection变量在if (is_a($order, 'WC_Order'))内部初始化,若该条件不满足(概率极低但存在可能),后续if ($redirection)会触发未定义变量警告。

修正后的代码

add_action( 'woocommerce_thankyou', 'updated_redirectcustom');
 
function updated_redirectcustom( $order_id ){
    if( ! $order_id ) {
        return;
    }

    $order = wc_get_order( $order_id );
    // 默认跳转地址
    $redirect_url = home_url('/thank-you/');
    // 是否需要跳转到特殊感谢页的标记
    $need_special_redirect = false;

    if ( is_a( $order, 'WC_Order' ) && ! $order->has_status( 'failed' ) ) {
        // 需要匹配的产品/变体ID列表
        $target_ids = array(12345, 123456);
            
        // 遍历订单内的商品
        foreach ( $order->get_items() as $item ) {
            // 获取当前商品的主ID和变体ID
            $current_product_ids = array( $item->get_product_id(), $item->get_variation_id() );
                    
            // 检查是否存在匹配ID
            if ( array_intersect($target_ids, $current_product_ids) ) {
                $need_special_redirect = true;
                break; // 找到匹配后直接终止循环,提升效率
            }
        }

        // 根据标记更新跳转地址
        if ( $need_special_redirect ) {
            $redirect_url = home_url('/thank-you-2/');
        }

        wp_safe_redirect( $redirect_url );
        exit;
    }
}

修正说明

  1. 调整代码执行顺序:先验证订单ID有效性,再处理订单对象,避免提前跳转截断逻辑。
  2. 统一跳转逻辑:所有判断完成后再执行跳转,确保最终跳转地址由完整逻辑决定。
  3. 优化ID匹配方式:用array_intersect判断目标ID列表与当前商品ID数组的交集,逻辑更清晰高效。
  4. 减少无效遍历:找到匹配商品后立即跳出循环,避免不必要的资源消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:57:23