隐藏 WooCommerce 中特定用户角色的增值税

Hide VAT for specific user roles in WooCommerce

在 WooCommerce 中,我有一些自定义代码来隐藏特定用户角色的增值税,它对所有角色都非常有效,除了一个名为 Platinum 的角色,它不会隐藏增值税,但保留为所有默认用户角色。

我需要的是让此代码也隐藏铂金的增值税 - 它适用于我列出的其他角色

如何让它也适用于我的 "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
 )
);

不确定代码是如何工作的,因为函数 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' ) ) ) {

更新 2

1) 你的条件函数

First current_user_can() is not recommended to be used with user roles directly and can only have one capability (or in your case one user role) at the time…

同样在 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) 创建用户角色

Instead you could use the excellent and very complete User Role Editor (free) plugin, that will allow you to create user roles, fine tune and check their capabilities (for each created role).

对于您的用户角色创建代码,您应该 运行 它只需要一次。我重新访问了它,进行了一些更改并对其进行了压缩。

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