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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:53:42