WordPress 分页链接在自定义帖子类型上返回 404 错误(仅)?

问题描述 投票:0回答:2

当我单击自定义帖子类型“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 代码,每次重置管理面板中的永久链接设置等,但错误仍然存在。

是配置错误吗?会在哪里?

预先感谢您的帮助!

php wordpress pagination http-status-code-404 custom-post-type
2个回答
24
投票

这听起来像是您的自定义帖子类型中的 slug 冲突。 尝试将帖子别名重命名为任何其他名称,然后再次转到永久链接以重新生成重写规则。


0
投票

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');
© www.soinside.com 2019 - 2024. All rights reserved.