簡體   English   中英

WooCommerce 添加到購物車,從自定義 select 字段添加第二個產品

[英]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”添加過濾器或掛鈎

有什么問題?

其實有很多問題:

  1. 只要我 select 下拉列表中的某個值,它就會永久保留。 即使在刷新頁面后,即使我選擇了另一個值,它仍然會添加到購物車中。 看起來我必須以某種方式清除 POST 值。 我嘗試添加$_POST = array(); unset($_POST); 最后添加到購物車 function 但這不起作用。
  2. 主要產品未添加到購物車 - 當我點擊“添加到購物車”時,僅將附加產品添加到購物車。 我使用預設的產品 ID 分別檢查了添加到購物車 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_buttonwoocommerce_before_add_to_cart_quantitywoocommerce_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.php
  • 當通過woocommerce_before_add_to_cart_button插入時,輸入字段被放置在產品庫存文本和添加到購物車按鈕之間,這不是最好的位置,看起來您要么必須編輯模板文件或使用 JS 才能使用當前的 WC (4.1) 掛鈎實現更好的放置。
  • wc_get_products () function 比較慢。 在我的測試中,它比通過$wpdb->get_results進行的類似查詢慢 10 倍
    • 如果由於某種原因沒有 $_POST 值,最好將product_option_add_to_cart()自定義 function 代碼插入if (isset($_POST['chain_type'])) {... }以防止 PHP 通知

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM