自定义帖子类型、页面模板和分页。为什么我会收到404错误?

时间:2012-06-16 作者:timshutes

今天我花了几个小时讨论了一个令人恼火的问题,我一直在显示一个自定义的帖子类型。一切都显示得很漂亮,除了分页根本无法正常工作。

我有一个页面模板设置来显示“帖子页面”(请参阅Codex: Page of Posts) 对于自定义帖子类型(“news”)。

当我点击“旧帖子”时,我不断收到404错误。我注意到很多人都有这个问题。

为什么会这样?这是我的查询(&A);循环代码:

<?php 
    // Enable Pagination
    $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;

    // The Args
    $args= array(
        \'post_type\' => \'news\',
        \'paged\' => $paged,
        );

    // The Query
    query_posts($args); 

    // The Loop
    while ( have_posts() ) : the_post(); ?>
// ...

3 个回复
最合适的回答,由SO网友:timshutes 整理而成

我在发帖前几秒钟就把这个问题弄清楚了,所以我想我会继续把答案贴在这里。我注意到对于这个问题没有太多的综合帮助。

如果您的“旧帖子”或“新帖子”链接在页面模板上显示自定义帖子时出现404错误,这将对您有所帮助。

以下是解决404问题的步骤(大多数情况下)。每次检查后,查看问题是否消失。

Step 1: Flush your permalinks

转到设置=>永久链接。选择“默认”。拯救测验选择您的首选项。拯救再次测试。

Step 2: Check your query.

如果刷新永久链接不能解决问题,请仔细检查您的查询。使用法典(参见:Pages > page of posts). 您需要定义$paged变量并在查询选项中使用它。

Step 3: Make sure your posts_per_page does not conflict with the default.

有些人认为这是wordpress核心中的一个bug。无论情况是否如此posts_per_page => x 选项可能会导致分页问题,如果x 小于默认选项。

解决此问题的一个黑客解决方案是将默认值设置为1(设置>阅读>“博客最多显示\\uu页面”)。

注意:此时,我仍然有问题。。是第四步最终为我解决了这个问题。

Step 4: Make sure your page slug != your post_type.

就我而言,我post_type => \'news\'. 我使用的网页是www.mysite。com/新闻。这导致了冲突,最终导致分页错误。为了解决这个问题,我将post\\u类型改为“news articles”,并重新刷新了永久链接。问题消失了。

如果你遇到同样的问题,希望这能帮助你。我有一种感觉,很多人都掉进了这个陷阱——这很容易做到,也不太直观。(至少不是为了我)。

SO网友:Dmitry Misharov

关于步骤3。下面是发生这种情况的原因解释:“分页是在您访问运行query\\u posts的模板文件之前计算的。有条件地更改每页posts\\u的正确方法是使用pre\\u get\\u posts挂钩来修改主查询。”https://wordpress.stackexchange.com/a/42063/17177我找到了一个适合我的实现“pre\\u get\\u posts”http://uncommoncontent.com/2012/01/28/add-custom-post-types-to-the-loop:

if ( ! function_exists( \'ucc_add_cpts_to_pre_get_posts\' ) ) {
    function ucc_add_cpts_to_pre_get_posts( $query ) {
        if ( $query->is_main_query() && ! is_post_type_archive() && ! is_singular() && ! is_404() ) {
        $my_post_type = get_query_var( \'post_type\' );
            if ( empty( $my_post_type ) ) {
                $args = array(
                    \'exclude_from_search\' => false,
                    \'public\' => true,
                    \'_builtin\' => false
                );
                $output = \'names\';
                $operator = \'and\';
                $post_types = get_post_types( $args, $output, $operator );

                // Or uncomment and edit to explicitly state which post types you want.
                // $post_types = array( \'event\', \'location\' );
                // Add \'link\' and/or \'page\' to array() if you want these included.
                // array( \'post\', \'link\', \'page\' ), etc.
                $post_types = array_merge( $post_types, array( \'post\' ) );
                $query->set(\'post_type\', $post_types );
            }
        }
    } 
}

add_action( \'pre_get_posts\', \'ucc_add_cpts_to_pre_get_posts\' );

SO网友:Val

经过数小时的研究,我找到了一个简单的解决方案:)

我把这一切都很好地写在了博客上,为任何应该遇到这个问题的人:)

http://www.jqui.net/wordpress/wp-post-type-pagination/

希望有人能从中得到一些乐趣:)

结束