WooCommerce多产品变体加入购物车自定义重定向代码修正
代码失效原因
你修改后的变体重定向代码无法生效,核心问题有两个:
- 可变产品提交加购请求时,
$_REQUEST['add-to-cart']字段传递的是父级可变产品的ID,用户选中的具体变体ID存储在请求参数variation_id中,直接将add-to-cart参数值作为变体ID判断,永远匹配不到你设置的变体ID规则。 - 原代码在过滤器中直接调用
wp_redirect()加exit的写法不符合WooCommerce钩子规范,woocommerce_add_to_cart_redirect是过滤型钩子,逻辑应该是返回目标重定向URL,由WooCommerce核心统一执行跳转,手动跳转很容易和其他挂载到同钩子的逻辑产生冲突。
可直接使用的兼容代码
以下代码同时支持简单产品、可变产品的加购自定义重定向,既可以按简单产品/可变产品父ID配置全局跳转,也可以按特定变体ID配置专属跳转:
add_filter( 'woocommerce_add_to_cart_redirect', 'custom_add_to_cart_redirect', 10, 2 ); function custom_add_to_cart_redirect( $redirect_url, $product ) { // 配置重定向规则,格式为「产品/变体ID => 目标跳转地址」 $redirect_rules = [ 3008 => '请替换为产品3008对应的实际跳转地址', 2992 => '请替换为产品2992对应的实际跳转地址', // 如需给特定变体单独配置跳转,直接按格式追加变体ID和对应地址即可,示例: // 3025 => '请替换为3025号变体对应的实际跳转地址' ]; // 获取当前加购的ID:可变产品优先取变体ID,简单产品取产品ID $current_id = 0; $parent_id = 0; if ( isset( $_REQUEST['variation_id'] ) && absint( $_REQUEST['variation_id'] ) > 0 ) { $current_id = absint( $_REQUEST['variation_id'] ); $parent_id = $product->get_parent_id(); } else { $current_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_REQUEST['add-to-cart'] ) ); } // 优先匹配当前变体/简单产品ID if ( isset( $redirect_rules[$current_id] ) ) { return $redirect_rules[$current_id]; } // 可变产品再匹配父产品ID(即该可变产品下所有变体都触发跳转) if ( $parent_id > 0 && isset( $redirect_rules[$parent_id] ) ) { return $redirect_rules[$parent_id]; } // 无匹配规则时返回默认跳转地址 return $redirect_url; }
使用说明
- 将代码添加到主题的
functions.php文件或者自定义功能插件中即可生效 - 只需修改
$redirect_rules数组内的跳转地址为你的实际页面地址,新增重定向规则直接按现有格式追加即可 - 如果需要给可变产品下的不同变体设置不同跳转地址,直接在规则数组中添加对应变体ID和跳转地址,优先级高于父产品的跳转规则
内容的提问来源于stack exchange,提问作者ZBytes2
相关产品推荐
相关产品推荐

