【问题标题】:Can't pass custom cart item data to WC()->cart->add_to_cart() woocommerce 4.9无法将自定义购物车商品数据传递给 WC()->cart->add_to_cart() woocommerce 4.9
【发布时间】:2021-04-21 04:45:35
【问题描述】:

我正在开发 woocommerce API 插件,并尝试使用以下代码在添加到购物车 API 端点中传递自定义购物车商品数据。

$cart_item_key = WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variations, array('margin' => 200));

并希望在 woocommerce_before_calculate_totals 挂钩上使用该自定义购物车商品数据(请参阅下面的代码),但无法在此处获取自定义购物车商品数据 ($cart_item['margin'])。

add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 30, 1 );
function custom_cart_item_price( $cart ) {
  if ( is_admin() && ! defined( 'DOING_AJAX' ) )
      return;

  foreach ( $cart->get_cart() as $cart_item ) {
    if( isset($cart_item['margin']) ){
        $final_price = ($cart_item['data']->get_price() + $cart_item['margin']);
        $cart_item['data']->set_price($final_price);
    }
  }
}

我已经安装了 Woocommerece 4.9 版本,请帮我解决这个问题。 提前致谢。

【问题讨论】:

    标签: woocommerce woocommerce-rest-api


    【解决方案1】:

    我遇到了类似的问题并找到了这个解决方案:首先,我们将定制产品添加到 Woocommerce。其次,我们生成一个标识符(ID),然后我们添加它。

    例如,使用 $_POST 获取 product-id trow a

    $myProduct = $_POST['myProduct'];
    $myProduct_id = WC()->cart->generate_cart_id($myProduct);
    
    if (!WC()->cart->find_product_in_cart($myProduct_id )) {
        WC()->cart->add_to_cart($myProduct);
    }
    

    【讨论】:

      【解决方案2】:

      为了进行测试,我使用了 woocommerce_add_to_cart_validation 钩子,并使用 WC_Cart 类的 add_to_cart() 方法将产品添加到购物车。

      add_action( 'woocommerce_add_to_cart_validation', 'add_product_to_cart_programmatically', 10, 3 );
      function add_product_to_cart_programmatically( $passed, $product_id, $quantity) {
          $product_id = 166;  // product id to add
          $quantity = 10;     // quantity product to add
          WC()->cart->add_to_cart( $product_id, $quantity, 0, array(), array( 'margin' => 200 ) );
          return $passed;
      }
      

      将产品添加到购物车后,我可以根据自定义购物车商品数据应用自定义价格:

      add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 30, 1 );
      function custom_cart_item_price( $cart ) {
      
          if ( is_admin() && ! defined( 'DOING_AJAX' ) )
              return;
      
          foreach ( $cart->get_cart() as $cart_item ) {
              if ( isset( $cart_item['margin'] ) && ! empty( $cart_item['margin'] ) ) {
                  $final_price = $cart_item['data']->get_price() + $cart_item['margin'];
                  $cart_item['data']->set_price( $final_price );
              }
          }
      }
      

      按照@danielsalare 的建议,您可以尝试增加操作的优先级,如我上面的示例所示。

      【讨论】:

      • 感谢您的回复,但我想从插件代码中动态传递边距值。
      • 动态是什么意思?您想从每个产品的元值中获取边际值吗?
      • 我的意思是保证金值不是静态值,它可以是任何值,我想通过 add_to_cart woocommerce API 传递它。
      • @RanjitKatariya - add_product_to_cart_programmatically 函数由您控制,因此您可以控制输入和使用的数据,例如设置边距值。
      【解决方案3】:

      我遇到了同样的问题,问题是有另一个插件可能对过滤器具有更高的优先级。这是一个基于角色的定价插件,停用它后,一切正常。所以只需检查是否没有其他东西覆盖该函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-23
        • 1970-01-01
        • 2019-12-21
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 2021-05-09
        • 1970-01-01
        相关资源
        最近更新 更多