web-dev-qa-db-fra.com

Filtrer les passerelles de paiement WooCommerce disponible par rôle

Je sais que WooCommerce n'est pas bien accueilli ici, car ce n'est pas directement lié à WordPress, mais comme le support sur les forums WooCommerce est aussi terrible, et que les gens ici prouvant qu'ils sont capables et compétents, je vais essayer.

Un de nos clients souhaite afficher/masquer des passerelles de paiement spécifiques pour des groupes d’utilisateurs spécifiques. Voici la situation:

  • Groupe d'utilisateurs A: Client
  • Groupe d'utilisateurs B: Société

Seul B est censé pouvoir payer via facture, donc après avoir reçu la marchandise.

Voici où je suis à ce jour:

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );

 function payment_gateway_disable_private( $available_gateways ) {
   if ( isset( $available_gateways['authorize'] ) && $woocommerce->customer->get_role($role) <> 'Company' ) {
      unset( $available_gateways['authorize'] );
   } else if ( isset( $available_gateways['cheque'] ) && $woocommerce->customer->get_role($role) == 'Customer' ) {
      unset( $available_gateways['cheque'] );
}
   return $available_gateways;
}

"chèque" est le nom de la passerelle de paiement utilisée pour le paiement de la facture.

Cela ne fonctionne pas encore, alors que me manque-t-il? Toute aide est grandement appréciée!

2
theHubi

Arrrrg une question WooCommerce ... vite le brûler sur le bûcher!

Il y a quelques problèmes avec votre fonction de rappel ci-dessus:

  • vous ne déclarez pas global $woocommerce, vous n'avez donc pas accès à la variable globale $woocommerce.
  • et $woocommerce->customer contient l'état de la classe WC_Customer; toutefois, cette classe ne contient pas de méthode get_role(); de plus, vous ne définissez nulle part dans votre callback la valeur de la variable $role de sorte que cela ne fonctionnerait pas, même si la méthode existait.

Recherchez plutôt le rôle d'utilisateur dans le tableau de rôles renvoyé sur l'objet WP_User:

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );

 function payment_gateway_disable_private( $available_gateways ) {

    $user = wp_get_current_user();

    if ( isset( $available_gateways['authorize'] ) && in_array('company', $user->roles) ) {
        unset( $available_gateways['authorize'] );
    } else if ( isset( $available_gateways['cheque'] ) && in_array('customer', $user->roles)  ) {
        unset( $available_gateways['cheque'] );
    }

   return $available_gateways;

}

Remarque: si l'utilisateur est déconnecté, il n'aura aucun rôle. Par conséquent, vous pouvez souhaiter en rendre compte et effectuer une opération différente, telle que rediriger l'utilisateur de façon à ce qu'il se connecte avant de faire ses achats en fonction de votre cas d'utilisation, vous pouvez utiliser is_user_logged_in() pour cela.

3
userabuser