【问题标题】:Hide VAT for specific user roles in WooCommerce在 WooCommerce 中隐藏特定用户角色的增值税
【发布时间】:2018-03-22 12:03:34
【问题描述】:

在 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
 )
);

【问题讨论】:

    标签: php wordpress woocommerce user-roles tax


    【解决方案1】:

    更新 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 文件中。

    【讨论】:

    • 一旦我用我当前的代码替换它就会出现错误。我已将错误附在帖子顶部,因为这里发布太长了。
    • @eMikkelsen 我已经更新了条件函数(最后)。请尝试一下。谢谢
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2019-03-15
      • 2017-02-11
      • 2014-05-26
      • 2020-11-17
      • 1970-01-01
      • 2015-06-21
      • 2019-01-17
      • 2015-08-26
      相关资源
      最近更新 更多