【问题标题】:Get the count of "in stock" product variations for a variable product in Woocommerce获取 Woocommerce 中可变产品的“库存”产品变体计数
【发布时间】:2018-07-20 12:10:36
【问题描述】:

我正在尝试为 functions.php 文件创建一个 sn-p,该文件仅显示所选变体的一个价格,从而省略了在单个产品页面上与变体价格一起显示的价格范围。我正在使用以下代码:

    add_action( 'woocommerce_before_single_product', 'my_remove_variation_price' );
$product_variations=$product_variable->get_available_variations;
function my_remove_variation_price() {
  global $product;
  if ( $product->is_type( 'variable' ) {
    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price' );
  }
}

问题是,例如,当您有单个产品的两个变体并且一个缺货时,此脚本会在单个产品页面上隐藏一个剩余变体的价格。 我在想也许每个产品都有 COUNT 个可用的变体,并使用 IF 使用标准的单一产品模板来展示它们。或者您可能有更好的解决方法?

【问题讨论】:

  • 也许更好的解决方案是在最低价格变化之前添加“来自”.. 看看这里:iconicwp.com/blog/…
  • 我已经在商店页面上使用 From。在单个产品上,我不希望同时有多个价格(来自:$xx 和实际变化价格)。这正是 woo 显示变化价格的方式。我所做的是在所有列表页面上显示 From,当涉及到单个产品页面时,脚本测试产品是否可变并显示价格模板(单个或可变)。我还有一个脚本,可以同步库存量,从而使一些变体有库存或无库存。问题是当可变产品只有一个库存变化时,它不显示产品价格。

标签: php wordpress woocommerce stock variations


【解决方案1】:

要在单个产品页面上获取可变产品的“库存”变体计数,您可以:

1) 仅使用 php 和 Woocommerce WC_Product 方法:

global $product;
$count_in_stock = 0;

if ( $product->is_type( 'variable' ) ) {
    $variation_ids = $product->get_children(); // Get product variation IDs

    foreach( $variation_ids as $variation_id ){
        $variation = wc_get_product($variation_id);
        if( $variation->is_in_stock() )
            $count_in_stock++;
    }
}

// Your condition
if( $count_in_stock <= 1 ){
   // Do something
}

2) 使用少量 php 的 SQL 查询(快速和轻便):

global $wpdb, $product;
$product_id = $product->get_id();
$count_in_stock = 0;

if ( $product->is_type( 'variable' ) ) {
    $count = $wpdb->get_col("
        SELECT count(p.ID) as in_stock_count FROM {$wpdb->prefix}postmeta as pm
        INNER JOIN {$wpdb->prefix}posts as p ON pm.post_id = p.ID
        WHERE p.post_type LIKE 'product_variation' AND p.post_parent = $product_id
        AND pm.meta_key LIKE '_stock_status' AND pm.meta_value LIKE 'instock'
    ");

    $count_in_stock = reset($count);
}

// Your condition
if( $count_in_stock <= 1 ){
   // Do something
}      

两个代码都经过测试并且可以工作。

【讨论】:

  • 我可以通过functions.php以某种方式使用它吗?
  • 该行缺少括号 if ( $product->is_type( 'variable' ))
【解决方案2】:

这是我的最终工作代码,在 LoicTheAztec 答案的帮助下实现:

add_action( 'woocommerce_before_single_product', 'my_remove_variation_price' );
function my_remove_variation_price() {
    global $product;
    $count_in_stock = 0;

    if ( $product->is_type( 'variable' )) {

        $variation_ids = $product->get_children(); // Get product variation IDs

        foreach( $variation_ids as $variation_id ){
            $variation = wc_get_product($variation_id);
            if( $variation->is_in_stock() )
                $count_in_stock++;
        }   
    }

    if( $count_in_stock <= 1 ) 
    {
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price' );
    }   

}

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2019-03-08
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多