如果尚未将多个产品添加到购物车中,则将其添加到购物车中 [英] Add multiple products to cart if they are not already in cart

查看:110
本文介绍了如果尚未将多个产品添加到购物车中,则将其添加到购物车中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在WooCommerce中,我实现了 @jtsternberg的 WooCommerce:允许通过购物车中的查询字符串将多个产品添加到购物车中,以允许一次添加多个产品,但是我收到了许多客户的投诉,他们实际上试图使用包含多个产品的链接之一。

In WooCommerce I've implemented @jtsternberg's WooCommerce: Allow adding multiple products to the cart via the add-to-cart query string to allow adding multiple products at once, but I've received many complaints from customers who actually try to use one of the links containing multiple products.

对于初学者来说,如果客户单击结帐,然后单击浏览器的后退按钮,则所有项目数量都会增加。我通过在添加购物车行为完成后将用户重定向到去除了所有其他参数的购物车URL来解决此问题,但这并不理想。

For starters, if the customer clicks checkout and then clicks the browser "back" button, all the item quantities increment. I solved this by redirecting the user to the cart URL stripped of any additional parameters after the add-to-cart behavior completes, but it's not ideal.

我真正想要的是是要先检查商品是否在购物车中,并且仅在购物车尚不存在时才添加到购物车。有人做了类似的事情吗?

What I really want is to check if the item is in the cart first and only add to cart if it isn't there already. Has anyone done something similar?

工作更新:
我最终修改了@jtsternberg的代码以使用完全独立的参数名称以避免与默认的购物车行为冲突。然后,通过将行为包装在检查中以查看该新参数是否存在,我可以使用下面的@LoicTheAztec建议代码。这是完整的部分:

Working Update: I ended up modifying the code from @jtsternberg to use a completely separate param name in order to avoid conflict with the default add-to-cart behavior. Then I was able to use @LoicTheAztec's suggested code below by wrapping the behavior in a check to see if that new param exists. Here's the full section:

function custom_product_link() {
  if (empty( $_REQUEST['multi-product-add'])) {
    return;
  }

  $product_ids = explode( ',', $_REQUEST['multi-product-add'] );

  foreach ( $product_ids as $product_id ) {
    $product_id        = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $product_id ) );
    $was_added_to_cart = false;
    $adding_to_cart    = wc_get_product( $product_id );

    if ( ! $adding_to_cart ) {
      continue;
    }

    $add_to_cart_handler = apply_filters( 'woocommerce_add_to_cart_handler', $adding_to_cart->product_type, $adding_to_cart );

    if ( 'simple' !== $add_to_cart_handler ) {
      continue;
    }

    // For now, quantity applies to all products.. This could be changed easily enough, but I didn't need this feature.
    $quantity          = empty( $_REQUEST['quantity'] ) ? 1 : wc_stock_amount( $_REQUEST['quantity'] );
    $passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );

    if ( $passed_validation && false !== WC()->cart->add_to_cart( $product_id, $quantity ) ) {
      wc_add_to_cart_message( array( $product_id => $quantity ), true );
    }
  }
  if ( wc_notice_count( 'error' ) === 0 ) {
    // If has custom URL redirect there
    if ( $url = apply_filters( 'woocommerce_add_to_cart_redirect', false ) ) {
      wp_safe_redirect( $url );
      exit;
    } elseif ( get_option( 'woocommerce_cart_redirect_after_add' ) === 'yes' ) {
      wp_safe_redirect( wc_get_cart_url() );
      exit;
    }
  }
}

function check_product_added_to_cart( $passed, $product_id, $quantity) {
  if (!empty( $_REQUEST['multi-product-add'])) {
    foreach (WC()->cart->get_cart() as $cart_key => $cart_item ){
      // if products are already in cart:
      if( $cart_item['product_id'] == $product_id ) {
        // Set the verification variable to "not passed" (false)
        $passed = false;
        // (Optionally) Displays a notice if product(s) are already in cart
        // wc_add_notice( '<strong>' . $btn['label'] . '</strong> ' . __( 'This product is already in your cart.', 'woocommerce' ), 'error' );
        // Stop the function returning "false", so the products will not be added again
        return $passed;
      }
    }
  }
  return $passed;
}
add_action( 'wp_loaded', 'custom_product_link', 15 );
add_action( 'woocommerce_add_to_cart_validation', 'check_product_added_to_cart', 10, 3 );


推荐答案

如您所使用的代码中的 woocommerce_add_to_cart_validation 过滤器挂钩,您可以在自定义挂钩函数中使用它来检查购物车中是否已经稀有产品,例如:

As in the code you are using you have woocommerce_add_to_cart_validation filter hook inside it, you can use it in a custom hooked function to check if products rare already in cart with something like:

add_action( 'woocommerce_add_to_cart_validation', 'check_product_added_to_cart', 10, 3 );
function check_product_added_to_cart( $passed, $product_id, $quantity) {
    foreach (WC()->cart->get_cart() as $cart_key => $cart_item ){
        // if products are already in cart:
        if( $cart_item['data']->get_id() == $product_id ) {
            // Set the verification variable to "not passed" (false)
            $passed = false;
            // (Optionally) Displays a notice if product(s) are already in cart
            wc_add_notice( '<strong>' . $btn['label'] . '</strong> ' . __( 'This product is already in your cart.', 'woocommerce' ), 'error' );
            // Stop the function returning "false", so the products will not be added again
            return $passed;
        }
    }
    return $passed;
}

代码包含在您活动的子主题的function.php文件中(

代码已经过测试,通常可以在您的自定义条件下使用...

Code is tested and this normally should works with your customization…


对于产品数量,您可以将 $ quantity 参数与 $ cart_item ['quantity'] 在某些情况下……

For product quantities, you can use the $quantity argument with $cart_item['quantity'] in some conditions…

这篇关于如果尚未将多个产品添加到购物车中,则将其添加到购物车中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆