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 添加“上一页”、“下一页”链接》
折腾完,收工。
- 本文标题:willin 出品的 Mini Pagenavi 修改版
- 本文链接:https://zww.me/archives/25173
- 发布时间:2010年06月12日 15:30
- 版权声明:除非注明,文章均为 zwwooooo 原创,转载请以链接形式标明本文地址!
哈哈,你真是个折腾男啊!
@jalena 不折腾就会无聊+文囧
我还是用插件吧,现在都懒的折腾了~
@疾风 懒的话还是直接插件
我也用了这插件,很不错
@Timothy 这个不是插件。。。
不改wp的路过。
小白飘过~
其实很有很多概念不清楚……例如什么是jQuery……
Z叔叔教我怎么补补……
@Lazyyyyyy 直接在搜索引擎那打“什么是jQuery”
其实修改也就是修改点参数,应该没什么大问题。
@huangjun 我想也是
很棒的分享,又能减少一个插件的使用了。
@max 这个代码量比插件小多了,应该不错
这个很精致
在这个功能上使用插件就好了~
@集趣 折腾而已,简单就用插件
winllin果然是代码专家啊
@derek 很厉害的
哈哈, 我腦筋一時沒轉過來... 現在轉了, 新代碼又短了, 連你的狀況也通吃.
@willin 哈,非常好,我也更新一下
只对asp感兴趣!
@易读博客 不喜欢asp
抢个靠前点的。
代码如诗啊。短小精悍。收下了。
@小毅 willin很厉害,在看到我修改的累赘的代码后立即操刀解决
很好很强大~!
@心情签名 willin可是低调大师
楼主的每篇文章都很专业
@樊文生 只是把人家的代码修改一下而已。你才厉害吧,开发wepress,我等无法比,只是折腾主题的鸟
收下
安装成功.
新主题应用.
@阿邙 主题很漂亮,赞啊
技术贴,支持下
村长前来不明真相的围观~
@快乐的村长 看题目就知道了
我今天发现你的网站页面下面有两个黄色的小箭头,这个功能很有创意啊,不知道是怎么搞出来的。
@周先生 就是滚来滚去嘛,jQuery滚动效果