在WordPress中,根据不同页面类型(首页、分类页、标签页、自定义文章类型归档页等)设置不同的文章显示数量是常见的需求。以下是几种实现方案:

一、使用pre_get_posts钩子(推荐)

在主题的functions.php文件中添加:

function custom_posts_per_page($query) {
    // 确保只影响前端主查询
    if (!is_admin() && $query->is_main_query()) {
        
        // 首页设置
        if (is_home() || is_front_page()) {
            $query->set('posts_per_page', 5); // 首页显示5篇文章
        }
        
        // 分类页设置
        elseif (is_category()) {
            $query->set('posts_per_page', 8); // 分类页显示8篇
        }
        
        // 标签页设置
        elseif (is_tag()) {
            $query->set('posts_per_page', 10); // 标签页显示10篇
        }
        
        // 自定义文章类型归档页
        elseif (is_post_type_archive('product')) {
            $query->set('posts_per_page', 12); // 产品归档页显示12篇
        }
        
        // 搜索页设置
        elseif (is_search()) {
            $query->set('posts_per_page', 6); // 搜索结果每页6篇
        }
        
        // 作者页设置
        elseif (is_author()) {
            $query->set('posts_per_page', 7); // 作者页显示7篇
        }
    }
}
add_action('pre_get_posts', 'custom_posts_per_page');

二、按分类/标签自定义数量

如果需要更精细地控制特定分类或标签的文章数量:

function custom_posts_per_page_by_tax($query) {
    if (!is_admin() && $query->is_main_query()) {
        // 特定分类
        if (is_category('news')) {
            $query->set('posts_per_page', 6);
        }
        // 特定标签
        elseif (is_tag('featured')) {
            $query->set('posts_per_page', 4);
        }
        // 特定分类ID
        elseif (is_category(array(5, 6, 7))) {
            $query->set('posts_per_page', 9);
        }
    }
}
add_action('pre_get_posts', 'custom_posts_per_page_by_tax');

三、使用自定义字段覆盖设置

允许通过文章/页面的自定义字段覆盖默认设置:

  1. 首先在functions.php中添加:

function custom_posts_per_page_override($query) {
    if (!is_admin() && $query->is_main_query() && is_page()) {
        $posts_per_page = get_post_meta(get_queried_object_id(), 'posts_per_page', true);
        if (!empty($posts_per_page) && is_numeric($posts_per_page)) {
            $query->set('posts_per_page', intval($posts_per_page));
        }
    }
}
add_action('pre_get_posts', 'custom_posts_per_page_override');
  1. 然后在页面编辑界面添加名为posts_per_page的自定义字段,值为想要显示的文章数量。

四、结合分页的设置

确保分页正常工作,修改主查询时保留分页参数:

function custom_posts_per_page_with_pagination($query) {
    if (!is_admin() && $query->is_main_query()) {
        if (is_post_type_archive('portfolio')) {
            // 获取URL中的分页参数
            $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
            $query->set('posts_per_page', 9);
            $query->set('paged', $paged);
        }
    }
}
add_action('pre_get_posts', 'custom_posts_per_page_with_pagination');

五、使用插件实现

如果不想修改代码,可以使用以下插件:

  1. Custom Post Limits - 简单易用的界面设置不同页面类型的文章数量

  2. WP Show Posts - 可视化设置不同文章列表的显示数量

  3. Query Wrangler - 高级查询控制插件

六、模板文件直接修改

在某些特殊情况下,可以直接在模板文件中修改查询:

<?php
// archive-product.php 示例
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
    'post_type'      => 'product',
    'posts_per_page' => 15, // 每页15个产品
    'paged'          => $paged
);
$products = new WP_Query($args);

if ($products->have_posts()) :
    while ($products->have_posts()) : $products->the_post();
        // 显示产品内容
    endwhile;
    
    // 分页导航
    the_posts_pagination(array(
        'prev_text' => __('上一页'),
        'next_text' => __('下一页'),
        'mid_size'  => 2
    ));
    
    wp_reset_postdata();
endif;
?>

七、性能优化建议

  1. 避免使用posts_per_page => -1(显示所有文章),这会导致性能问题

  2. 对于大型网站,考虑使用缓存插件缓存查询结果

  3. 使用'fields' => 'ids'参数只获取文章ID,当只需要ID时可以提高性能

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 5,
    'fields'         => 'ids' // 只获取ID
);

八、完整示例:结合多种条件

 
function ultimate_custom_posts_per_page($query) {
    if (!is_admin() && $query->is_main_query()) {
        // 默认设置
        $posts_per_page = get_option('posts_per_page'); // 读取后台设置
        
        // 首页设置
        if (is_home()) {
            $posts_per_page = 6;
        }
        // 特定分类
        elseif (is_category('news')) {
            $posts_per_page = 8;
        }
        // 搜索页
        elseif (is_search()) {
            $posts_per_page = 10;
        }
        // 自定义文章类型
        elseif (is_post_type_archive('event')) {
            $posts_per_page = 12;
        }
        // 特定页面模板
        elseif (is_page_template('template-portfolio.php')) {
            $posts_per_page = 9;
        }
        
        // 应用设置
        $query->set('posts_per_page', $posts_per_page);
        
        // 分页处理
        if ($query->is_paged) {
            $page = $query->query_vars['paged'];
            $query->set('offset', ($page - 1) * $posts_per_page);
        }
    }
}
add_action('pre_get_posts', 'ultimate_custom_posts_per_page');

通过以上方法,你可以灵活地为WordPress网站的不同页面类型设置不同的文章显示数量,从而优化用户体验和网站性能。