WordPress自带一个分页函数,叫做paginate_links,使用该函数就可以做文章分页。

关于paginate_links函数

<?php echo paginate_links( $args ) ?>

<?php $args = array(
    'base'         => '%_%',
    'format'       => '?page=%#%', //是否使用pretty link format
    'total'        => 1, //一共分多少页
    'current'      => 0,
    'show_all'     => False, //是否显示全部页码,否则将省略一部分,类似wp_pagenavi效果
    'end_size'     => 1, //开始和结束处显示多少个页码
    'mid_size'     => 2, //当前页面两边显示多少个页码
    'prev_next'    => True,
    'prev_text'    => __('&laquo; Previous'),
    'next_text'    => __('Next &raquo;'),
    'type'         => 'plain', //页码类型可以使plain,list或者array
    'add_args'     => False,
    'add_fragment' =>  ); ?>

对主循环进行分页

利用paginate_links函数对主循环分页,代码如下

<?php
global $wp_query;
$total = $wp_query->max_num_pages;
// only bother with the rest if we have more than 1 page!
if ( $total > 1 )  {
	 // get the current page
	 if ( !$current_page = get_query_var('paged') )
		  $current_page = 1;
	// structure of "format" depends on whether we're using pretty permalinks
        $permalink_structure = get_option('permalink_structure');
        if( substr($permalink_structure,-1) != "/" ) {
            if( is_home() )
                $sub_format = 'page/%#%/';
            else
                $sub_format = '/page/%#%/';
        }else {
            $sub_format = 'page/%#%/';
        }
        
        $format = empty( $permalink_structure) ? '&page=%#%' : $sub_format;
	 echo paginate_links(array(
		  'base' => get_pagenum_link(1) . '%_%',
		  'format' => $format,
		  'current' => $current_page,
		  'total' => $total,
		  'mid_size' => 4,
		  'type' => 'plain'
	 ));
} ?>

该代码可以实现与wp_pagenavi一样的效果。

该方法不仅适用于主循环,稍微改一下还可以用于自定义查询。例如文章《利用WP User Query+WP Pavenavi制作会员列表》中提到用wp pagevani实现WP_User_Query的分页,其实用上面的代码一样可以实现,代码如下

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$paged -= 1;
$limit = 40;
$offset = $paged * $limit;

$args  = array(
	'number' => $limit,
	'offset' => $offset,
);

// Create the WP_User_Query object
$user_query = new WP_User_Query($args);

// Get the results
$authors = $user_query->get_results();

if($authors): ?>
</pre>
<div class="members"><?php foreach($authors as $author) : ?>
	<div class="user-info">
		<div class="user-gravatar48"><a href="<?php the_qa_user_url( $author->ID)?>"><?php echo get_avatar($author->ID, 48); ?></a></div>
		<div class="user-details"><a href="<?php the_qa_user_url( $author->ID)?>"><?php echo $author->display_name; ?></a> <?php the_qa_user_rep_inline(); ?></div>
	</div>
	<?php endforeach; ?><?php else: ?>
	<div class="post"><?php _e('No Members yet','thematic'); ?></div>
	<?php endif; ?></div>
<?php
	//start page navigation
	global $user_query;
	$total = ceil($user_query->total_users/$limit);
	// only bother with the rest if we have more than 1 page!
	if ( $total > 1 )  {
		 // get the current page
		 if ( !$current_page = get_query_var('paged') )
			  $current_page = 1;
		 // structure of "format" depends on whether we're using pretty permalinks
		 $permalink_structure = get_option('permalink_structure');
		 $format = empty( $permalink_structure) ? '&page=%#%' : '/page/%#%/';
		 echo paginate_links(array(
			  'base' => get_pagenum_link(1) . '%_%',
			  'format' => $format,
			  'current' => $current_page,
			  'total' => $total,
			  'mid_size' => 4,
			  'type' => 'plain'
		 ));
} ?>

6条留言

  1. 我将分页写到cateogry.php的
    while ( have_posts() ) :
    the_post();
    循环中 不行呢?

    如何从主循环中得到$wp_query?分页是要依赖这个$wp_query的啊?这个值从哪里来,难道申明为global $wp_query 就会自动在某处被赋值?期待回复!!

    1. $wp_query在加载模板之前就已经赋值了,wordpress的工作原理是先根据url判断当前是什么类型的页面,然后到数据库请求数据并给$wp_query赋值,最后调用适当的模板显示数据。模板调用在template-loader.php里。

      分页还是用WP-PageNavi插件吧,省心。

  2. $format = empty( $permalink_structure) ? ‘&page=%#%’ : $sub_format;

    对主体分页那段代码的第20行,在我这里要改成
    ?paged=%#%

    才有效是怎么回事?

    这法子好方便的 说~~~~~适用的版本有什么限制么?

    1. paginate_links函数基本可以对任何查询进行分页,没有使用版本的限制。

      但根据具体情况的不同,需要相应调整其参数,你的情况应该跟固定连接格式有关系,是不是用的默认链接?我还没测试默认链接下这个方式好不好用,但默认链接下首页的分页应该是?paged=%#%,用&开头肯定会不对。

      paginate_links中base参数里面的%_%会被format的值代替

      format参数中的%#%会被实际的页码代替,你可以根据这个调整程序。

评论功能已关闭