[编辑:它实际上在functions.php中添加代码并省略代码WC文件中的更改时有效。重要提示:它仅在存在ONE属性时有效。然而,当有2个属性(例如尺寸和颜色)时,它不起作用,因为它不再是关于缺货变化而是关于变化组合,事实上WooCommerce完全无能为力常见情况。请注意,目前似乎没有可用的插件来解决这个非常明显的问题。大。]
自从2.0以来,WooCommerce要么隐藏缺货产品的变化(这是一个明显的问题,因为客户无法知道它们的存在),或者将它们显示为库存变化(也是一个问题,因为客户随后系统地失望点击购买后发现变化缺货。
This thread包含一个解决缺货产品差异的解决方案:
大概要添加到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
我做错了什么?
答案 0 :(得分:6)
不要改变核心内容。
该错误告诉您正在尝试将3个变量作为函数的参数调用,但操作挂钩仅传递2,因此缺少第3个变量。这是因为您修改了核心以删除第三个参数。
另请注意
// 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;
}
可以在变量product类中找到。如果在WooCommerce设置中设置woocommerce_hide_out_of_stock_items
选项,则应自动处理此选项。
更新
我阅读了您引用的github问题。由franticpsyx提交的提交后来被略微修改,因此franticpsyx posted 的功能不像他最初在那里发布那样,以及为什么你遇到变量数错误。在WooCommerce源中,woocommerce_variation_is_active
现在只传递了2个变量。
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来核心。
答案 1 :(得分:1)
只是添加了我的答案,因为我花了很长时间才找到它,但这些都不适合我。无论$ 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;
}
}