我想实现买3送1功能,所以我写了一个脚本,检测客户是否在购物车中有3个相同的商品,并自动将1个相同的商品添加到购物车。然后使用另一个钩子,我将产品的价格覆盖为0。
我用Google搜索了解决方案并使用了相同的方法:
以下是代码示例:
function setGiftPriceToZero($cart_object){
foreach($cart_object->cart_contents as $k=>$item):
if(isset($item['variation']['promo']) && ($item['variation']['promo']) == 'buy 3 free 1'):
$item['data']->price = 0;
endif;
endforeach;
}
add_action('woocommerce_before_calculate_totals', 'setGiftPriceToZero');
当Woocommerce计算购物车的小计时,它总是会添加应该是免费的产品的原始价格。例如,当我将3美元的商品添加到购物车时,购物车小计最终会以400美元而非300美元结束。
我深入研究了Woocommerce代码,发现在https://docs.woocommerce.com/wc-apidocs/source-class-WC_Cart.html#1139中,使用的$item['data']->get_price()
始终会返回该项目的原始价格。
无论如何使用hooks / apis而不是编辑Woocommerce核心文件来解决这个问题?
答案 0 :(得分:0)
我找到了这个错误的罪魁祸首。它是由另一个名为Woocommerce Role Based Price的插件的冲突引起的。此插件会在购物车总计算流程结束时覆盖购物车商品价格。这就是get_price()
函数始终返回项目的指定价格的原因。
现在我只需编辑插件文件,以便它与我的逻辑很好地配合。