如何在WordPress静态站点的WooCommerce产品小部件中隐藏促销商品?
解决WooCommerce分类页面及产品小部件隐藏促销商品的问题
原代码失效原因
- 仅针对商店主页面(
is_shop()),未覆盖品牌分类页面和产品小部件的查询场景 - 通过
_sale_price为空判断非促销商品的逻辑不严谨,WooCommerce中促销商品的判定还涉及促销日期(_sale_price_dates_from/_sale_price_dates_to)等字段,部分促销商品可能_sale_price非空但当前未处于促销期,反之亦然
修正方案
1. 为常规品牌分类页面隐藏所有促销商品
以下代码会在品牌分类页面和产品小部件中排除所有当前处于促销状态的商品:
add_filter( 'woocommerce_product_query_meta_query', 'exclude_sale_products_from_regular_brand_pages', 10, 2 ); function exclude_sale_products_from_regular_brand_pages( $meta_query, $query ) { // 检查是否是品牌分类页面(替换为你的品牌分类法slug,比如'brand'),且不是促销分类页面 $is_regular_brand_page = is_tax( 'brand' ) && ! has_term( 'sale', 'brand' ); // 覆盖产品小部件的查询 $is_product_widget = is_a( $query->get( 'widget_id' ), 'string' ); if ( $is_regular_brand_page || $is_product_widget ) { $meta_query[] = array( 'relation' => 'OR', // 无促销价 array( 'key' => '_sale_price', 'value' => '', 'compare' => '=', ), // 有促销价但当前不在促销日期范围内 array( 'relation' => 'AND', array( 'key' => '_sale_price_dates_from', 'value' => current_time( 'timestamp' ), 'compare' => '>', ), array( 'key' => '_sale_price_dates_to', 'value' => current_time( 'timestamp' ), 'compare' => '<', ), ), // 有促销价但未设置日期(已过期或未生效) array( 'key' => '_sale_price_dates_from', 'value' => '', 'compare' => '=', ), ); } return $meta_query; }
2. 为促销品牌分类页面仅显示促销商品
如果需要单独的促销分类页面只展示促销商品,添加以下代码:
add_filter( 'woocommerce_product_query_meta_query', 'only_show_sale_products_on_sale_brand_pages', 10, 2 ); function only_show_sale_products_on_sale_brand_pages( $meta_query, $query ) { // 检查是否是促销品牌分类页面(替换为你的促销分类slug,比如'sale') if ( is_tax( 'brand', 'sale' ) ) { $meta_query[] = array( 'relation' => 'AND', // 存在有效促销价 array( 'key' => '_sale_price', 'value' => '', 'compare' => '!=', ), // 当前处于促销期或为永久促销 array( 'relation' => 'OR', array( 'relation' => 'AND', array( 'key' => '_sale_price_dates_from', 'value' => current_time( 'timestamp' ), 'compare' => '<=', ), array( 'key' => '_sale_price_dates_to', 'value' => current_time( 'timestamp' ), 'compare' => '>=', ), ), // 未设置促销日期(永久促销) array( 'key' => '_sale_price_dates_from', 'value' => '', 'compare' => '=', ), ), ); } return $meta_query; }
注意事项
- 替换代码中的
brand为你实际使用的品牌分类法slug,sale为促销分类的slug - 如果产品小部件有特定ID,可修改
$is_product_widget的判断条件,比如strpos( $query->get( 'widget_id' ), 'woocommerce_product' ) !== false - 将代码添加到主题的
functions.php文件或自定义插件中
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

