【问题标题】:Greying out out-of-stock product variations (WooCommerce)灰色缺货产品变体(WooCommerce)
【发布时间】:2015-04-26 15:15:14
【问题描述】:

[编辑:在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

我做错了什么?

【问题讨论】:

  • 你找到答案了吗?
  • 是的,请参阅下面 helgatheviking 的编辑。核心文件中的小编辑和functions.php中的添加。结果是属性选择列表中的禁用项目。甚至适用于变体组合。整洁的!我的意思是你仍然必须破解核心文件,而 WC 仍然因为不能做一些基本的事情而很糟糕,但至少它是一个功能性的快速修复。

标签: woocommerce product


【解决方案1】:

不要更改核心中的任何内容。

该错误告诉您,您正在尝试调用 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 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 显示为灰色,因为在后端这样做需要大量的核心模块。

【讨论】:

  • 感谢凯西,它现在可以工作了。但是我有不止一个属性,我意识到该解决方案不适用于我的情况......
  • @drake035 请尝试新代码。我认为该函数只需要修改以考虑当前传递给过滤器的变量。
  • 即使有多个属性,它实际上也能正常工作。太棒了,谢谢!
  • 当变体显示为选择下拉菜单时,这会破坏 iOS 上的 UI。因为“灰色”部分没有显示在原生 iOS 风车选择器中。理想情况下,它们会显示为灰色并在下拉菜单中旁边显示“不可用”字样。
【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2017-09-19
    • 2014-08-20
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多