基于用户角色的 Woocommerce 运输方法
Woocommerce Shipping method based on user role
我想根据用户角色启用或禁用送货方式。
我已经测试了各种不同的代码和方法,none 目前为止有效。
当前代码:(来源:)
add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_method_based_on_user_role', 30, 2 );
function hide_shipping_method_based_on_user_role( $rates, $package ) {
$shipping_id = 'shipmondo:3';
foreach( $rates as $rate_key => $rate ){
if( $rate->method_id === $shipping_id ){
if( current_user_can( 'b2b' ) || ! is_user_logged_in()){
unset($rates[$rate_key]);
break;
}
}
}
return $rates;
}
(也测试了原始代码段,没有更改,接受用户角色)
对我不起作用。我也用 'local_pickup' 测试过它,它有时确实有效,但似乎对浏览器缓存和会话非常敏感。我还需要的是 3 种方法,它们以相同的名称调用,但用子编号分隔它们:shipmondo:3、shipmondo:4 等(在“值”下的浏览器检查中找到)有还有一个叫做 ID 的东西,它看起来像: 'shipping_method_0_shipmondo3' 不知道我是否可以使用它,但是当代码没有正确更新时,很难弄清楚。该片段来自 2018 年,因此它可能已经过时了,但我发现的较新片段基于相同的原理,并且看起来并没有太大不同。
此外,为什么需要“|| !is_user_logged_in()”?我只需要为批发用户禁用 3 种方法中的 2 种,不需要影响任何其他角色,也不需要来宾。已经为此奋斗了好几天。
此外,关于强制 Wordpress 和 Woocommerce 进行更新而不是在缓存中游荡有什么建议吗?
提前致谢。
您混淆了送货方式“Method Id”和送货方式“Rate Id”。您的代码也可以简化。请尝试以下操作:
add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_method_based_on_user_role', 100, 2 );
function hide_specific_shipping_method_based_on_user_role( $rates, $package ) {
// Here define the shipping rate ID to hide
$targeted_rate_id = 'shipmondo:3'; // The shipping rate ID to hide
$targeted_user_roles = array('b2b'); // The user roles to target (array)
$current_user = wp_get_current_user();
$matched_roles = array_intersect($targeted_user_roles, $current_user->roles);
if( ! empty($matched_roles) && isset($rates[$targeted_rate_id]) ) {
unset($rates[$targeted_rate_id]);
}
return $rates;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。应该可以。
不要忘记清空您的购物车,以清除运输缓存数据。
我想根据用户角色启用或禁用送货方式。 我已经测试了各种不同的代码和方法,none 目前为止有效。
当前代码:(来源:
add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_method_based_on_user_role', 30, 2 );
function hide_shipping_method_based_on_user_role( $rates, $package ) {
$shipping_id = 'shipmondo:3';
foreach( $rates as $rate_key => $rate ){
if( $rate->method_id === $shipping_id ){
if( current_user_can( 'b2b' ) || ! is_user_logged_in()){
unset($rates[$rate_key]);
break;
}
}
}
return $rates;
}
(也测试了原始代码段,没有更改,接受用户角色) 对我不起作用。我也用 'local_pickup' 测试过它,它有时确实有效,但似乎对浏览器缓存和会话非常敏感。我还需要的是 3 种方法,它们以相同的名称调用,但用子编号分隔它们:shipmondo:3、shipmondo:4 等(在“值”下的浏览器检查中找到)有还有一个叫做 ID 的东西,它看起来像: 'shipping_method_0_shipmondo3' 不知道我是否可以使用它,但是当代码没有正确更新时,很难弄清楚。该片段来自 2018 年,因此它可能已经过时了,但我发现的较新片段基于相同的原理,并且看起来并没有太大不同。
此外,为什么需要“|| !is_user_logged_in()”?我只需要为批发用户禁用 3 种方法中的 2 种,不需要影响任何其他角色,也不需要来宾。已经为此奋斗了好几天。
此外,关于强制 Wordpress 和 Woocommerce 进行更新而不是在缓存中游荡有什么建议吗?
提前致谢。
您混淆了送货方式“Method Id”和送货方式“Rate Id”。您的代码也可以简化。请尝试以下操作:
add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_method_based_on_user_role', 100, 2 );
function hide_specific_shipping_method_based_on_user_role( $rates, $package ) {
// Here define the shipping rate ID to hide
$targeted_rate_id = 'shipmondo:3'; // The shipping rate ID to hide
$targeted_user_roles = array('b2b'); // The user roles to target (array)
$current_user = wp_get_current_user();
$matched_roles = array_intersect($targeted_user_roles, $current_user->roles);
if( ! empty($matched_roles) && isset($rates[$targeted_rate_id]) ) {
unset($rates[$targeted_rate_id]);
}
return $rates;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。应该可以。
不要忘记清空您的购物车,以清除运输缓存数据。