4 votes

Masquer la méthode de paiement en fonction du type de produit dans WooCommerce

Dans WoCommerce, je voudrais désactiver des méthodes de paiement particulières et afficher des méthodes de paiement particulières pour des produits d'abonnement dans WooCommerce (et vice versa).

Ceci est la chose la plus proche que nous ayons trouvée mais ne fait pas ce à quoi je m'attends.

Oui, il y a des plugins qui feront cela mais nous voulons réaliser cela sans utiliser un autre plugin et sans rendre notre feuille de style plus cauchemardesque qu'elle ne l'est déjà.

Toute aide à ce sujet s'il vous plaît ?

9voto

LoicTheAztec Points 72349

Voici un exemple avec une fonction personnalisée accrochée au filtre woocommerce_available_payment_gateways, où je peux désactiver les passerelles de paiement en fonction des articles du panier (type de produit):

add_filter('woocommerce_available_payment_gateways', 'conditional_payment_gateways', 10, 1);
function conditional_payment_gateways( $available_gateways ) {
    // Pas dans l'administrateur
    if( is_admin() ) 
        return $available_gateways;

    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $prod_variable = $prod_simple = $prod_subscription = false;
        // Obtenir l'objet WC_Product
        $product = wc_get_product($cart_item['product_id']);
        // Obtenir les types de produits dans le panier (exemple)
        if($product->is_type('simple')) $prod_simple = true;
        if($product->is_type('variable')) $prod_variable = true;
        if($product->is_type('subscription')) $prod_subscription = true;
    }
    // Supprimer la passerelle de paiement contre remboursement (cod) pour les produits simples
    if($prod_simple)
        unset($available_gateways['cod']); // unset 'cod'
    // Supprimer la passerelle de paiement Paypal (paypal) pour les produits variables
    if($prod_variable)
        unset($available_gateways['paypal']); // unset 'paypal'
    // Supprimer la passerelle de paiement par virement bancaire (Bacs) pour les produits d'abonnement
    if($prod_subscription)
        unset($available_gateways['bacs']); // unset 'bacs'

    return $available_gateways;
}

Le code va dans le fichier function.php de votre thème enfant actif (ou thème) ou également dans n'importe quel fichier de plugin.

Tout le code est testé sur Woocommerce 3+ et fonctionne.

Ceci n'est qu'un exemple pour vous montrer comment les choses peuvent fonctionner. Vous devrez l'adapter

0voto

Erick Paulino Points 1

Ce code a été très utile pour moi, mais il contient une erreur que j'ai dû corriger : la ligne

 $prod_variable = $prod_simple = $prod_subscription = false;

doit être placée EN DEHORS (avant) de la boucle FOREACH sinon le drapeau sera réinitialisé à chaque nouvel élément exécuté. Dans mon cas, j'avais besoin de désactiver une méthode de paiement spécifique chaque fois qu'un produit d'abonnement était dans le panier. Tel quel, ce code fonctionnera seulement s'il y a un seul produit d'abonnement. Si j'ajoute un autre produit différent dans le panier, le drapeau redeviendra faux et la méthode de paiement sera chargée. Mettre la ligne en dehors de la boucle FOREACH résoudra ce problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X