向未登录用户隐藏多个Woocommerce配送方式的代码故障求助
WooCommerce未登录用户隐藏指定配送方式 代码问题排查与修复
现有代码的错误点
- 回调函数名不匹配:
add_filter注册的回调函数名为shipping_methods_based_on_wholesale_customer,实际定义的函数名为shipping_methods_based_on_user_status,名称不一致导致钩子无法触发你编写的逻辑 - 语法错误:
$is_loggedout = !is_user_logged_in());多写了一个右括号,会直接抛出PHP语法错误 - 逻辑颠倒:你注释标注需要给未登录用户隐藏的配送方式ID数组,仅在已登录用户分支赋值,未登录状态下该变量不存在,无法执行隐藏逻辑
- 变量未定义:未登录/已登录分支只有其中一个会给
$shipping_rates_ids赋值,另一分支访问该变量会抛出PHP警告 - 符号转义错误:代码中
=>被转义为=>,实际编写时需要替换为正常的PHP数组遍历符号
修正后的完整代码
add_filter( 'woocommerce_package_rates', 'shipping_methods_based_on_user_status', 10, 2 ); function shipping_methods_based_on_user_status( $rates, $package ){ $is_loggedout = !is_user_logged_in(); // 初始化配送方式ID数组,避免未定义警告 $shipping_rates_ids = []; // 未登录用户才需要隐藏指定配送方式 if( $is_loggedout ) { // 此处填写你要对未登录用户隐藏的配送方式ID $shipping_rates_ids = array('flat_rate:10', 'flat_rate:11', 'flat_rate:12', 'flat_rate:13'); } // 遍历当前配送包的配送方式,移除指定ID foreach( $rates as $rate_key => $rate ) { if ( in_array( $rate_key, $shipping_rates_ids) ) { unset( $rates[$rate_key] ); } } return $rates; }
生效注意事项
- 代码部署完成后,需要清空WooCommerce配送缓存:登录站点后台,进入「WooCommerce → 状态 → 工具」,点击「清除购物车配送会话」按钮保存,否则旧的缓存配送方式会继续显示
- 请确认你填写的配送方式ID正确:进入「WooCommerce → 设置 → 配送」,打开对应配送区域的配置,鼠标悬浮在对应配送方式的「编辑」按钮上,浏览器地址栏的
instance_id参数值就是flat_rate:后面的数字,需要和你填写的ID完全匹配
内容的提问来源于stack exchange,提问作者Ridwan Ahmed
相关产品推荐
相关产品推荐

