为什么在任何形式的主页上使用时,分页总是中断?

时间:2012-12-27 作者:Andrew

为什么在主页上使用WP分页时会中断?

如果您使用下面的代码并将其用于页面模板中,它将非常有效(请确保您有3篇或更多帖子)。但是,只要您在主页上使用相同的代码。php,首页。php,索引。php,甚至作为页面模板,但设置为静态主页,它会中断。

URL显示/page/2/ 但你得到的是404页。如果将URL更改为/?page=2 它起作用了。

我在各地都看到了很多与此相关的问题,但没有一个解决方案有效。

为了简单起见,我简化了下面的循环,并使用默认的WP next和previous posts链接。我不想使用WP PageNavi或类似的插件。

<?php get_header(); ?>

    <?php

        // taken from https://codex.wordpress.org/Pagination
        if ( get_query_var(\'paged\') ) { 
            $paged = get_query_var(\'paged\'); 
        } 
        else if ( get_query_var(\'page\') ) {
            $paged = get_query_var(\'page\'); 
        } 
        else {
            $paged = 1;
        }

        $wp_query = new WP_Query( array( 
            \'posts_per_page\' => 2,
            \'paged\' => $paged
        ));

    ?>

    <?php if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>

         <?php the_title(); ?>

    <?php endwhile; endif; ?>

    <?php previous_posts_link(); ?>
    <?php next_posts_link(); ?>

    <?php wp_reset_query(); ?>

<?php get_footer(); ?>

2 个回复
最合适的回答,由SO网友:Milo 整理而成

解决方案是不更改模板中的主查询。默认查询发生在加载模板之前,因此在模板中进行查询会覆盖原始查询,这是对资源的浪费。参见codex中的示例pre_get_posts 以获取在不存在分页问题的情况下更改默认查询的正确方法。

SO网友:bosco

也来自codex.wordpress.com/Pagination (根据“Advanced Troubleshooting Steps“>”Removing query_posts from the main loop)关于通过pre_get_posts 米洛提到的行动:

[…] 将主页和类别页的查询添加回主题的功能中。php文件:

function my_post_queries( $query ) {
     // do not alter the query on wp-admin pages and only alter it if it\'s the main query
    if (!is_admin() && $query->is_main_query()){
        // alter the query for the home and category pages 

        if(is_home()){
           $query->set(\'posts_per_page\', 3);
        }

        if(is_category()){
            $query->set(\'posts_per_page\', 3);
        }
    }
}
add_action( \'pre_get_posts\', \'my_post_queries\' );
因此,您的实现可能看起来像

function modify_query( $query ) {
    if( !$query->is_main_query() )
        return;  //Only wish to modify the main query

    //Modify the query vars for the home and front pages
    if( is_home() || is_front_page() ) {
        $paged = get_query_var(\'page\');

        //If the \'page\' query var isn\'t set, or didn\'t return an integer, default to 1
        $paged = !isset( $paged ) || !is_int( $paged ) ? $paged : 1;

        $query->set( \'paged\', $paged );
        $query->set( \'posts_per_page\', 2 );
    }
}
add_action( \'pre_get_posts\', \'modify_query\' );        

结束