消除缺货产品变化(WooCommerce)

dra*_*035 1 product woocommerce

[编辑:它实际上在functions.php中添加代码并省略代码WC文件中的更改时有效.重要提示:它仅在存在ONE属性时有效.然而,当有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;
}
Run Code Online (Sandbox Code Playgroud)

要完成plugins/woocommerce/includes/class-wc-product-variation.php:

更改:

return apply_filters( 'woocommerce_variation_is_active', true, $this->variation_id, $this->id );
Run Code Online (Sandbox Code Playgroud)

至:

return apply_filters( 'woocommerce_variation_is_active', true, $this );
Run Code Online (Sandbox Code Playgroud)

也改变:

return apply_filters( 'woocommerce_variation_is_visible', $visible, $this->variation_id, $this->id );
Run Code Online (Sandbox Code Playgroud)

至:

return apply_filters( 'woocommerce_variation_is_visible', $visible, $this->variation_id, $this->id, $this );
Run Code Online (Sandbox Code Playgroud)

然而,虽然它据报道有效,但在我的情况下,缺货的变化显示与其他变量相同,我也有一个警告:

Warning: Missing argument 3 for grey_out_variations_when_out_of_stock() in ...\functions.php on line 600
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

hel*_*ing 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;
    }
Run Code Online (Sandbox Code Playgroud)

可以在变量产品类中找到.如果woocommerce_hide_out_of_stock_items在WooCommerce设置中设置了应自动处理此选项的选项.

UPDATE

我通读了你引用的github问题.由franticpsyx提交的提交后来被略微修改,因此franticpsyx发布的功能不起作用,因为他最初在那里发布它以及为什么你遇到变量数错误.在WooCommerce源中,woocommerce_variation_is_active现在只传递了2个变量.

public function variation_is_active() {
    return apply_filters( 'woocommerce_variation_is_active', true, $this );
}
Run Code Online (Sandbox Code Playgroud)

所以我们需要修改代码以使用传递的变量:

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;
}
Run Code Online (Sandbox Code Playgroud)

这对我有用.我很确定在前端项目是通过Javascript灰显的,因为在后端这样做需要很多mods来核心.