
WooCommerce提供了一个内置选项,允许商店管理员“从目录中隐藏缺货商品”。然而,这个设置通常只针对商品本身(对于简单商品)或单个变体(对于可变商品)。这意味着,如果一个可变商品有多个变体,即使其中大部分变体都缺货,只要有一个变体有库存,该商品仍会显示在目录中,但用户只能看到有库存的变体选项。这可能导致商品页面看起来不完整,或者用户体验不佳,因为他们无法选择所有预期的尺寸或颜色。
本教程旨在解决以下具体需求:
通过这种方式,我们可以确保客户在浏览目录时只看到真正有库存且可购买的完整商品,从而提升购物体验。
为了实现上述功能,我们需要修改WooCommerce查询商品列表时的行为。woocommerce_product_query 是一个强大的动作钩子,它允许我们在WooCommerce查询商品之前,对查询参数进行修改。我们将利用这个钩子,在商品查询执行之前,识别出那些需要隐藏的商品(即所有变体都缺货的可变商品,或缺货的简单商品),然后将它们的ID添加到查询的排除列表中。
核心思路如下:
将以下代码添加到您当前活动主题的 functions.php 文件中,或者如果您正在使用自定义插件,则添加到该插件的主文件中。
<?php
/**
* 根据所有变体或简单商品的库存状态隐藏商品
*
* 当可变商品的所有变体都缺货时,或者简单商品缺货时,将其从WooCommerce目录中隐藏。
*
* @param WP_Query $q 当前的WP_Query对象。
*/
function hide_product_if_all_variation_and_simple_product_is_outofstock( $q ) {
global $wpdb; // 引入WordPress数据库对象
// 用于存储需要隐藏的商品ID的数组
$array_of_product_id = array();
/**
* 处理可变商品
*/
// 获取所有可变商品的ID
$variable_products_ids = wc_get_products( array(
'limit' => -1, // 获取所有商品
'status' => 'publish', // 只获取已发布的商品
'type' => 'variable', // 只获取可变商品
'return' => 'ids', // 只返回商品ID
));
// 遍历每个可变商品
foreach( $variable_products_ids as $variable_id ) {
// 查询该可变商品下是否有任何一个“有库存”的变体
// 这里的逻辑是:如果count > 0,则表示至少有一个变体有库存
// 如果count = 0,则表示所有变体都缺货
$count = $wpdb->get_var( $wpdb->prepare( "
SELECT COUNT(ID)
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm
ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation' // 查找商品变体
AND p.post_status = 'publish' // 变体必须是已发布的
AND p.post_parent = %d // 属于当前可变商品
AND pm.meta_key = '_stock_status' // 查询库存状态元数据
AND pm.meta_value != 'outofstock' // 查找非“缺货”状态的变体
", $variable_id ) );
// 将查询结果转换为布尔值,方便判断
$has_in_stock_variation = $count > 0 ? true : false;
// 如果没有一个变体有库存(即所有变体都缺货),则将父商品ID加入到隐藏列表中
if( !$has_in_stock_variation ){
$array_of_product_id[] = $variable_id;
}
}
/**
* 处理简单商品
*/
// 获取所有简单商品的ID
$simple_products_ids = wc_get_products( array(
'limit' => -1, // 获取所有商品
'status' => 'publish', // 只获取已发布的商品
'type' => 'simple', // 只获取简单商品
'return' => 'ids', // 只返回商品ID
));
// 遍历每个简单商品
foreach( $simple_products_ids as $simple_id ) {
// 查询该简单商品自身是否“有库存”
$count = $wpdb->get_var( $wpdb->prepare( "
SELECT COUNT(ID)
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm
ON p.ID = pm.post_id
WHERE p.post_type = 'product' // 查找商品(而非变体)
AND p.post_status = 'publish' // 商品必须是已发布的
AND p.ID = %d // 针对当前简单商品
AND pm.meta_key = '_stock_status' // 查询库存状态元数据
AND pm.meta_value != 'outofstock' // 查找非“缺货”状态的商品
", $simple_id ) );
// 将查询结果转换为布尔值
$is_in_stock = $count > 0 ? true : false;
// 如果简单商品缺货,则将其ID加入到隐藏列表中
if( !$is_in_stock ){
$array_of_product_id[] = $simple_id;
}
}
// 如果有需要隐藏的商品ID,则将其添加到查询的排除列表中
if( !empty( $array_of_product_id ) ){
$q->set( 'post__not_in', $array_of_product_id );
}
}
// 将自定义函数挂载到 'woocommerce_product_query' 动作钩子上
add_action( 'woocommerce_product_query', 'hide_product_if_all_variation_and_simple_product_is_outofstock' );通过上述自定义代码,您可以实现WooCommerce商品目录的更智能管理,确保只有真正有库存(或至少有一个变体有库存)的商品才会被展示给客户。这不仅提升了用户体验,也使得商店目录更加整洁和专业。记住,理解并正确应用WordPress和WooCommerce的钩子和过滤器是进行高级定制的关键。
以上就是WooCommerce高级库存管理:当所有变体或简单商品缺货时自动隐藏商品的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号