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; } }
修正说明
- 调整代码执行顺序:先验证订单ID有效性,再处理订单对象,避免提前跳转截断逻辑。
- 统一跳转逻辑:所有判断完成后再执行跳转,确保最终跳转地址由完整逻辑决定。
- 优化ID匹配方式:用
array_intersect判断目标ID列表与当前商品ID数组的交集,逻辑更清晰高效。 - 减少无效遍历:找到匹配商品后立即跳出循环,避免不必要的资源消耗。
内容的提问来源于stack exchange,提问作者Bob Nowak
相关产品推荐
相关产品推荐

