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

如何在WordPress首页按分类各显示5篇文章

解决WordPress按分类展示且每个分类仅显示5篇文章的问题

看起来你已经用自定义SQL实现了多分类文章展示,现在要给每个分类加上5篇的限制,这里有两种靠谱的方案供你选择:

方案一:修改你的自定义SQL查询

你当前的SQL没有对每个分类的文章数量做限制,我们可以通过MySQL的变量来实现每个分类取最新5篇的需求。修改后的SQL如下:

SELECT wp.*, wt.term_id
FROM (
    SELECT 
        wp.*, 
        wt.term_id,
        @current_term := wt.term_id,
        @count := IF(@current_term = @prev_term, @count + 1, 1) AS row_num,
        @prev_term := @current_term
    FROM wp_posts as wp 
    INNER JOIN wp_term_relationships as wtr ON wtr.object_id = wp.ID 
    INNER JOIN wp_terms as wt ON wtr.term_taxonomy_id = wt.term_id 
    WHERE wt.term_id IN (8,16,17) 
      AND wp.post_status = 'publish'  -- 建议加上,只取已发布文章
      AND wp.post_type = 'post'       -- 确保只取文章类型
    ORDER BY wt.term_id, wp.ID DESC 
) AS ranked
WHERE ranked.row_num <= 5
ORDER BY ranked.term_id, ranked.ID DESC

说明:

  • 子查询里通过@count变量给每个分类下的文章编号,同一分类下按ID倒序(最新在前)编号1到N
  • 外层查询只保留编号<=5的记录,实现每个分类最多5篇
  • 额外加上了post_status和post_type的条件,避免取出草稿、页面等非目标内容

把这段SQL替换你原来的$querystr内容即可。

方案二:改用WordPress原生WP_Query(更推荐)

直接用$wpdb写SQL虽然灵活,但WordPress的WP_Query已经封装了很多安全处理和缓存机制,用它来实现会更规范,也更易维护。你可以循环每个目标分类,单独查询该分类下的5篇文章:

// 定义要展示的分类ID数组
$target_terms = array(8, 16, 17);

foreach ($target_terms as $term_id) {
    // 获取分类信息(可选,用于显示分类标题)
    $term = get_term($term_id);
    echo '<h3>' . esc_html($term->name) . '</h3>';

    // 构建查询参数
    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => 5,  // 每个分类显示5篇
        'cat' => $term_id,      // 指定当前分类ID
        'orderby' => 'ID',
        'order' => 'DESC'
    );

    $query = new WP_Query($args);

    // 循环输出文章
    if ($query->have_posts()) {
        echo '<ul>';
        while ($query->have_posts()) {
            $query->the_post();
            echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
            // 这里可以添加更多文章内容,比如摘要、日期等
        }
        echo '</ul>';
        wp_reset_postdata(); // 重置查询,避免影响后续内容
    } else {
        echo '<p>该分类暂无文章</p>';
    }
}

说明:

  • 这种方法逻辑更清晰,每个分类单独处理,容易调试和修改
  • wp_reset_postdata()必须加上,防止后续的WordPress循环(比如侧边栏、页脚)出现问题
  • 可以轻松添加分类标题、自定义文章模板等内容,扩展性更强

两种方案都能实现你的需求,如果你习惯用自定义SQL就选方案一,要是想更贴合WordPress的开发规范,方案二更值得推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:52:03