当将分页与Front-page.php一起使用时,分页导致错误404

时间:2016-02-13 作者:Greeso

我正在创建front-page.php. 此页面将显示最新的特色帖子,还将具有分页选项以转到以前的特色帖子。

我为frontpage编写了如下代码

$args = array();
$args[\'post_type\'] = \'post\';
$args[\'post_status\'] = \'publish\';
$args[\'category_name\'] = \'featured\';
$args[\'posts_per_page\'] = 4
$args[\'paged\'] = (get_query_var(\'page\')) ? get_query_var(\'page\') : 1;

$the_query = new WP_Query($args);

if ($the_query->have_posts()) {

    while ($the_query->have_posts()) {

        $the_query->the_post() ;
        the_title();

    } // End of: while ($the_query->have_posts())

    next_posts_link(\'Next\', $the_query->max_num_pages );
    previous_posts_link(\'Previous\');

} // End of: if ($the_query->have_posts())
因此,当我转到网站的首页(例如mysite.dev, 页面显示正确。

现在,当我点击Next 链接,url变为mysite.dev/page/2 然而404 返回第页,而不是第二页front-page.php

我花了大约5到6个小时。读了几乎一篇关于这个问题的文章,但仍然不知所措。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

根据您的评论进行编辑,front-page.php 仅当页面设置为静态首页时使用。普通主页,即当首页显示设置为您的最新帖子时,index.php 已使用。

所有存档页和首页使用paged 而不是page, 所以你需要设置get_query_var( \'page\' )get_query_var( \'paged\' ).

无论如何,您不应该在主页上使用自定义查询,您应该使用pre_get_posts 根据需要更改主查询

add_action( \'pre_get_posts\', function ( $q )
{
    if (    $q->is_home()
         && $q->is_main_query()
    ) {
        $q->set( \'category_name\',  \'featured\' );
        $q->set( \'posts_per_page\', 4          );
    }
});
您的分页链接应该是

next_posts_link( \'Next\' );
previous_posts_link( \'Previous\' );
您的循环输入index.php 应该是这样的

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();

           // Your markup and template tags

    }
}
如果你真的需要front-page.php 作为一个普通的主页,而不是静态的首页,那么您需要执行以下操作

  • 使用分页链接将循环更改为我上面建议的内容

    使用pre_get_posts 如上所述,根据需要更改主查询

    使用home_template 要使用的筛选器front-page.php 作为主页模板

    您可以尝试以下方法

    add_filter( \'home_template\', function ( $template )
    {
        $locate_template = locate_template( \'front-page.php\' );
    
        if ( !$locate_template )
            return $template;
    
        return $locate_template;
    });
    
    原始答案功能next_posts_link()previous_posts_link() 不要在开箱即用的静态首页上工作。问题是,分页使用get_query_var( \'paged\' ) 保存在$paged 全球的因为静态首页使用get_query_var( \'page\' ) 而不是get_query_var( \'paged\' ), 您的链接将永远不会分页超过第1页。

    我们可以欺骗next_posts_link()previous_posts_link() 通过设置$paged 全局收件人get_query_var( \'page\' ).

    您可以尝试以下方法

    $paged                   = get_query_var( \'page\', 1 ); 
    $args                    = [];
    $args[\'post_type\']       = \'post\';
    $args[\'post_status\']     = \'publish\';
    $args[\'category_name\']   = \'featured\';
    $args[\'posts_per_page\']  = 4;
    $args[\'paged\']           = $paged;
    
    $the_query = new WP_Query($args);
    
    if ($the_query->have_posts()) {
    
        while ($the_query->have_posts()) {
    
            $the_query->the_post() ;
            the_title();
    
        } // End of: while ($the_query->have_posts())
    
        next_posts_link(\'Next\', $the_query->max_num_pages );
        previous_posts_link(\'Previous\');
    
        wp_reset_postdata(); // VERY VERY IMPORTANT
    
    } // End of: if ($the_query->have_posts())
    
    编辑您还可以在静态首页上使用以下内容

    $query = new PreGetPostsForPages(
        251,       // Page ID we will target, your static front page ID
        \'content\', //Template part which will be used to display posts, name should be without .php extension 
        false,     // Should get_template_part support post formats
        true,      // Should the page object be excluded from the loop
        [          // Array of valid arguments that will be passed to WP_Query/pre_get_posts
            \'post_type\'      => \'post\', 
            \'category_name\'  => \'featured\',
            \'posts_per_page\' => 4
        ] 
    );
    $query->init(); 
    
    其中PreGetPostsForPages 类由支持my answer here

    add_action( \'pregetgostsforgages_after_loop_pagination\', function ()
    {
        $paged = get_query_var( \'page\', 1 );
        next_posts_link( \'Next\' );
        previous_posts_link( \'Previous\' );
    });
    

相关推荐

自定义“The_Posts_Pagination”并将列表放入div

Hello everybody, 我需要有关自定义wordpress分页的帮助。我想得到这个:这就是我所做的:在函数中。php,我添加了以下代码:function wp_custom_pagination($args = [], $class = \'pagination\') { if ($GLOBALS[\'wp_query\']->max_num_pages <= 1) return; $args = wp_parse_args( $args,