如何让WooCommerce产品分类先展示In Stock商品再显示最后10个Out of stock商品?
WooCommerce分类页面库存商品优先展示+缺货商品数量限制实现方案
前提准备
已在WooCommerce后台取消勾选「缺货商品可见性」选项(路径:WooCommerce > 设置 > 产品 > 库存)。
实现代码
将以下代码添加到当前主题的functions.php文件,或通过自定义代码插件(如Code Snippets)导入:
function custom_woocommerce_product_query( $q ) { // 仅对产品分类页面的主查询生效 if ( ! is_product_category() || ! $q->is_main_query() ) { return; } // 设置排序规则:库存商品优先,同状态下按修改时间倒序 $q->set( 'meta_key', '_stock_status' ); $q->set( 'orderby', array( 'meta_value' => 'ASC', 'modified' => 'DESC' ) ); // 添加过滤规则限制缺货商品数量 add_filter( 'posts_where', 'custom_out_of_stock_limit' ); } add_action( 'woocommerce_product_query', 'custom_woocommerce_product_query' ); function custom_out_of_stock_limit( $where ) { global $wpdb; // 查询最新的10个缺货商品ID $out_of_stock_ids = $wpdb->get_col( " SELECT p.ID FROM {$wpdb->posts} p JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE pm.meta_key = '_stock_status' AND pm.meta_value = 'outofstock' ORDER BY p.modified DESC LIMIT 10 " ); if ( ! empty( $out_of_stock_ids ) ) { // 拼接条件:仅显示库存商品或前10个缺货商品 $where .= " AND ( {$wpdb->posts}.ID IN (" . implode( ',', $out_of_stock_ids ) . ") OR ( {$wpdb->postmeta}.meta_key = '_stock_status' AND {$wpdb->postmeta}.meta_value = 'instock' ) )"; } else { // 无缺货商品时仅显示库存商品 $where .= " AND {$wpdb->postmeta}.meta_key = '_stock_status' AND {$wpdb->postmeta}.meta_value = 'instock'"; } // 移除过滤,避免影响其他查询 remove_filter( 'posts_where', 'custom_out_of_stock_limit' ); return $where; }
代码说明
- 仅针对产品分类页面的主查询生效,不会干扰商店其他页面的展示逻辑。
- 排序规则:所有「In Stock」商品排在最前,同库存状态下按商品修改时间倒序排列,保证最新更新的商品优先展示。
- 缺货商品限制:通过数据库查询获取最新的10个缺货商品ID,仅将这部分商品追加到库存商品之后展示。
内容的提问来源于stack exchange,提问作者Matteor
相关产品推荐
相关产品推荐

