[编辑:当在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
我做错了什么?
该错误告诉您,您正在尝试调用 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 来核心。
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;
}
我的解决方案是通过将 $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;
}
}