You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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;
}

代码说明:

  1. woocommerce_get_catalog_ordering_args:给每种用户可选的排序规则,都加上「库存状态优先」的排序逻辑。
  2. custom_stock_orderby_sql:直接修改数据库查询的排序语句,用SQL判断把有货商品标记为0、缺货标记为1,强制0在前1在后。
  3. include_out_of_stock_products:移除WooCommerce默认的缺货商品过滤,保证缺货商品能被查询到并排在末尾。

测试验证:

  • 选「价格从低到高」:先显示所有有货商品按价格升序排列,再显示缺货商品按价格升序排列。
  • 选「人气排序」:先显示有货商品中人气高的在前,缺货商品按人气排序紧随其后。
  • 默认排序:有货商品按默认规则排列,缺货商品固定在列表最后。

内容的提问来源于stack exchange,提问作者MahmoodZamaniNemati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:43:12