woocommerce - 无法将自定义购物车项目数据传递给 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 版本,请帮我解决这个问题。提前致谢。
解决方案
为了进行测试,我使用了钩子,并使用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推荐的那样,您可以尝试增加操作的优先级,如我上面的示例所示。
推荐阅读
- docker - bash:apt-get:找不到命令(在 ubuntu docker 映像上)
- python - 批量重命名文本文件名
- python - 匹配单词“A”。如果“B”是下一个单词,也匹配
- android - Glide 不使用缓存图像
- r - 如何按组查找唯一的因子名称
- angular - angular - 将元素绑定到现有组件
- php - 来自一页的两次重定向
- mysql - 与特定日期时间相关的 AmbiguousTimeError (2020-11-01)
- android - android生命周期程序仅在调试中工作,而不在发布中工作
- powerbi - 如果当前列值存在于另一个表中,则获取 1/0