Pagination Doesn't Work

时间:2013-09-09 作者:Paul

I created myfile.php with the following content:

global $paged;
if ( get_query_var( \'paged\' ) ) {
    $paged = get_query_var( \'paged\' );
} else if ( get_query_var( \'page\' ) ) {
    $paged = get_query_var( \'page\' );
} else {
    $paged = 1;
}

$args = array(
    \'post_type\' => array(\'my_custom_post_type\'),
    \'paged\' => $paged,
    \'posts_per_page\' => 3,
    \'ignore_sticky_posts\' => 1
);

$wp_query = new WP_Query( $args );
var_dump($wp_query);
if($wp_query->have_posts()) :
    while($wp_query->have_posts()) : $wp_query->the_post();
        // show post
    endwhile;
endif;

next_posts_link(\'Next posts\');

wp_reset_query();
wp_reset_postdata();
以及:

在“设置”>“阅读”中将其设置为“静态首页”时,分页效果良好。我可以访问http://example.com/page/2当设置>永久链接设置为“默认永久链接结构”时,它可以使用http://example.com/?page_id=1234&paged=2永久链接设置为任何“自定义结构”时,请执行以下操作http://example.com/mypage/page/2 启动404。php我不知道我在这里遗漏了什么,但我只是尝试了本页故障排除指南中的每一条建议:https://codex.wordpress.org/Pagination - 他们认为,当永久链接设置为“自定义结构”时,“404-未找到”是常见问题之一,因此WP开发人员知道一些错误或问题,但他们没有说明如何修复。

我的服务器是WAMP for Windows 7(PHP 5.4.3、Apache 2.4.2、,mod_rewrite 启用自定义链接结构后,当“myfile.php”用作“静态首页”以外的页面时,除了分页之外,其他链接结构都能很好地工作。

我的htaccess当“Custom Permalink Structure”设置为“Post name”时:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>

# END WordPress
当我进入时http://example.com/mypage/page/2 (不起作用):SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_name = \'page\' AND wp_posts.post_type = \'my_custom_post_type\' ORDER BY wp_posts.post_date DESC

当我进入时http://example.com/?page_id=1234&paged=2 (工程):SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = \'my_custom_post_type\' AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\') ORDER BY wp_posts.post_date DESC LIMIT 2, 2

3 个回复
SO网友:Michael Ecklund

我在尝试为我的自定义帖子类型和自定义分类法显示数字分页时,在我自己的几个插件中遇到过这种情况。

我的理解是WP_Query 以自己的自定义方式(默认方式除外)从数据库中获取帖子将阻止您按预期使用此类函数。

它们用于默认的posts查询。因此,如果您希望按预期使用这些功能,则需要在执行查询之前修改默认查询。你可以用钩子pre_get_posts.

但是,如果要使用自己的自定义查询,请使用WP_Query, 然后还需要自定义数字分页的工作方式。使用标准WordPress功能可以获得相同的最终结果,但它需要额外几行代码才能实现预期的数字分页。

Let\'s say you have a custom query using WP_Query and it looks something like this:

$query = new WP_Query( $query_args );

这意味着您有一个全新的查询,它与加载页面时执行的主默认查询不同。

Now WordPress is aware of TWO queries for the current page:

  1. Query #1 作为默认查询
  2. Query #2 作为您刚才使用创建的自定义查询WP_Query.
如果希望数字分页与自定义查询配合使用,则需要了解执行请求的当前页面。

The current page number is actually referred to as paged. You can determine the current page number using some code like this:

$current_page = 1;

if ( get_query_var( \'paged\' ) ) {
    $current_page = get_query_var( \'paged\' );
}

Once the current page has been determined, you can setup your custom query to look similar to this:

$query_args = array(
    \'post_type\'      => \'products\',
    \'post_status\'    => \'publish\',
    \'posts_per_page\' => 10,
    \'paged\'          => absint( $current_page )
);

$query = new WP_Query( $query_args );

Once the query has been performed, you then need to check if it\'s located any posts in the database which match your criteria:

if ( $query->have_posts() ) {

    while ( $query->have_posts() ) {

        $query->the_post();

        // Post content here...

    }

} else {

    // No posts...

}
现在开始数字分页!我建议使用一个名为paginate_links() 对于此部分。

我真的不太明白base, 但这就是上面链接的WordPress Codex页面所展示的内容。

您需要指定当前页面(paged) -- 再一次$query 变量对象)


$big = 999999999; // need an unlikely integer

$previous_text = \'&laquo; Previous\';
$next_text     = \'Next &raquo;\';

$pagination = paginate_links( array(
    \'base\'      => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
    \'format\'    => \'?current_page=%#%\',
    \'current\'   => max( 1, $current_page ),
    \'total\'     => $query->max_num_pages,
    \'type\'      => \'array\',
    \'prev_text\' => $previous_text,
    \'next_text\' => $next_text
) );
此代码需要置于声明我们有可用帖子的条件内。不是在循环内部,而是在循环之后。

一旦配置了数字分页,就可以输出(或显示)。这是分页项目返回的位置array 总体安排

我喜欢用条件检查来包装它,然后在执行附加条件检查的项目中循环。

if ( $pagination ) {

    $content .= \'<div class="clearfix"></div>\' . PHP_EOL;
    $content .= \'<nav id="numerical-pagination" class="text-center">\' . PHP_EOL;
    $content .= \'<ul class="pagination">\' . PHP_EOL;

    foreach ( $pagination as $pagination_item ) {

        $class = \'\';

        if ( stripos( $pagination_item, \'current\' ) !== false ) {
            $class = \' class="active"\';
        }

        if ( stripos( $pagination_item, \'dots\' ) !== false ) {
            $class = \' class="disabled"\';
        }

        $content .= \'<li\' . $class . \'>\' . $pagination_item . \'</li>\' . PHP_EOL;

    }

    $content .= \'</ul>\' . PHP_EOL;
    $content .= \'</nav><!-- end #numerical-pagination .text-center -->\' . PHP_EOL;
    $content .= \'<div class="clearfix"></div>\' . PHP_EOL;

    echo $content;

}
Note: 我对WordPress主题使用Bootstrap。所以,如果你想让分页看起来很棒,只需要很少的努力。测试Bootstrap.

综上所述,这里有一个多功能复制/粘贴入门解决方案,任何人都可以使用WP_Query.

$current_page = 1;

if ( get_query_var( \'paged\' ) ) {
    $current_page = get_query_var( \'paged\' );
}

$query_args = array(
    \'post_type\'      => \'products\',
    \'post_status\'    => \'publish\',
    \'posts_per_page\' => 10,
    \'paged\'          => absint( $current_page )
);

$query = new WP_Query( $query_args );

if ( $query->have_posts() ) {

    while ( $query->have_posts() ) {

        $query->the_post();

        // Post content here...

    }

    $big = 999999999; // need an unlikely integer

    $previous_text = \'&laquo; Previous\';
    $next_text     = \'Next &raquo;\';

    $pagination = paginate_links( array(
        \'base\'      => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
        \'format\'    => \'?current_page=%#%\',
        \'current\'   => max( 1, $current_page ),
        \'total\'     => $query->max_num_pages,
        \'type\'      => \'array\',
        \'prev_text\' => $previous_text,
        \'next_text\' => $next_text
    ) );

    $content = \'\';

    if ( $pagination ) {

        $content .= \'<div class="clearfix"></div>\' . PHP_EOL;
        $content .= \'<nav id="numerical-pagination" class="text-center">\' . PHP_EOL;
        $content .= \'<ul class="pagination">\' . PHP_EOL;

        foreach ( $pagination as $pagination_item ) {

            $class = \'\';

            if ( stripos( $pagination_item, \'current\' ) !== false ) {
                $class = \' class="active"\';
            }

            if ( stripos( $pagination_item, \'dots\' ) !== false ) {
                $class = \' class="disabled"\';
            }

            $content .= \'<li\' . $class . \'>\' . $pagination_item . \'</li>\' . PHP_EOL;

        }

        $content .= \'</ul>\' . PHP_EOL;
        $content .= \'</nav><!-- end #numerical-pagination .text-center -->\' . PHP_EOL;
        $content .= \'<div class="clearfix"></div>\' . PHP_EOL;

        echo $content;

    }

    wp_reset_postdata();

} else {
    // No posts...
}

wp_reset_query();

SO网友:Jigar Gorakhiya

您也可以尝试以下代码。

function custom_type_archive_display($query) {

    if (is_post_type_archive(\'custom_post_type\') )
    {
        $query->set(\'posts_per_page\',10);
        return;
    }
}

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

SO网友:Paul

经过几个小时的挣扎,我找到了原因。

我注册使用的帖子类型register_post_type( \'my_custom_post_type\', array( ... ) );\'rewrite\' => array( \'slug\' => \'my_custom_post_type\' ). 这比分页更重要,这就是为什么会发生“404-找不到”的原因。

如果有人对什么优先以及什么时候优先有更好的解释,请编辑我的答案。此问题在编辑后得到解决rewrite 去做别的事。

结束

相关推荐

从wp-Query获取数据,在循环之外&不更改url

我正在基于自定义分类法在wordpress上进行高级搜索。我已经被困72小时了,所以我希望能得到一些帮助或思考。。。步骤1——在js文件中,查询字符串如下所示:if (jQuery(\'#s\').val() == \'\'){ URL = \"/?genre=\" + genre + \'...other Stuff\' #content\'; }else{ URL = \"/?s=\"+searchQueryString+\"&genre=\" + genre +\'.