消除缺货产品变化(WooCommerce)

时间:2015-04-26 15:15:14

标签: woocommerce product

[编辑:它实际上在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

我做错了什么?

2 个答案:

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