如何让WooCommerce首页默认优先显示可购买商品?现有代码仅分类页生效
解决方案
代码修改方案(推荐)
你原代码的问题是仅针对WooCommerce内置的商店/分类/标签页生效,而首页小部件的产品查询不属于这些页面类型,所以需要调整判断逻辑,让所有前台产品查询都应用库存排序。
替换你现有的代码为以下版本:
class iWC_Orderby_Stock_Status { public function __construct() { if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) { add_filter('posts_clauses', array($this, 'order_by_stock_status'), 2000); } } public function order_by_stock_status($posts_clauses) { global $wpdb, $wp_query; // 仅对前台的产品查询生效(覆盖首页小部件、商店/分类/标签页) if ( ! is_admin() && $wp_query->get('post_type') === 'product' ) { $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) "; $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby']; $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where']; } return $posts_clauses; } } new iWC_Orderby_Stock_Status;
修改说明:
- 移除了原有的页面类型限制,改为检查当前查询的内容类型是产品且处于前台(避免影响后台操作)
- 这样不管是首页小部件的产品列表,还是WooCommerce内置页面,都会自动按「可购买(instock)在前,不可购买(outofstock)在后」的规则排序
- 如果只想让首页和原有页面生效,可把判断条件改成:
if ( ! is_admin() && $wp_query->get('post_type') === 'product' && (is_front_page() || is_shop() || is_product_category() || is_product_tag()) )
插件方案
如果不想修改代码,可选择支持默认按库存状态排序的WooCommerce插件:
- 搜索「WooCommerce Default Sort Order by Stock Status」这类插件,安装后启用即可实现默认排序需求,无需额外设置可视化筛选功能
- 注意选择更新维护活跃、与你的WooCommerce版本及Orchid Store主题兼容的插件
内容的提问来源于stack exchange,提问作者ProgerMir
相关产品推荐
相关产品推荐

