我正在制作一个带有分页的类别模板页面,下面是我的代码:
<?php
$current_page = get_queried_object();
$category = $current_page->slug;
$paged = get_query_var( \'paged\' ) ? get_query_var( \'paged\' ) : 1;
$query = new WP_Query(
array(
\'paged\' => $paged,
\'category_name\' => $category,
\'order\' => \'asc\',
\'post_type\' => \'page\',
\'post_status\' => array(\'publish\'),
\'posts_per_page\' => 6,
\'post_parent\' => 2,
)
);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post(); ?>
<article id="post-<?php the_ID(); ?>">
<header class="entry-header">
<?php the_title( sprintf( \'<h2 class="entry-title"><a href="%s" rel="bookmark">\', esc_url( get_permalink() ) ), \'</a></h2>\' ); ?>
</header><!-- .entry-header -->
<div class="entry-content">
<?php the_content(); ?>
</div><!-- .entry-content -->
</article><!-- #post-## --><hr>
<?php
}
// next_posts_link() usage with max_num_pages
next_posts_link( \'Older Entries\', $query->max_num_pages );
previous_posts_link( \'Newer Entries\' );
wp_reset_postdata();
}
?>
因此,我有大约10页相同的类别(例如艺术)。
我将从中获取下一页链接next_posts_link( \'Older Entries\', $query->max_num_pages );
. 它生成如下链接:
http://mywebsite.com/category/arts/page/2/
但我有一个
404 当我点击上面的这个url时,页面会显示。它应该
stays at the category template, 不是吗?
所以我添加了following fix 转换为函数。php:
add_action( \'init\', \'wpa58471_category_base\' );
function wpa58471_category_base() {
// Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
// The regex to match the incoming URL
\'category/([^/]+)/page/([0-9]+)?/?$\',
// The resulting internal URL
\'index.php?category_name=$matches[1]&paged=$matches[2]\',
// Add the rule to the top of the rewrite list
\'top\' );
}
但我还是得到了404页。我做错了什么?
Even if I access it with the direct address, I still get 404:
http://mywebsite.com/index.php?category_name=arts&paged=2
有什么想法吗
why?
SO网友:Milo
WordPress服务前端请求的步骤大致如下-
传入URL将被解析并转换为查询变量。
这些查询变量构成Main Query, 发送到数据库。
WordPress查看结果并确定请求是否成功,从而确定要发送的状态标头-200 OK或404 not found。
WordPress加载与此类请求相对应的模板,例如,如果是类别请求,则加载类别存档模板;如果主查询没有帖子,则加载404模板。
因此,对于您为什么看到404的问题,最简短的回答是,主查询没有帖子。
在模板中运行的查询及其生成的任何分页都与主查询无关。这就是为什么需要使用pre_get_posts
自定义存档页面的结果。
如果您只需要页面,可以将post type设置为page
:
add_action( \'pre_get_posts\', function($q) {
if( !is_admin() && $q->is_main_query() && !$q->is_tax() ) {
$q->set (\'post_type\', array( \'page\' ) );
}
});