[英]WooCommerce Add to cart, add second product from a custom select field
我需要的
我想在不使用重量級插件的情況下簡單地實現產品插件,這對我的需求來說太過分了。 此外,我希望能夠跟蹤任何插件都不提供的附加組件庫存。 為了讓事情更清楚一點,我可以說主要產品是吊墜,附加產品是鏈條。 客戶應該能夠在吊墜頁面上 select 鏈,當他或她點擊添加到購物車按鈕時,兩個項目都應該添加到購物車。
所以我想我可以只使用隱藏的單品作為附加產品。 這個想法是在我的附加產品中添加一個下拉列表,並通過 POST 獲取選定的值,並將其與主要產品一起添加到購物車中。 到目前為止,一切都很好。
我做了什么
這是我的代碼:
add_action( 'woocommerce_before_add_to_cart_button', 'chain_selection_field' );
function chain_selection_field() {
global $product;
$domain = 'woocommerce';
$args = array(
'sku' => 'SOME_TEXT',
'stock_status' => 'instock',
);
$products = wc_get_products( $args );
foreach ($products as $product) {
$product_id = $product->get_id();
$options[$product_id] = $product->get_name();
}
woocommerce_form_field('chain_type', array(
'type' => 'select',
'label' => __('Chain type selection', $domain),
'required' => true,
'options' => $options,
),'');
}
add_action('woocommerce_add_to_cart', 'product_option_add_to_cart');
function product_option_add_to_cart() {
$product_id = $_POST['chain_type'];
$found = false;
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->id == $product_id )
$found = true;
}
if ( ! $found )
WC()->cart->add_to_cart( $product_id );
} else {
WC()->cart->add_to_cart( $product_id );
}
}
添加到購物車的實現取自此處 - 如何為“woocommerce_add_to_cart”添加過濾器或掛鈎
有什么問題?
其實有很多問題:
$_POST = array();
或unset($_POST);
最后添加到購物車 function 但這不起作用。問題是我在 foreach 循環中使用了全局變量$product
。 所以它打破了循環邏輯並使用全局$product
而不是所需的數組值。 因此,使代碼正常工作所需要做的就是將 foreach 循環代碼更改為:
foreach ($products as $single_product) {
$product_id = $single_product->get_id();
$options[$product_id] = $single_product->get_name();
否則代碼工作正常,雖然我必須做一些評論:
<form>... </form>
中調用的鈎子插入代碼才有效,即woocommerce_before_add_to_cart_button
、 woocommerce_before_add_to_cart_quantity
和woocommerce_after_add_to_cart_quantity
(您可以在模板中自行檢查 - https:/ /github.com/woocommerce/woocommerce/blob/4.1.0/templates/single-product/add-to-cart/simple.php )用於簡單產品,還有一些稱為內部變化循環或可變產品的鈎子,可以找到這里 - https://github.com/woocommerce/woocommerce/blob/4.1.0/templates/single-product/add-to-cart/variable.phpwoocommerce_before_add_to_cart_button
插入時,輸入字段被放置在產品庫存文本和添加到購物車按鈕之間,這不是最好的位置,看起來您要么必須編輯模板文件或使用 JS 才能使用當前的 WC (4.1) 掛鈎實現更好的放置。wc_get_products ()
function 比較慢。 在我的測試中,它比通過$wpdb->get_results
進行的類似查詢慢 10 倍
product_option_add_to_cart()
自定義 function 代碼插入if (isset($_POST['chain_type'])) {... }
以防止 PHP 通知
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.