2017-10-10 6 views
3

Dans WooCommerce J'ai un code personnalisé pour masquer la TVA pour des rôles utilisateur spécifiques, et il fonctionne parfaitement pour tous les rôles sauf pour un appelé Platinum, où il ne cache pas la TVA mais reste comme tous les rôles utilisateur par défaut.Masquer la TVA pour des rôles utilisateur spécifiques dans WooCommerce

Ce que j'ai besoin est pour ce code pour cacher la TVA pour le platine aussi - il le fait pour les autres rôles que j'énuméré

Comment puis-je le faire fonctionner pour mon rôle d'utilisateur « platine » aussi?

C'est le code que j'utilise:

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

Répondre

3

Update 2

1) Votre fonction conditionnelle

Première current_user_can() est recommandé de ne pas utiliser des rôles utilisateur directement et ne peut avoir une capacité (ou dans votre cas un rôle d'utilisateur) à l'époque ...

également dans WooCommerce 3+ vous devrez utiliser WC()->customer->set_is_vat_exempt(true); au lieu de WC()->customer->is_vat_exempt = true;

Vous utilisez une fonction conditionnelle répétitive en fonction de vos rôles d'utilisateurs spéciaux 3 fois. J'ai donc définir une fonction personnalisée conditionnelle qui devrait fonctionner parfaitement:

## 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 
} 

Et (vos autres fonctions):

## 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; 
} 

Code va dans le fichier function.php de votre thème enfant actif (thème actif ou dans un fichier plugin).

Tout le code a été testé et fonctionne.


2) Pour vos rôles d'utilisateur de création

vous pourriez plutôt utiliser l'excellent et très complet User Role Editor (free) plugin, qui vous permettra de créer des rôles utilisateur, affiner et de vérifier leurs capacités (pour chaque rôle créé).

Pour votre code de création de rôles utilisateur, vous ne devez l'exécuter qu'une seule fois. Je l'ai revisité, fait quelques changements et je l'ai compacté.

## 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(); 

Code va dans le fichier function.php de votre thème enfant actif (thème actif ou dans un fichier plug-in).

+0

Il vient avec une erreur une fois que je l'ai remplacé avec mon code actuel. J'ai joint l'erreur en haut du message, car il était trop long pour poster ici. – eMikkelsen

+0

@eMikkelsen J'ai mis à jour la fonction conditionnelle (à la fin). Essayez-le s'il vous plaît. Merci – LoicTheAztec

+0

Cela a fonctionné !! Fantastique! – eMikkelsen

0

Je ne sais pas comment le code fonctionne parce que la fonction current_user_can prend dans un paramètre: current_user_can function

Je réécrivaient toutes les sections avec ce code:

if (is_user_logged_in() && current_user_can('bronze', 'sølv', 'guld', 'platinum')) { 

à quelque chose comme ceci:

if (is_user_logged_in() && (current_user_can('bronze') || current_user_can('sølv') || current_user_can('guld') || current_user_can('platinum'))) {