首页 > 解决方案 > 无法将自定义购物车项目数据传递给 WC()->cart->add_to_cart() woocommerce 4.9

问题描述

我正在开发 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 版本,请帮我解决这个问题。提前致谢。

标签: woocommercewoocommerce-rest-api

解决方案


为了进行测试,我使用了钩子,并使用WC_Cart类的方法将woocommerce_add_to_cart_validation产品添加到购物车。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推荐的那样,您可以尝试增加操作的优先级,如我上面的示例所示。


推荐阅读