suchen

Heim  >  Fragen und Antworten  >  Hauptteil

WooCommerce Checkout – Benutzerrollen und Warenkorbinhalte validieren

Ich stehe vor Herausforderungen beim Checkout-Prozess in WooCommerce.

Ich verwende das Plugin „B2B für WooCommerce“, um zwischen regulären Produkten und B2B-Produkten zu unterscheiden. Die Szene ist wie folgt:

1 – Ein nicht registrierter Besucher fügt seinem Warenkorb ein Produkt aus der Kategorie „Allgemein“ (standardmäßig für nicht registrierte Besucher verfügbar) hinzu.

2 – Auf der Checkout-Seite entscheidet sich der Besucher, sich als B2B-Kunde zu registrieren (über Formularauswahlfelder auf der Checkout-Seite).

3 - Der Registrierungs- und Checkout-Prozess erfolgt gleichzeitig auf dieser Seite.

Ich möchte verhindern, dass eine Bestellung aufgegeben wird, wenn sich der Benutzer als B2B-Kunde registriert und ein „normales“ Produkt im Warenkorb hat. Da diese beiden Aktionen (Anmeldung und Kaufabwicklung) gleichzeitig erfolgen, funktionieren typische WooCommerce-Hooks nicht wie erwartet.

Wie kann ich die Benutzerrolle und den Inhalt des Warenkorbs überprüfen, die während des Bestellvorgangs registriert werden, und die Bestellung sperren, wenn die Bedingungen erfüllt sind? Oder gibt es vielleicht eine bessere und einfachere Möglichkeit, dies zu tun?

Ich habe die Funktion zum Zurücksetzen des Warenkorbs und zum Neuladen der Seite ausprobiert.

Herausgeber:

Benutzerrolle: Wwp_wholesaler

Ich habe zwei WooCommerce-Produktkategorien erstellt: Allgemein und Großhandel. „Normal“ ist für alle Besucher sichtbar. Nach der Registrierung der Rolle kann „Wwp_wholesaler“ „Wholesaler“ sehen.

Das Namensattribut des Auswahlfeldes lautet: „afreg_select_user_role“. Die Wertattribute der Optionen sind „customer“ (für Stammkunden) und „wwp_wholesaler“ (für Großhändler).

P粉545910687P粉545910687224 Tage vor741

Antworte allen(1)Ich werde antworten

  • P粉014293738

    P粉0142937382024-04-04 00:01:07

    当检测到 B2B 客户的购物车中有常规商品时,以下代码将提前停止结账流程。在这种情况下,常规商品将从购物车中删除,并抛出错误消息,从而避免下订单。

    注意:提供的用户角色别名是错误的,因为用户角色别名没有大写。

    代码:

    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') )
                ) );
            }
        }
    }
    

    代码位于子主题的functions.php 文件中(或插件中)。经过测试并可以工作。

    Antwort
    0
  • StornierenAntwort