2017-10-10 72 views
3

在WooCommerce中,我有一些自定义代码来隐藏特定用户角色的增值税,并且它适用于所有角色,除了名为白金之外的所有角色都完全适用,其中不隐藏增值税但仍然是所有默认用户角色。在WooCommerce中为特定用户角色隐藏增值税

我需要的是这个代码隐藏增值税铂金也 - 它为其他角色我列出

我怎样才能使我的“白金”用户角色的工作吗?

这是我使用的代码:

/** 
* 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 
) 
); 

回答

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文件(活动的主题或任何插件文件)。

+0

当我用当前的代码替换它时,会出现一个错误。我在帖子顶部附加了错误,因为在这里发帖太久了。 – eMikkelsen

+0

@eMikkelsen我已经更新了条件函数(最后)。试试吧。谢谢 – LoicTheAztec

+0

这工作!太棒了! – eMikkelsen

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'))) { 
相关问题