如何在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
相关产品推荐
相关产品推荐

