如何将WooCommerce中缺货商品移至商品归档列表末尾
WooCommerce 分类页缺货商品后置解决方案
要解决用户自定义排序(价格、人气等)时缺货商品混杂的问题,核心是把库存状态设为第一排序优先级,用户选择的排序规则作为第二优先级——不管用户选哪种排序,都先按库存状态把有货商品前置,再按所选规则排序。
直接用下面的代码替换你之前的实现,放到主题的functions.php文件或者自定义插件中:
add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_catalog_ordering_args' ); function custom_catalog_ordering_args( $args ) { // 获取用户当前选择的排序方式 $orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) ); // 处理排序规则,将库存状态作为第一排序条件 switch( $orderby_value ) { case 'price': $args['orderby'] = array( 'stock_status' => 'ASC', 'price' => 'ASC' ); break; case 'price-desc': $args['orderby'] = array( 'stock_status' => 'ASC', 'price' => 'DESC' ); break; case 'popularity': $args['orderby'] = array( 'stock_status' => 'ASC', 'meta_value_num' => 'DESC' ); $args['meta_key'] = '_popularity'; break; case 'rating': $args['orderby'] = array( 'stock_status' => 'ASC', 'meta_value_num' => 'DESC' ); $args['meta_key'] = '_wc_average_rating'; break; case 'date': $args['orderby'] = array( 'stock_status' => 'ASC', 'date' => 'DESC' ); break; case 'menu_order': default: $args['orderby'] = array( 'stock_status' => 'ASC', 'menu_order' => 'ASC', 'title' => 'ASC' ); break; } return $args; } // 新增库存状态的排序映射 add_filter( 'woocommerce_get_post_statuses', 'add_stock_status_ordering' ); function add_stock_status_ordering( $statuses ) { $statuses['stock_status'] = 'Stock Status'; return $statuses; } // 直接修改SQL排序逻辑,确保库存优先级生效 add_filter( 'posts_orderby', 'custom_stock_orderby_sql', 10, 2 ); function custom_stock_orderby_sql( $orderby, $query ) { global $wpdb; // 仅在商品列表页生效 if ( ! is_shop() && ! is_product_category() && ! is_product_tag() ) { return $orderby; } // 替换排序规则中的stock_status为实际的库存状态判断SQL $orderby = str_replace( 'stock_status ASC', "CASE WHEN {$wpdb->postmeta}.meta_key = '_stock_status' AND {$wpdb->postmeta}.meta_value = 'instock' THEN 0 ELSE 1 END ASC", $orderby ); return $orderby; } // 确保缺货商品被包含在查询结果中 add_filter( 'woocommerce_product_query_meta_query', 'include_out_of_stock_products' ); function include_out_of_stock_products( $meta_query ) { foreach( $meta_query as $key => $query ) { if( isset( $query['key'] ) && $query['key'] === '_stock_status' ) { unset( $meta_query[$key] ); } } return $meta_query; }
代码说明:
woocommerce_get_catalog_ordering_args:给每种用户可选的排序规则,都加上「库存状态优先」的排序逻辑。custom_stock_orderby_sql:直接修改数据库查询的排序语句,用SQL判断把有货商品标记为0、缺货标记为1,强制0在前1在后。include_out_of_stock_products:移除WooCommerce默认的缺货商品过滤,保证缺货商品能被查询到并排在末尾。
测试验证:
- 选「价格从低到高」:先显示所有有货商品按价格升序排列,再显示缺货商品按价格升序排列。
- 选「人气排序」:先显示有货商品中人气高的在前,缺货商品按人气排序紧随其后。
- 默认排序:有货商品按默认规则排列,缺货商品固定在列表最后。
内容的提问来源于stack exchange,提问作者MahmoodZamaniNemati
相关产品推荐
相关产品推荐

