当我单击自定义帖子类型“works”帖子列表中的分页链接(或输入“mysite.com/works/page/2”等 URL)时,我会看到 404 页面。
常规帖子类型分页(博客)工作正常。另外,关于我的自定义帖子类型“有效”的其他所有内容似乎都工作正常。
我的
template-works.php
文件有这个:
get_home_pagination();
$args = array( 'post_type' => 'works', 'posts_per_page' => 10, 'paged' => $paged ); $wp_query = new WP_Query( $args );
if ( $wp_query->have_posts() ) :
while ($wp_query->have_posts()) :
$wp_query->the_post();
get_template_part( 'loop', 'works' );
endwhile;
else:
_e( 'Nothing here.' );
endif;
在
template-blog.php
中使用相同的代码(当然,替换后类型),分页链接可以正常工作。
然后在
functions.php
我得到:
function get_home_pagination() {
global $paged, $wp_query, $wp;
$args = wp_parse_args($wp->matched_query);
if ( !empty ( $args['paged'] ) && 0 == $paged ) {
$wp_query->set('paged', $args['paged']);
$paged = $args['paged'];
}
}
有一瞬间,我以为发生这种情况是因为 WordPress 在循环中找不到任何帖子:当没有帖子时,它会尝试获取帖子 ID,如
post-template.php
的第 29 行所示。但后来我意识到这一点:
例如,如果我输入 URL“(...)/blog/page/456”,博客模板会加载消息“此处什么都没有”。没有 404 错误页面。
另一方面,我希望返回一些帖子的 URL“works/page/2”以 404 错误页面结束。
为什么?
编辑:
在 404 页面上我也收到此错误:
尝试获取非对象的属性 (…)/wordpress/wp-includes/post-template.php 第 29 行。
...但这可能与分页问题无关。我设法删除了导致此错误的代码(来自我自定义的插件),但分页仍然无法正常工作。
编辑:
这是我通过使用 Debug-this 插件调试 URL mysite.com/trabalhos/pagina/2 得到的结果。好像很不对:
观察:trabalhos = 作品,pagina = 页面
匹配规则:trabalhos/([^/]+)(/[0-9]+)?/?$
匹配查询:works=pagina&page=%2F2
查询字符串: page=%2F2&name=pagina&post_type=works&works=pagina&debug-this=重写
根据我的理解,URL mysite.com/trabalhos/pagina/2 应该指向以下 URL(除非它不起作用 - 但如果我将 'trabalhos' 替换为 'noticias' - 我的 'blog' 的 slug) - 它有效):
mysite.com/trabalhos/pagina/2/?pagename=trabalhos
但是,URL mysite.com/trabalhos/pagina/2 指向这个奇怪的 URL:
mysite.com/trabalhos/pagina/2?page=%2F2&works=pagina&post_type=works&name=pagina
令人惊讶的是,下面的 URL 完全指向了我所期待的内容,即作品的第 2 页(trabalhos):
mysite.com/noticias/pagina/2/?pagename=trabalhos
我似乎已经接近解决方案...但是我尝试停用所有插件,删除几乎所有主题 php 代码,每次重置管理面板中的永久链接设置等,但错误仍然存在。
是配置错误吗?会在哪里?
预先感谢您的帮助!
这听起来像是您的自定义帖子类型中的 slug 冲突。 尝试将帖子别名重命名为任何其他名称,然后再次转到永久链接以重新生成重写规则。
10 年后......对于任何陷入此困境的人,我使用了重写规则来确保 /page/ URL 用于分页,同时允许单个帖子永久链接的结构与“帖子”页面相匹配。在此示例中,我有一个项目帖子类型,其 /projects 页面使用自定义页面模板,单个项目永久链接结构为 /projects/title-here。
重写规则:
function post_type_rewrite_rules() {
// Get all page IDs using the desired page template
$args = [
'post_type' => 'page',
'fields' => 'ids',
'nopaging' => true,
'meta_key' => '_wp_page_template',
'meta_value' => 'template-projects.php' // Path to template from root of theme
];
$page_ids = get_posts( $args );
// Check there's a page that uses this template
if( !empty($page_ids) ):
// Get the first page ID (in case of multiple pages using this template)
$projects_page_id = $page_ids[0];
// Add rewrite rule to allow pagination to work correctly
add_rewrite_rule(
'^projects/page/([0-9]+)/?$',
'index.php?page_id=' . $projects_page_id . '&paged=$matches[1]',
'top'
);
endif;
}
add_action('init', 'post_type_rewrite_rules');