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:
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!
Il y a quelques problèmes avec votre fonction de rappel ci-dessus:
global $woocommerce
, vous n'avez donc pas accès à la variable globale $woocommerce
.$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.