我在 WooCommerce 的結(jié)帳流程方面面臨挑戰(zhàn)。
我使用「B2B for WooCommerce」外掛程式來區(qū)分常規(guī)產(chǎn)品和 B2B 產(chǎn)品。場景如下:
1 - 未註冊的訪客將「常規(guī)」類別中的產(chǎn)品(預(yù)設(shè)可供未註冊的訪客使用)新增至其購物車。
2 - 在結(jié)帳頁面上,訪客決定註冊為 B2B 客戶(透過結(jié)帳頁面上的表單選擇欄位)。
3 - 註冊和結(jié)帳流程同時發(fā)生在這個頁面上。
如果用戶註冊為 B2B 客戶並且購物車中有「常規(guī)」產(chǎn)品,我希望阻止下訂單。 由於這兩個操作(註冊和結(jié)帳)同時發(fā)生,典型的 WooCommerce 掛鉤無法如預(yù)期般運作。
如何在結(jié)帳過程中驗證正在註冊的使用者角色和購物車內(nèi)容,並在滿足條件時阻止訂單?或者也許有更好、更簡單的方法來做到這一點?
我嘗試了重置購物車並重新載入頁面的功能。
編輯:
使用者角色:Wwp_wholesaler
我創(chuàng)建了兩個 WooCommerce 產(chǎn)品類別:普通和批發(fā)。 所有訪客都可以看到「普通」。 在註冊該角色後,「Wwp_wholesaler」就可以看到「批發(fā)」。
選擇欄位的名稱屬性為:「afreg_select_user_role」。 選項的值屬性為“customer”(對於普通客戶)和“wwp_wholesaler”(對於批發(fā)商)。
當(dāng)偵測到 B2B 客戶的購物車中有常規(guī)商品時,以下程式碼將提前停止結(jié)帳流程。在這種情況下,常規(guī)商品將從購物車中刪除,並拋出錯誤訊息,從而避免下訂單。
注意:提供的使用者角色別名是錯誤的,因為使用者角色別名沒有大寫。
程式碼:
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 檔案中(或外掛程式中)。經(jīng)過測試並可以工作。