导语:最近叶子在研究woocommerce,遇到了一个问题,用woocommerce搭建一个贩卖虚拟商品的商城,因为每个虚拟商品的取货页面不一样,所以只能允许客户每次购买一件商品,如果允许客户一次购买多件商品会导致客户多花钱而拿不到货的情况。那么叶子的想法就是是先清空购物车然后在添加商品。
清空woocommerce购物车
国内的woocommerce的中文资料还是太少了,找了老半天也找不到,没有办法只能上它的英文官网看资料。
woocommerce 的hook 官方文档页面:https://docs.woocommerce.com/wc-apidocs/hook-docs.html。
woocommerce 的cart 官方文档页面:https://docs.woocommerce.com/wc-apidocs/source-class-WC_Cart.html#992。
在cart的官方文档中,叶子发现了一个函数empty_cart(),这个函数的作用就是清空购物车。那么现在就要找出放在哪个hook里。
大概花了三、四个小时,经过不断的试验,叶子终于发现了有效的hook:woocommerce_add_to_cart_handler。
再说一下思路:往购物车里添加商品时,先清空购物车,然后再添加需要添加的商品。是不是有点绕口,绕口就多读几遍,:)
添加商品的代码在这里也说一下,就是一个url: wordpressleaf.com/?add_to_cart=1314。add_to_cart是一个关键字,1314是要添加的商品ID。你可以在任何的url上带上add_to_cart=1314,这样的话ID为1314的商品就会添加到购物车。
如果你想搭建一个虚拟取货的网站可以去看这篇文章:如何使用WooCommerce搭建一个自动虚拟卡密发货网站。
实现代码
代码其实很简单:
function empty_cart_before_add_to_cart() { global $woocommerce; $woocommerce->cart->empty_cart(); } add_action( 'woocommerce_add_to_cart_handler', 'empty_cart_before_add_to_cart' );
或者这样的代码也是同样的效果:
function empty_cart_before_add_to_cart() { global $woocommerce; $cart = $woocommerce->cart; foreach ( $cart->get_cart() as $cart_item_key_cart => $cart_item ) { $id_product = $cart_item['product_id'];//这句没有用额,纯粹是叶子为了记录代码 $cart->remove_cart_item($cart_item_key_cart); } } add_action( 'woocommerce_add_to_cart_handler', 'empty_cart_before_add_to_cart' );
这样就是实现了先清空购物车,再添加商品。
其他与add_to_cart的有关hook
woocommerce_before_cart
这个hook的动作会在进入购物车之前执行。
woocommerce_add_to_cart
这个hook的动作会在商品添加完成之后执行。
woocommerce_add_to_cart_handler
这个hook的动作会在商品添加完成之前执行。那么,叶子的理想状态肯定是要在添加完成之前清空购物车。
woocommerce_after_cart
这个hook的动作会在离开购物车之后执行。
更多的hook大家可以上官网的文档里面去看,就是前面那个网址。
结束
叶子的这种情况,对于其他的使用woocommerce的朋友来说可能是罕见的,但既然花费了时间去解决,还是把经验分享出来,希望能帮助同样遇到这样问题的人。