wordpress 获取Woocommerce中可变产品的“库存”产品变化计数

nafvub8i  于 2022-11-22  发布在  WordPress
关注(0)|答案(2)|浏览(249)

我正在尝试为functions.php文件制作一个代码片段,该代码片段只显示所选变体的一个价格,从而省略了在单个产品页面上显示的价格范围沿着变体价格。

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' );
  }
}

问题是,当你有两个单一产品的变体,其中一个缺货时,这个脚本会在单一产品页面上隐藏剩下的一个变体的价格。我想也许可以为每个产品提供一个可用变体的计数,并使用IF来显示它们,使用标准的单一产品模板。或者,也许你有更好的解决办法?

v8wbuo2f

v8wbuo2f1#

要在单个产品页面上获取可变产品的“库存”变化计数,您可以:
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
}

这两个代码都经过测试并正常工作。

a1o7rhls

a1o7rhls2#

这是我最终的工作代码,实现了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' );
    }   

}

相关问题