WooCommerce Checkout - Valider les rôles des utilisateurs et le contenu du panier
P粉545910687
P粉545910687 2024-04-03 11:58:52
0
1
779

Je suis confronté à des difficultés avec le processus de paiement dans WooCommerce.

J'utilise le plugin "B2B for WooCommerce" pour différencier les produits classiques des produits B2B. La scène est la suivante :

1 - Un visiteur non enregistré ajoute un produit de la catégorie "Général" (disponible par défaut aux visiteurs non enregistrés) à son panier.

2 - Sur la page de paiement, le visiteur décide de s'inscrire en tant que client B2B (via les champs de sélection du formulaire sur la page de paiement).

3 - Les processus d'inscription et de paiement se déroulent simultanément sur cette page.

Je souhaite empêcher qu'une commande soit passée si l'utilisateur s'inscrit en tant que client B2B et a un produit "normal" dans le panier. Étant donné que ces deux actions (inscription et paiement) se produisent en même temps, les hooks WooCommerce typiques ne fonctionnent pas comme prévu.

Comment vérifier le rôle de l'utilisateur et le contenu du panier enregistré lors du processus de paiement et bloquer la commande lorsque les conditions sont remplies ? Ou peut-être existe-t-il un moyen meilleur et plus simple de procéder ?

J'ai essayé la fonctionnalité de réinitialisation du panier et de rechargement de la page.

Éditeur :

Rôle utilisateur : Wwp_wholesaler

J'ai créé deux catégories de produits WooCommerce : Général et Gros. "Normal" est visible par tous les visiteurs. Après avoir enregistré le rôle, « Wwp_wholesaler » pourra voir « grossiste ».

L'attribut name du champ de sélection est : "afreg_select_user_role". Les attributs de valeur des options sont « client » (pour les clients réguliers) et « wwp_wholesaler » (pour les grossistes).

P粉545910687
P粉545910687

répondre à tous(1)
P粉014293738

Le code suivant arrêtera le processus de paiement plus tôt lorsqu'il détectera qu'un client B2B a un article régulier dans son panier. Dans ce cas, les articles habituels sont supprimés du panier et un message d'erreur est généré, empêchant la commande d'être passée.

Remarque : L'alias du rôle utilisateur fourni est erroné car l'alias du rôle utilisateur n'est pas en majuscule.

Code :

add_action( 'woocommerce_checkout_create_order', 'process_checkout_creating_order',  10, 2  );
function process_checkout_creating_order( $order, $data ) {
    global $current_user;

    $targeted_field = 'afreg_select_user_role'; // Checkout field key to target
    $targeted_role  = 'wwp_wholesaler'; // User role slug (for B to B)
    $targeted_term  = 'Normal'; // Category term for Regular items

    // Targeting B to B user role only
    if( ( isset($data[$targeted_field]) && $data[$targeted_field] === $targeted_role ) 
    || in_array( $targeted_role, $current_user->roles ) ) {
        $cart = WC()->cart; //  Cart live object
        $item_keys_found = array(); // Initializing

        // Loop through cart items to search for "regular" items
        foreach ( $cart->get_cart() as $item_key => $item ) {
            if ( has_term( $targeted_term, 'product_cat', $item['product_id']) ) {
                $item_keys_found[] = $item_key;
            }
        }
        // If regular items are found
        if ( count($item_keys_found) > 0 ) {
            // Loop through regular item keys (and remove each)
            foreach ( $item_keys_found as $item_key ) {
                $cart->remove_cart_item( $item_key );
            }
            // Throw an error message, avoiding saving and processing the order
            throw new Exception( 
                sprintf( __('You are not allowed to purchase "Regular" items.'.
                ' %d "Regular" %s been removed from cart. %s', 'woocommerce'),
                    count($item_keys_found),
                    _n('item has', 'items have', count($item_keys_found), 'woocommerce'),
                    sprintf( '%s', get_permalink(wc_get_page_id('shop')), __('Continue shopping', 'woocommerce') )
            ) );
        }
    }
}

Le code est dans le fichier function.php du thème enfant (ou dans le plugin). Testé et fonctionnel.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal