willin 出品的 Mini Pagenavi 修改版

willin kan 再次发力,于今天放出了Mini Pagenavi 的代码,用来代替文章翻页插件,于是我 CP 到本地测试,但发现了个问题:因为我的主题首页和分类页/标签页面的单页显示文章数量是不同的,目前我主题定义是首页10篇,分类页/标签页每页显示是40篇,由于 willin 的代码是使用 $posts_per_page 参数,因此致使自定义文章数量的分类页/标签页的页数错误。

于是习惯性的在求助于他人前先自个折腾一番,在查阅了一些相关翻页插件,从中挪用了些参数,问题解决,但是否解决的很完美就不得而知了,毕竟我对php不熟。

方法就是使用 $wp_query ,至于什么是 $wp_query ,引用水煮鱼的总结:使用 WP_Query 自定义 WordPress Loop 是不干扰默认 Loop 而去跑自定义查询的一种简单方法。这同样是完全独立去跑多个 Loop 得好方法。

具体参考水煮鱼的《使用 WP_Query 自定义 WordPress Loop》或者 WP 官方 http://codex.wordpress.org/Function_Reference/WP_Query

先贴出 willin 的原码(具体参考原文:《Mini Pagenavi》- edit:2010.6.13 已经更改,具体看文章最下面的代码)

/* Mini Pagenavi v1.0 by Willin Kan. */
if ( !function_exists('pagenavi') ) {
	function pagenavi( $p = 5 ) { // 取当前页前后各2页,根据自己模板设置
		if ( is_singular() ) return false; // 文章与页面不用
		global $request, $posts_per_page, $wpdb, $paged;
		$query = is_category() || is_tag() ? 'GROUP' : 'ORDER';
		preg_match( '#FROM\s(.*)\s' . $query . ' BY#siU', $request, $match );
		$numposts = $wpdb->get_var( "SELECT COUNT(DISTINCT ID) FROM $match[1]" );
		$max_page = ceil( $numposts / $posts_per_page );
		if ( $max_page == 1 ) return false; // 只有一页不用
		if ( empty( $paged ) ) $paged = 1;
		echo '<span class="pages">Page: ' . $paged . ' of ' . $max_page . ' </span> '; // zwwooooo
		if ( $paged > $p + 1 ) p_link( 1, '最前页' );
		if ( $paged > $p + 2 ) echo '... ';
		for( $i = $paged - $p; $i <= $paged + $p; $i++ ) { // 中间页
			if ( $i > 0 && $i <= $max_page ) $i == $paged ? print "<span class='page-numbers current'>{$i}</span> " : p_link( $i );
		}
		if ( $paged < $max_page - $p - 1 ) echo '... ';
		if ( $paged < $max_page - $p ) p_link( $max_page, '最后页' );
	}
	function p_link( $i, $title = '' ) {
		if ( $title == '' ) $title = "第 {$i} 页";
		echo "<a class='page-numbers' href='", esc_html( get_pagenum_link( $i ) ), "' title='{$title}'>{$i}</a> ";
	}
}
// -- END ----------------------------------------

下面是我自个折腾过的代码,支持定义了不同页面显示不同文章数量的主题

/* Mini Pagenavi v1.0 by Willin Kan. Edit by zwwooooo */
if ( !function_exists('pagenavi') ) {
	function pagenavi( $p = 5 ) { // 去当前页前后各 5 页,根据自己需要设置
		if ( is_singular() ) return false; // 文章与页面不用
		global $request, $wpdb, $paged, $wp_query;// 用$wp_query代替原来的$posts_per_page
		$query = is_category() || is_tag() ? 'GROUP' : 'ORDER';
		preg_match( '#FROM\s(.*)\s' . $query . ' BY#siU', $request, $match );
		$numposts = $wpdb->get_var( "SELECT COUNT(DISTINCT ID) FROM $match[1]" );
		if ( !$max_page ) { $max_page = $wp_query->max_num_pages; } //这是关键,代替原来的$max_page = ceil( $numposts / $posts_per_page );
		if ( $max_page == 1 ) return false; // 只有一页不用
		if ( empty( $paged ) ) $paged = 1;
		echo '<span class="pages">Page: ' . $paged . ' of ' . $max_page . ' </span> '; // zwwooooo
		if ( $paged > $p + 1 ) p_link( 1, '最前页' );
		if ( $paged > $p + 2 ) echo '... ';
		for( $i = $paged - $p; $i <= $paged + $p; $i++ ) { // 中间页
			if ( $i > 0 && $i <= $max_page ) $i == $paged ? print "<span class='page-numbers current'>{$i}</span> " : p_link( $i );
		}
		if ( $paged < $max_page - $p - 1 ) echo '... ';
		if ( $paged < $max_page - $p ) p_link( $max_page, '最后页' );
	}
	function p_link( $i, $title = '' ) {
		if ( $title == '' ) $title = "第 {$i} 页";
		echo "<a class='page-numbers' href='", esc_html( get_pagenum_link( $i ) ), "' title='{$title}'>{$i}</a> ";
	}
}
// -- END ----------------------------------------

2010.6.13 Update: willin继续发力,结合我需要的功能把本来很mini变成更mini的代码,下面是最新的代码

/* Mini Pagenavi v1.0 by Willin Kan. */
if ( !function_exists('pagenavi') ) {
	function pagenavi( $p = 2 ) { // 取当前页前后各 2 页,根据需要改
		if ( is_singular() ) return; // 文章与插页不用
		global $wp_query, $paged;
		$max_page = $wp_query->max_num_pages;
		if ( $max_page == 1 ) return; // 只有一页不用
		if ( empty( $paged ) ) $paged = 1;
		echo '<span class="pages">Page: ' . $paged . ' of ' . $max_page . ' </span> '; // 显示页数
		if ( $paged > $p + 1 ) p_link( 1, '最前页' );
		if ( $paged > $p + 2 ) echo '... ';
		for( $i = $paged - $p; $i <= $paged + $p; $i++ ) { // 中间页
			if ( $i > 0 && $i <= $max_page ) $i == $paged ? print "<span class='page-numbers current'>{$i}</span> " : p_link( $i );
		}
		if ( $paged < $max_page - $p - 1 ) echo '... ';
		if ( $paged < $max_page - $p ) p_link( $max_page, '最后页' );
	}
	function p_link( $i, $title = '' ) {
		if ( $title == '' ) $title = "第 {$i} 页";
		echo "<a class='page-numbers' href='", esc_html( get_pagenum_link( $i ) ), "' title='{$title}'>{$i}</a> ";
	}
}
// -- END ----------------------------------------

我自个的css样式参考:(这个跟评论分页样式共用的,自己根据主题修改)

.page-numbers{line-height:16px;margin:0;padding:3px 5px;text-decoration:none;background:#fff;border-top:2px solid #fff;}
.page-numbers:hover{border-top:2px solid #ff00a4;}
.current,.current:hover{color:#fff;background:#45b9f6;border-top:2px solid #45b9f6;}
.current:hover{border-top:2px solid #00679d;}

2010.6.14 补充:忘了说明使用方法了

1. 把上面 2010.6.13 willin 修改过的代码放在 functions.php 里面,注意要放在 <?php ... ?> 里面

2. 在页面(index.php、home.php、archive.php等)的适当位置添加函数调用

<?php if (function_exists('pagenavi')) { pagenavi(); } ?>

3. 定义分页导航的 css 样式

如果你要添加“上一页”、“下一页”参考《为 Mini Pagenavi 添加“上一页”、“下一页”链接

折腾完,收工。

zww
or
oooo

“willin 出品的 Mini Pagenavi 修改版”有104条评论

  1. TTkea says:

    酱油众点点AD飘过~~

  2. 林木木 says:

    willin的要支持~

  3. 阿修 says:

    前5 :razz:
    改天加上

  4. 打酱油了·· :oops:
    俺不瞎折腾WP·· :grin:

  5. 苏扬 says:

    努力的学习当中 诶!

    1. zwwooooo says:

      @苏扬 慢慢折腾

  6. ckqee says:

    不用wp的路过,不过wp现在貌似很主流

    1. zwwooooo says:

      @ckqee 非常多人用

  7. mice says:

    这玩意 还是折腾插件好了..

    1. zwwooooo says:

      @mice 要简单就用插件

  8. mcooo says:

    Willin大师的简单多了!

  9. 猪八戒 says:

    最近也在学习代码,看看还是有点收获。

    1. zwwooooo says:

      @猪八戒 慢慢学慢慢折腾

  10. ifenwen says:

    折腾过了 也不知道用的谁的代码了

    1. zwwooooo says:

      @ifenwen 好像前段时间有好几个博主折腾过

  11. 万戈 says:

    果然比我的mini...

  12. 球犯 says:

    这个...真的太牛了。。

  13. 每天来学习一下,虽然还不是很懂

  14. zzzhu says:

    博主 评论翻页用什么插件呢

    1. zwwooooo says:

      @zzzhu 评论翻页?不用插件,wp本身就有,只是有些主题用的函数不同

  15. 超人 says:

    你这个图片效果代码在哪

    1. zwwooooo says:

      @超人 就是下拉才显示的效果?很多人写了,你去a-shun那看看

  16. Dianso says:

    我用的那个主题自带个pagenavi

    1. zwwooooo says:

      @Dianso 有些主题整合了

  17. fcola says:

    昨天就在他的网站上见到了

    1. zwwooooo says:

      @fcola 本来就是willin折腾出后我才根据自己需要修改的,呵呵

  18. A.shun says:

    这个好,比在wp-pagenavi里面弄出来的代码小多了

    1. zwwooooo says:

      @A.shun 对,所以我一直没加,昨天看到willin这段才有劲头加

  19. Jinwen says:

    记下来,下次直接用 :smile:

回复给 sridea ¬
取消回复

昵称 *

网址

B em del U Link Code Quote