paginationWordPress的分页函数不少,今天写个小笔记整理一下。基本的分页应该包括文章内部分页、post(或者custom post type)分页以及评论分页等。

 

文章内部分页

文章内部分页指编辑文章时插入<!–nextpage–>标签将文章分成多个页面的分页方式。

使用的函数:wp_link_pages( $args )

主循环分页

主循环可以是post列表分页或者custom post type的分页。

使用的函数:paginate_links( $args )

通常用于主循环分页,在WordPress文档的介绍中提到

Technically, the function can be used to create paginated link list for any area

确实,这个函数可以用于任何自定义查询的分页,包括评论分页等。此函数本身不具备查询功能,而是从用户定义的查询语句中获取必要的参数(例如总页数、当前页数、url格式等),并按照分页格式打印结果。

用于自定义查询的例子

$total = $wpdb->get_var("
    SELECT COUNT(comment_ID)
    FROM $wpdb->comments
    WHERE user_id = $thisauthor->ID
    AND comment_post_id = ID
    AND comment_approved = 1
");
$comments_per_page = 100;
$page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;

echo paginate_links( array(
    'base' => add_query_arg( 'cpage', '%#%' ),
    'format' => '',
    'prev_text' => __('&laquo;'),
    'next_text' => __('&raquo;'),
    'total' => ceil($total / $comments_per_page),
    'current' => $page
));
//The example is from http://wordpress.stackexchange.com/questions/3318/
paginate-result-set-from-wpdb-get-results

相关文章

WordPress无插件分页代码

评论分页

评论分页可以用paginate_links()完成,如果没有特殊要求,WordPress有一个专门用作评论分页的函数

使用的函数:paginate_comments_links( $args )

如果只需要输出上一页下一页的导航,可以用

previous_comments_link()

next_comments_link()

评论分页函调用了paginate_links()显示分页结果。

非WordPress内置的分页功能

WP-PageNavi

分页插件很多,最著名的当属WP-PageNavi,使用paginate_links(),用户需要自己写一些代码给该函数赋值,该函数是个显示接口,如果不告诉它要显示的是什么,当前是第几页,用什么格式显示,就会不知所措。用WP_PageNavi就方便多了,对于主循环分页,只要写上插件提供的模板标签即可。该插件甚至是某些收费主题的推荐安装插件,主题内置了对该插件的支持。

<?php if( function_exists('wp_pagenavi') ) wp_pagenavi(); ?>

WP-PageNavi不仅支持主循环,还支持custom post type分类和WP_User_Query,看wp_pagenavi函数的参数就知道了

$args = array(
	'before' => '',
	'after' => '',
	'options' => array(),
	'query' => $GLOBALS['wp_query'],//WP_Query实例
	'type' => 'posts' //修改类型为custom_post_type
);

文章内部分页:不显示页码显示标题

这个想法很有趣,文章内部分页时,通常是显示页码,用户并不知道下面几页的内容时什么,如果将页码换成一些比较有意义的标题,就能让文章未显示的内容更加明了。效果如下图所示,当然得稍微装饰一下,不要让用户误以为是标签链接。

pagination-with-text

实现的方法:

1. 编辑文章时,插入一个分页标签,除了要写上<!–nextpage–>,还要添加一个标签识别这一页的名称,例如<!–Section:Introduction–>

<!-- 编辑文章时的源代码,注意Section参数 -->
<!--Section:Introduction-->
Lorem ipsum dolor sit amet, consectetur adipisicing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
<!--nextpage-->

<!--Section:Method-->
Ut enim ad minim veniam, quis nostrud exercitation ullamco 
laboris nisi ut aliquip ex ea commodo consequat.
<!--nextpage-->

<!--Section:Discussion-->
Duis aute irure dolor in reprehenderit in voluptate velit 
esse cillum dolore eu fugiat nulla pariatur.
<!--nextpage-->

<!--Section:Reference-->
Excepteur sint occaecat cupidatat non proident, sunt in 
culpa qui officia deserunt mollit anim id est laborum.

在functions.php中或者插件中定义如下函数

/**
 * Replace page numbers with section titles in HTML comments
 *
 * @return void
 * @author Matthew Boynes
 */
function my_wp_link_pages() {
    global $post, $numpages, $multipage;
    if ($multipage) {
        $links = wp_link_pages(array(
            'before' => '<div class="page-link">' . __( 'Pages:', 'toolbox' ),
            'after' => '</div>',
            'link_before' => '<b>',
            'link_after' => '</b>',
            'echo' => 0
        ));
        if (preg_match_all('/<!--Section:(.*?)-->/i', $post->post_content, $custom_links)) {
            for ( $i = 1; $i < ($numpages+1); $i = $i + 1 ) {
                $links = preg_replace("#<b>$i</b>#",$custom_links[1][$i-1],$links);
            }
        }
        echo $links;
    }
}-

然后在显示分页的地方(通常在single.php的主循环中,或者content-single.php中),添加代码,替换掉wp_link_pages()

<?php if( function_exists('my_wp_link_pages') ) my_wp_link_pages(); ?>

代码来源:Post pagination names, not numbers

8条留言

  1. 我在后台评论分页设置的是100条评论后分页,但留言板用per_page=20实现每20条就分页。而且把paginate_comments_links放到了wp_list_comments上面和下面。现在问题就出来了,放到下面的paginate_comments_links就有效显示了每20条评论后分页,但放到上面的paginate_comments_links就按后台设置100条分页方式分页了。这个怎么破?

    代码如下:

    1. 代码被过滤了,但相信你大概明白了我的意思

    2. 代码如下:

      <?php
      	 //如果用户在后台选择要显示评论分页
      if (get_option('page_comments')) {
      	$comment_pages = paginate_comments_links('echo=0');		// 获取评论分页的 HTML
      	if ($comment_pages){		// 如果评论分页的 HTML 不为空, 显示上一页和下一页的链接
      ?>
      <div class="commentnavi">评论分页: <?php paginate_comments_links('prev_text=上一页&next_text=下一页');?></div>
      <?php }?>
      <?php }?><!-- 要求分页 -->
      	
      <ol class="commentlist">
      <?php wp_list_comments('type=comment&callback=custom_comment&reverse_top_level=1&per_page=25'); ?></ol>
      </div>
      <?php
      	// 如果用户在后台选择要显示评论分页
      if (get_option('page_comments')) {
      	$comment_pages = paginate_comments_links('echo=0');		// 获取评论分页的 HTML
      	if ($comment_pages){		// 如果评论分页的 HTML 不为空, 显示上一页和下一页的链接
      ?>
      <div class="commentnavi">评论分页: <?php paginate_comments_links('prev_text=上一页&next_text=下一页');?></div>
      <?php }?>
      <?php }?><!-- 要求分页 -->
      
      1. 我记得评论分页代码必须放在wp_list_comments函数后面,才能通过per_page方式修改页数,你可以考虑去掉上面那个分页代码,用js直接复制下面的分页代码到上面那个位置。

        1. 感觉JS有点麻烦。这个问题我给comments.php加per_page=100,后台评论分页设置25解决了。

          1. js就一句话,jquery. clone().appendTo。以前也试过代码修改评论分页,当开启嵌套评论,用户提交留言恰好需要放到下一页时,提交后跳转地址会出错,不知道现在还有这问题不

  2. 觉得您的博客非常不错,我的站点http://www.9elite.com,能加个友情链接吗?

    1. 可以,不过我没有天天点友情链接或者去友链灌水的习惯,我宁可花更多时间写原创文章,如果你觉得这样okay的话就交换一下。我加上你了。

评论功能已关闭