隐藏 WooCommerce 产品页面下拉列表中的变体

hide variations from WooCommerce product page dropdown

提问人:Rip 提问时间:7/18/2023 更新时间:7/21/2023 访问量:64

问:

如何从可变产品的 WooCommerce 产品页面下拉列表中隐藏特定变体?

我的目标是只使股票> 0 可见的最低价格变化。

我试过:

  $variations[$h]->set_catalog_visibility('hidden');
  $variations[$h]->variation_is_visible(0);
  $variations[$h]->update_meta_data( 'variation_is_visible', 0 );

当我插入:

print_r($available_variations); 

在变量.php文件中,每个变体的 variation_is_visible 属性为 1:

[variation_is_visible] => 1

我无法找到有关设置 variation_is_visible 属性的任何文档。

谢谢!

PHP 的WordPress WooCommerce

评论

0赞 LoicTheAztec 7/18/2023
尝试在代码末尾使用:$variations[$h]->save();
0赞 Rip 7/21/2023
我能够使用woocommerce_variation_is_visible过滤器钩子和woocommerce_variation_set_stock操作钩子以及自定义元数据键来隐藏除最低价格库存变体之外的所有产品。如果有更好的解决方案,我愿意接受建议。谢谢!

答:

0赞 Rip 7/21/2023 #1

woocommerce_variation_is_visible过滤器钩子和woocommerce_variation_set_stock动作钩子的组合正在从产品页面中隐藏除最低价格变化之外的所有价格变化:

add_filter( 'woocommerce_variation_is_visible', 'rip_out_of_stock_variations_not_visible', 10, 4 );

add_action( 'woocommerce_variation_set_stock', 'rip_variation_shared_stock' );

function rip_variations_low_price_visible($product){
    $variations = $product->get_available_variations('objects');

    usort($variations, function($a, $b)
    {
        return ($a->get_price() < $b->get_price()) ? -1 : 1;
    });

    $hlen = count($variations);
 
    $ind = 0;

    for ($h=0; $h<$hlen; $h++) {
    if ($ind == 0 && $variations[$h]->get_stock_quantity()>0) {
        $ind = 1;
        $variations[$h]->update_meta_data( 'hide_variation', 0 );
        $variations[$h]->save();
    }
    else {
        $variations[$h]->update_meta_data( 'hide_variation', 1 );
        $variations[$h]->save();
    }
    }
}

function rip_out_of_stock_variations_not_visible( $is_visible, $variation_id, $parent_id, $variation ) {
    return $variation->get_meta('hide_variation') == 1 ? false : true;
}


function rip_variation_shared_stock( $updated_variation ) {
    $product = wc_get_product( $updated_variation->get_parent_id() );
    rip_variations_low_price_visible($product);
}