将缺货产品变体变灰(WooCommerce)

问题描述 投票:0回答:3

[编辑:当在functions.php中添加代码并省略代码WC文件中的更改时,它实际上是有效的。重要提示:它仅在存在一个属性时才有效。然而,当有 2 个属性(例如尺寸和颜色)时,它就不起作用,因为它不再与缺货变化有关,而是与变化组合有关,而且实际上 WooCommerce 在这种常见情况下完全无能为力。请注意,目前似乎也没有可用的插件来解决这个非常明显的问题。太棒了。]

自 2.0 起,WooCommerce 要么隐藏缺货产品变体(这是一个明显的问题,因为客户无法知道它们的存在),要么将它们显示为有库存变体(这也是一个问题,因为客户会系统性地失望地发现它们) 点击购买后,该版本已缺货)。

此线程包括将缺货产品变体变灰的解决方案:

大概要添加到

functions.php

add_filter( 'woocommerce_variation_is_active', 'grey_out_variations_when_out_of_stock', 10, 3 ); function grey_out_variations_when_out_of_stock( $grey_out, $variation_id, $id ) { $variation = get_product( $variation_id ); if ( ! $variation->is_in_stock() ) return false; return true; }

将于

plugins/woocommerce/includes/class-wc-product-variation.php

完成:

改变:

return apply_filters( 'woocommerce_variation_is_active', true, $this->variation_id, $this->id );

至:

return apply_filters( 'woocommerce_variation_is_active', true, $this );

同时更改:

return apply_filters( 'woocommerce_variation_is_visible', $visible, $this->variation_id, $this->id );

至:

return apply_filters( 'woocommerce_variation_is_visible', $visible, $this->variation_id, $this->id, $this );

尽管据报道它有效,但在我的情况下,缺货的变化显示与其他变化相同,并且我也有一个警告:

Warning: Missing argument 3 for grey_out_variations_when_out_of_stock() in ...\functions.php on line 600

我做错了什么?

woocommerce product
3个回答
6
投票
不要改变核心的任何内容。

该错误告诉您,您正在尝试调用 3 个变量作为函数的参数,但操作挂钩仅传递 2 个变量,因此缺少第三个变量。这是因为您已修改核心以删除第三个参数。

另请注意

// Hide out of stock variations if 'Hide out of stock items from the catalog' is checked if ( empty( $variation->variation_id ) || ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && ! $variation->is_in_stock() ) ) { continue; }

可以在可变产品类别中找到。如果在 WooCommerce 设置中设置了

woocommerce_hide_out_of_stock_items

 选项,则应自动处理此问题。 

更新

我仔细阅读了您引用的 github 问题。 franticpsyx 所做的提交已被稍微修改,因此

franticpsyx 发布的函数 无法像他最初发布的那样工作,以及为什么您会遇到变量数字错误。在 WooCommerce 源代码中,现在只有 2 个变量传递给 woocommerce_variation_is_active



public function variation_is_active() { return apply_filters( 'woocommerce_variation_is_active', true, $this ); }

因此我们需要修改代码以使用正在传递的变量:

add_filter( 'woocommerce_variation_is_active', 'grey_out_variations_when_out_of_stock', 10, 2 ); function grey_out_variations_when_out_of_stock( $grey_out, $variation ) { if ( ! $variation->is_in_stock() ) return false; return true; }

这对我有用。我很确定在前端,这些项目通过 Javascript 变灰,因为在后端这样做需要大量的 mods 来核心。


5
投票
就像其他人回答的那样,您可以通过使用

woocommerce_variation_is_active

 过滤器来实现这一点。然而;如果您有 
超过 30 个变体,这将不起作用!因为有 30 多个变体,Woocommerce 使用 AJAX 来填充下拉列表,而不是在服务器端渲染它。这将跳过过滤器。您可以在此页面上阅读更多相关信息:https://iconicwp.com/blog/modify-ajax-variation-threshold/

您可以通过增加 AJAX 阈值来“修复”此问题:

add_filter('woocommerce_ajax_variation_threshold', 'change_wc_ajax_variation_threshold'); function change_wc_ajax_variation_threshold() { return 50; }
所以结合其他人的答案来使用:

add_filter('woocommerce_variation_is_active', 'deactivate_variations_when_out_of_stock', 10, 2); function deactivate_variations_when_out_of_stock($active, $variation) { if (!$variation->managing_stock()) { return true; } if (!$variation->is_in_stock()) { return false; } return true; }
    

2
投票
只是添加我的答案,因为我寻找了很长时间,但这些都不适合我。无论什么 $variation->is_in_stock() 总是返回 true。

我的解决方案是通过将 $variation->is_in_stock() 更改为 $variation->get_stock_quantity() 来修改函数。

$variation->get_stock_quantity() 实际上返回一个可以使用的数字,即剩余库存。因此,根据您喜欢的参数重写函数,假设当还剩 5 个时,您希望将其标记为缺货(如果您希望 0 个缺货,则为 0),函数将如下所示:

add_filter( 'woocommerce_variation_is_active', 'my_jazzy_function', 10, 2 ); function my_jazzy_function( $active, $variation ) { $var_stock_count = $variation->get_stock_quantity(); // if there are 5 or less, disable the variant, could always just set to 0. if( $var_stock_count <= 6 ) { return false; } else { return true; } }
    
© www.soinside.com 2019 - 2024. All rights reserved.