获取 Woocommerce 中可变产品的 "in stock" 产品变体计数
Get the count of "in stock" product variations for a variable product in Woocommerce
我正在尝试为 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' );
}
}
问题是,例如,当您有两种单一产品变体并且一种变体缺货时,此脚本会隐藏单一产品页面上剩余一种变体的价格。
我在想也许每个产品都有 COUNT 个可用变体,并使用 IF 使用标准单一产品模板来显示它们。或者您可能有更好的解决办法?
要获取单个产品页面上可变产品的 "in stock" 变体计数,您可以:
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) 使用 SQL 查询和少量 php(快速和轻便):
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
}
两个代码都经过测试并且有效。
这是我的最终工作代码,在 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' );
}
}
我正在尝试为 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' );
}
}
问题是,例如,当您有两种单一产品变体并且一种变体缺货时,此脚本会隐藏单一产品页面上剩余一种变体的价格。 我在想也许每个产品都有 COUNT 个可用变体,并使用 IF 使用标准单一产品模板来显示它们。或者您可能有更好的解决办法?
要获取单个产品页面上可变产品的 "in stock" 变体计数,您可以:
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) 使用 SQL 查询和少量 php(快速和轻便):
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
}
两个代码都经过测试并且有效。
这是我的最终工作代码,在 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' );
}
}