在WooCommerce中,我有一些自定义代码可以隐藏特定用户角色的增值税,除了名为 Platinum 之外的所有角色,它都能完美地运行,它不会隐藏增值税但是仍然是所有默认用户角色。
我需要的是此代码还可以隐藏铂金增值税 - 它适用于我列出的其他角色
我怎样才能让它适用于我的"白金"用户角色呢?
这是我使用的代码:
/**
* Function that will check for user role and turn off VAT/tax for that role
*/
function wc_diff_rate_for_user() {
// check for the user role
if ( is_user_logged_in() && current_user_can( 'bronze', 'sølv', 'guld', 'platinum' ) ) {
// set the customer object to have no VAT
WC()->customer->is_vat_exempt = true;
}
}
add_action( 'template_redirect', 'wc_diff_rate_for_user', 1 );
/**
* Function that filters the variable product hash based on user
*/
function wc_get_variation_prices_hash_filter( $hash, $item, $display ) {
// check for the user role
if ( is_user_logged_in() && current_user_can( 'bronze', 'sølv', 'guld', 'platinum' ) ) {
// clear key 2, which is where taxes are
$hash['2'] = array();
}
// return the hash
return $hash;
}
add_filter( 'woocommerce_get_variation_prices_hash', 'wc_get_variation_prices_hash_filter', 1, 3 );
/**
* Function that removes the price suffix (inc. Tax) from variable products based on role
*/
function wc_get_price_suffix_filter( $price_display_suffix, $item ) {
// check for the user role
if ( is_user_logged_in() && current_user_can( 'bronze', 'sølv', 'guld', 'platinum' ) ) {
// return blank if it matches
return '';
}
// return if unmatched
return $price_display_suffix;
}
add_filter( 'woocommerce_get_price_suffix', 'wc_get_price_suffix_filter', 10, 2 );
//B2B Roller
add_role('bronze', __(
'Bronze'),
array(
'read' => false, // Allows a user to read
'create_posts' => false, // Allows user to create new posts
'edit_posts' => false, // Allows user to edit their own posts
)
);
add_role('sølv', __(
'Sølv'),
array(
'read' => false, // Allows a user to read
'create_posts' => false, // Allows user to create new posts
'edit_posts' => false, // Allows user to edit their own posts
)
);
add_role('guld', __(
'Guld'),
array(
'read' => false, // Allows a user to read
'create_posts' => false, // Allows user to create new posts
'edit_posts' => false, // Allows user to edit their own posts
)
);
add_role('platinum', __(
'Platinum'),
array(
'read' => false, // Allows a user to read
'create_posts' => false, // Allows user to create new posts
'edit_posts' => false, // Allows user to edit their own posts
)
);
答案 0 :(得分:3)
更新2
1)您的条件函数
首先
current_user_can()
不建议直接与用户角色一起使用,并且当时只能有一个功能(或者在您的情况下是一个用户角色)...
同样在WooCommerce 3+中,您必须使用 WC()->customer->set_is_vat_exempt( true );
而不是WC()->customer->is_vat_exempt = true;
您正在使用基于特殊用户角色的重复条件函数3次。所以我设置了一个应该完美运行的自定义条件函数:
## The (repetitive) conditional function based on your "special" user roles
function is_special_user_role(){
if ( ! is_user_logged_in() ) return false;
$user = wp_get_current_user(); // current user
$user_roles = $user->roles; // It's always an array (as a user can have many roles)
// HERE your defined user roles
$defined_user_roles = array( 'bronze', 'sølv', 'guld', 'platinum' );
if ( count( array_intersect( $user_roles, $defined_user_roles ) ) > 0 ) return true;
else return false; // ==> Added update here
}
(你的其他功能):
## Function that will check for user role and turn off VAT/tax for that role
add_action( 'template_redirect', 'wc_diff_rate_for_user', 1 );
function wc_diff_rate_for_user() {
// check for the user role and set the customer object to have no VAT
if ( is_special_user_role() )
WC()->customer->set_is_vat_exempt( true ); // Updated HERE
}
## Function that filters the variable product hash based on user
add_filter( 'woocommerce_get_variation_prices_hash', 'wc_get_variation_prices_hash_filter', 1, 3 );
function wc_get_variation_prices_hash_filter( $hash, $item, $display ) {
// check for the user role and clear key 2, which is where taxes are
if ( is_special_user_role() )
$hash['2'] = array();
return $hash; // return the hash
}
## Function that removes the price suffix (inc. Tax) from variable products based on role
add_filter( 'woocommerce_get_price_suffix', 'wc_get_price_suffix_filter', 10, 2 );
function wc_get_price_suffix_filter( $price_display_suffix, $item ) {
// check for the user role return blank if it matches
if ( is_special_user_role() )
$price_display_suffix = '';
return $price_display_suffix;
}
代码进入活动子主题(活动主题或任何插件文件)的function.php文件中。
所有代码都经过测试并且有效。
2)为您的用户角色创建
相反,您可以使用优秀且非常完整的User Role Editor (free) plugin,这将允许您创建用户角色,微调并检查其功能(对于每个创建的角色)。
对于您的用户角色创建代码,您应该只运行一次。我重新审视了它,进行了一些更改并将其压缩。
## Special user roles creation ==> this should be runned just once!
function special_ser_role_creation(){
// Your "Special" user roles slug / name pairs
$special_roles_array = array(
'bronze' => __( 'Bronze' ),
'sølv' => __( 'Sølv' ),
'guld' => __( 'Guld' ),
'platinum' => __( 'Platinum' ),
);
$roles_caps = array(
'read' => false, // Allows a user to read
'create_posts' => false, // Allows user to create new posts
'edit_posts' => false, // Allows user to edit their own posts
);
$existing_user_roles = array_keys( wp_roles()->get_names() );
// Iterating through each user roles and create them
foreach( $special_roles_array as $role_slug => $role_name ){
// If user role doesn't exist yet we create it
if (! in_array( $role_slug, $existing_user_roles) )
add_role( $role_slug, $role_name, $roles_caps );
}
}
// Run the function once (then comment it or remove it)
special_ser_role_creation();
代码进入活动子主题(活动主题或任何插件文件)的function.php文件中。
答案 1 :(得分:0)
不确定代码是如何工作的,因为函数current_user_can接受一个参数: current_user_can function
我会用这段代码重写所有部分:
if ( is_user_logged_in() && current_user_can( 'bronze', 'sølv', 'guld', 'platinum' ) ) {
对于这样的事情:
if ( is_user_logged_in() && ( current_user_can( 'bronze' ) || current_user_can( 'sølv' ) || current_user_can( 'guld' ) || current_user_can( 'platinum' ) ) ) {