我已经搜索了这个网站和其他网站,试图找到可以放入我的functions.php文件中的代码,以便某些用户/客人在结账时看不到“本地取货”选项。我的商店有 3 个用户角色:管理员、local_pickup_customer 和 customer。当客人或客户退房时,我希望取消设置本地取件。在尝试了无数代码之后,我决定并编辑了下面的代码,因为它对我来说似乎是最合乎逻辑的。我不喜欢寻找客户和客人来删除本地取货(这对于客人而言似乎更棘手),而是喜欢在用户角色不是管理员或 local_pickup_customer 时删除本地取货。
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 = 'local_pickup:2'; // The shipping rate ID to hide
$targeted_user_roles = array('administrator', 'local_pickup_customer'); // 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;
}
我已经为此工作了几个小时,我快要疯了。我确保我有正确的rate_id(运行一些调试代码来获取它)。当我进行任何更改时,我确保清除浏览器和购物车缓存。对于客户或客人来说,本地取货选项不会消失。我做错了什么?
我建议循环遍历费率并使用更具体的匹配(使用
method_id
)来确定是否unset
。如果需要,您可以使用此方法有效地取消设置多个。比如:
add_filter( 'woocommerce_package_rates', 'hide_local_pickup_for_users', 10, 2 );
function hide_local_pickup_for_users( $rates, $package ) {
$targeted_rate_id = 'local_pickup';
$targeted_user_roles = array('administrator', 'local_pickup_customer');
$current_user = wp_get_current_user();
$matched_roles = array_intersect($targeted_user_roles, $current_user->roles);
if ( empty($matched_roles) ) {
foreach( $rates as $rate_key => $rate ) {
if ( $rate->method_id === $targeted_rate_id ) {
unset($rates[$rate_key]);
}
}
}
return $rates;
}
我还将优先级设置为 10 而不是 100,如我的示例所示。