我一直在努力寻找WooCommerce的片段,我想添加到我孩子的主题功能中,但我已经达到了PHP知识的极限。
我设置了一个名为 pdt_volume
的自定义属性,我每次添加产品时都会填写该属性。如果购物车中已有的所有商品的此属性总和达到max_volume限制,我想删除Add_to_cart按钮。
例如, Max_volume
为100,我有4个 pdt_volume = 20
的产品,因此 {{1}应删除 add_to_cart
为25的产品的按钮,以便我无法将其添加到购物车中。
所以我想出了这个片段,在这里和那里找到了一些代码。 但是functions.php不会保存它,而且这些代码的其他变体已成功注册到functions.php中,但网站会出现500错误......
拜托,有人知道如何实现这个目标吗? 我做错了什么?
感谢。
编辑1:好吧,所以我让这段代码实际上由编辑器在 pdt_volume
中注册而没有破坏,但在网站上,我仍然得到内部服务器错误。就像某些东西不是计算或其他东西。
编辑2 (29/01/2017)
我使用了很久以前购买的ACF插件,但到目前为止还没有找到任何合适的用途。
这是我能够提出的工作代码。这不是代码杰作,我没有获得任何奖项,但它似乎工作到目前为止。至少,它允许我获得一个TRUE / FALSE语句,我可以在if条件中使用它来将add_to_cart按钮更改为Your_box_is_full按钮。
实际上,我并不需要任何 functions.php
或 global $woocommerce
!
$product
答案 0 :(得分:2)
正如Helgatheviking所说,你已经在钩子函数中使用 woocommerce_is_purchasable
钩子,$ product对象作为第二个参数。因此,您不需要,并且必须删除 global $woocommerce, $product;
才能使其正常运行而不会出错。
您的代码将是:
add_filter('woocommerce_is_purchasable', 'if_room_is_purchasable', 10, 2);
function if_room_is_purchasable ($is_purchasable, $product){
$cart_volume = 0;
$max_volume = 100;
foreach( WC()->cart->get_cart() as $cart_item ){
$item_id = $cart_item['product_id'];
$terms = get_the_terms( $item_id, 'pa_pdt_volume');
foreach($terms as $key => $term){
$cart_volume += $term->name; // May be better with $term->slug;
}
}
$candidate_volume = $cart_volume + $product->get_attribute( 'pa_pdt_volume' );
if ( $candidate_volume > $max_volume )
return false;
else
return true;
}
现在应该没有错误。