WooCommerce添加到购物车,从自定义选择字段添加第二个产品。

问题描述 投票:0回答:1

我需要什么

我想做一个简单的产品附加组件的实现,而不需要使用重量级的插件,这对我的需求来说是多余的。另外,我希望能够跟踪附加组件的库存,这是任何一个插件都没有提供的。为了让事情更清楚,我可以说主产品是一个挂件,附加组件是一条链子。客户应该可以在挂件页面选择链子,当他或她点击添加到购物车按钮时,两个项目都应该被添加到购物车。

所以我想可以直接用隐藏的单品作为附加项。我的想法是在我的附加产品中添加一个下拉菜单,然后通过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. 只要我在下拉菜单中选择了某个值,它就会被永远保留下来。即使刷新页面后,即使我选择了其他的值,它仍然被添加到购物车。看来我必须要清除POST值了。我试过添加 $_POST = array();unset($_POST); 在添加到购物车功能的最后,但这没有工作。
  2. 主产品没有添加到购物车 - 当我点击 "添加到购物车 "时,只有附加产品被添加到购物车。我用预设的产品ID分别检查了添加到购物车功能,发现它的工作原理和预期一样,两个产品都被添加到购物车。
php wordpress post woocommerce hook-woocommerce
1个回答
0
投票

问题是 我使用了全局变量 $product 的 foreach 循环中。所以它打破了循环逻辑,使用全局的 $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_quantitywoocommerce_after_add_to_cart_quantity (你可以自己在模板中查看-------------------------------------------------。https:/github.comwoocommercewoocommerceblob4.1.0templatessingle-productadd-to-cartsimple.php。)的简单产品,还有一些叫做内部变化循环vor变量产品的钩子,可以在这里找到--。https:/github.comwoocommercewoocommerceblob4.1.0templatessingle-productadd-to-carvariable.php。
  • 当插入 woocommerce_before_add_to_cart_button 输入字段被放置在产品库存文本和添加到购物车按钮之间,这不是最好的位置,看起来你必须编辑模板文件或使用JS来实现更好的位置与当前的WC(4.1)挂钩。
  • wc_get_products () 功能相当慢。在我的测试中,它比类似的查询慢了10倍。$wpdb->get_results
    • 不如插入 product_option_add_to_cart() 自定义函数代码到 if (isset($_POST['chain_type'])) { ... } 以防止PHP通知因某种原因没有$_POST值。
© www.soinside.com 2019 - 2024. All rights reserved.