Woocommerce Can';t将自定义购物车项目数据传递给WC()->;购物车->;将\添加到\购物车()4.9

Woocommerce Can';t将自定义购物车项目数据传递给WC()->;购物车->;将\添加到\购物车()4.9,woocommerce,woocommerce-rest-api,Woocommerce,Woocommerce Rest Api,我正在进行WooCommerceAPI插件开发,并尝试在AddtoCartAPI端点中使用以下代码传递自定义购物车项目数据 $cart_item_key = WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variations, array('margin' => 200)); 并且希望在计算总计之前使用woocommerce\u上的自定义购物车项目数据(请参见下面的代码),但无法在那里获取自定

我正在进行WooCommerceAPI插件开发,并尝试在AddtoCartAPI端点中使用以下代码传递自定义购物车项目数据

$cart_item_key = WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variations, array('margin' => 200));
并且希望在计算总计之前使用woocommerce\u上的自定义购物车项目数据(请参见下面的代码),但无法在那里获取自定义购物车项目数据($cart\u item['margin'))

我已经安装了WooCommerceec4.9版本,请帮我解决这个问题。
提前感谢。

为了做一个测试,我使用了
woocommerce\u add\u To\u cart\u验证
hook,并使用WC\u cart类的
add\u To\u 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 );
        }
    }
}

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

我也有类似的问题,问题是有另一个插件可能在过滤器上具有更高的优先级。这是一个基于角色的定价插件,停用后,一切正常。因此,只需检查是否没有其他内容覆盖该函数。

谢谢您的回答,但我想从插件代码中动态传递边距值。动态是什么意思?您想从每个产品的元值中获取边际值吗?我的意思是边际值不是一个静态值,它可以是任何值,我想通过add_to_API传递它。
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 );
        }
    }
}