有条件地使WooCommerce产品不可购买

时间:2017-01-27 13:00:55

标签: php wordpress woocommerce cart product

我一直在努力寻找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

1 个答案:

答案 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;
  }

现在应该没有错误。