如何正确重写CPT的分页规则以避免/page/2上的404错误

时间:2020-08-05 作者:Em Karimifar

我有一个名为News的自定义帖子类型和一个静态页面,该页面使用自定义模板(page News.php)并索引主页下的所有新闻帖子。com/新闻url。

问题是我想对新闻页面分页,以便主页。com/news/page/2将显示更多帖子等,但返回404错误。

这就是我在函数中更改分页规则的方式。php:

function my_pagination_rewrite() {
    add_rewrite_rule(\'page/?([0-9]{1,})/?$\', \'page-news.php?category_name=blog&paged=$matches[1]\', \'top\');
}
add_action(\'init\', \'my_pagination_rewrite\');
这是我在新闻页面上的自定义查询。php:

<?php
    $paged = ( get_query_var(\'paged\') ) ? get_query_var( \'paged\' ) : 1;
    $query = new WP_Query(array(
        \'post_type\' => \'news\',
        \'post_status\' => \'publish\',
        \'posts_per_page\' => \'4\',
        \'paged\' => $paged
    ));
    $temp_query = $wp_query;
    $wp_query   = NULL;
    $wp_query   = $query;
    while ($query->have_posts()):
        $query->the_post();
        
    <!-- ECHOING THE NEWS POSTS-->

    endwhile;
    wp_reset_postdata();

    echo \'<div class="pagination">\';

            echo paginate_links( array(
                \'base\'         => str_replace( 999999999, \'%#%\', esc_url( get_pagenum_link( 999999999 ) ) ),
                \'total\'        => $query->max_num_pages,
                \'current\'      => max( 1, get_query_var( \'paged\' ) ),
                \'format\'       => \'?paged=%#%\',
                \'show_all\'     => false,
                \'type\'         => \'plain\',
                \'end_size\'     => 2,
                \'mid_size\'     => 1,
                \'prev_next\'    => true,
                \'prev_text\'    => sprintf( \'<i></i> %1$s\', __( \'Newer Posts\', \'text-domain\' ) ),
                \'next_text\'    => sprintf( \'%1$s <i></i>\', __( \'Older Posts\', \'text-domain\' ) ),
                \'add_args\'     => false,
                \'add_fragment\' => \'\',
            ) );

    echo \'</div>\';
    
    $wp_query = NULL;
    $wp_query = $temp_query;
?>

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

你不需要重写规则,而且它们也不是这样工作的。

The fundamental problem is that you decided not to modify the main query, but to replace it.

不需要定制WP_Query 或自定义分页,或页面模板。更不用说通过运行主查询然后丢弃结果来创建新的查询,它将需要执行的工作量增加了一倍,这是一个重大的性能影响/降低

您可以使用archive-news.php 带有标准post循环的模板,然后使用pre_get_posts 要更改页面上显示的帖子数量,请执行以下操作:

// only show 4 posts per page on the news archive
add_action(
    \'pre_get_posts\',
    function( \\WP_Query $query ) {
        // we only want the news post archive, exit early if it isn\'t
        if ( ! $query->is_main_query() || ! $query->is_post_type_archive( \'news\' ) ) {
            return;
        }
        $query->set( \'posts_per_page\', 4 );
    }
);
现在,新闻档案将显示每页4篇文章。没有重写规则,没有CPT调整,没有页面模板用于分页的特殊页面,所有这些都应该通过挂钩来解决问题。您可以使用常规的标准主循环,如默认主题。速度会更快!您不再通过放弃主查询并加入自己的查询来将所有查询加倍。

这样,您的上述代码就可以简化为archive-news.php 模板:

while ( have_posts() ) {
    the_post();
    <!-- ECHOING THE NEWS POSTS-->
}

echo \'<div class="pagination">\';
echo paginate_links();
echo \'</div>\';

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post