我有一个名为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;
?>
最合适的回答,由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>\';