【问题标题】:How to add filter or hook for "woocommerce_add_to_cart"如何为“woocommerce_add_to_cart”添加过滤器或挂钩
【发布时间】:2015-04-06 13:16:03
【问题描述】:

我想同时添加两个产品到购物车,一个是原始(当前)产品,第二个来自下拉列表

add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
$cnt=2
function custome_add_to_cart() {
    global $woocommerce;
      $cnt = $cnt + 1;
      echo $cnt."X";
      echo $p_id=$_POST['assessories'];
    $woocommerce->cart->add_to_cart($p_id, 1);

}

输出:- 正如您在下面的输出图像中看到的那样,它在购物车中多次添加相同的下拉项目,但我只想将 1 个数量添加到购物车中。似乎 add_to_cart 函数运行了很多次。 我应该做什么或如何通过将第二个下拉产品作为参数添加到购物车功能来添加过滤器?所以我也可以将此产品添加到购物车中。

【问题讨论】:

  • 我建议你试试Composite Products
  • Composite Products 是一个付费插件。我只想要第二个具有 id ($p_id) 的产品也应该使用原始添加到购物车产品添加到购物车。
  • 是的,但它完全符合您的描述。
  • @luckyamit 你找到解决方案了吗?

标签: php wordpress filter woocommerce hook


【解决方案1】:

您可能正在寻找具有某些属性的可变产品

无论如何,如果你真的想这样做,那么你只需要 remove_action 函数:

add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
function custome_add_to_cart() {
    $p_id=$_POST['assessories'];
    remove_action('woocommerce_add_to_cart', __FUNCTION__);
    WC()->cart->add_to_cart( $p_id );
}

这可以防止动作无限循环,并且非常简单。所以它只会为该产品添加一次。您可能希望获取添加到购物车的数量并将其作为第二个参数提供给 WC()->cart->add_to_cart 函数,因此它们的数量相同

__FUNCTION__ 是一个神奇的 PHP 标签,它只是将当前函数的名称作为字符串提供给您,如果函数名称不同,它仍然可以工作

【讨论】:

    【解决方案2】:

    这可能是旧的,但您是否尝试在添加到购物车后取消设置评估参数?,这会打破循环。

    function custome_add_to_cart() {
        global $woocommerce;
        if(isset($_POST['assessories'])){
            $cnt = $cnt + 1;
            echo $cnt . "X";
            echo $p_id = $_POST['assessories'];
            $woocommerce->cart->add_to_cart($p_id, 1);
            unset($_POST['assessories']);
        }
    }
    

    【讨论】:

      【解决方案3】:

      这应该有效:

      add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
      function custome_add_to_cart() {
          global $woocommerce;
      
          $product_id = $_POST['assessories'];
      
          $found = false;
      
          //check if product already in cart
          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 product not found, add it
              if ( ! $found )
                  WC()->cart->add_to_cart( $product_id );
          } else {
              // if no products in cart, add it
              WC()->cart->add_to_cart( $product_id );
          }
      }
      

      基于以下来源:https://docs.woothemes.com/document/automatically-add-product-to-cart-on-visit/

      【讨论】:

      • 感谢分享这个解决方案。我必须补充一点,如果由于某种原因没有 $_POST 输入,最好将函数代码放在 if (isset($_POST['assessories'])) { } 中以避免 PHP 通知。
      【解决方案4】:

      woocommerce“add_to_cart”函数运行钩子“woocommerce_add_to_cart”。因此,在您的代码中运行“add_to_cart”,它正在运行“woocommerce_add_to_cart”,它运行您的代码,它运行“add_to_cart”等等……您创建了一个递归循环。

      你需要另辟蹊径,或者停止在你自己的代码中调用$woocommerce->cart->add_to_cart($p_id, 1);

      【讨论】:

      • 是的,它就像递归循环。我怎样才能避免呢?我只想要第二个具有 id ($p_id) 的产品也应该使用原始添加到购物车产品添加到购物车。
      • 如果您知道捆绑的产品 ID,您可以将它们排除在激活钩子之外
      • 我怎样才能从激活钩子中排除产品ID,你能详细说明一下吗?或者可以提供任何例子吗?
      • 一些简单的 if 语句?我不知道您的数据是如何构成的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多