不用插件实现WordPress分页

制作WP主题要用到分页,下面是几种不用插件实现WordPress分页的方法:

将下面代码拷贝到functions.php文件中:

/* Mini Pagenavi v1.0 by Willin Kan. */
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>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 —————————————-

然后在使用分页的地方加上代码:

<?php pagenavi(); ?>

括號中的參數是前後頁數, 可不加參數.
例: pagenavi(3); 就是取當前頁前後各 3 頁 (不計最前頁、最後頁及當前頁), 最大總數為 9 頁. 若不足 3 頁, 有多少取多少.
pagenavi(); 默認值為 2, 所以不加參數就是前後各取 2 頁, 最大總數為 7 頁, 一般都夠.
為了配合 css, 也許還要加 div 來嵌入, 這要看你的模板怎麼寫.
另外, 為了防止主題已有 pagenavi() 函數, 可以加上 if ( !function_exists(‘pagenavi’) ) { … } 來避免沖突.
引用的時候也可先判斷函數是否已定義: if (function_exists(‘pagenavi’)) { pagenavi(); }

css 的部份是和評論翻頁 paginate_comments_links() 共用的, 可能你的模板已經有了, 沒有的話可參考我的:

在你的CSS样式表文件中添加:

.page-numbers {margin:10px 2px; padding:1px 8px; text-decoration:none; background:#878e87; color:#fff;}
.page-numbers:hover {background:#777e77; color:#bbc0bb;}
.current, .current:hover{cursor:default; background:#292e2b; color:#9ba09b; border:1px solid #292e2b;}

pagenavi() 是用在 home、archive、index 的翻頁,
評論翻頁是用 paginate_comments_links(),
文章翻頁是用 wp_link_pages(),
以上三個函數很相像, 請勿混淆.

後記: 不小心在 Mcooo Blog 發現了 Mini Pagenavi 老祖宗 — http://mcooo.com/google-page-for-wordpress.html, Mini Pagenavi 剛開始就是由這段代碼改寫而來, 現在已是繁衍好幾代了.

paginate_links()

另外一種方法, 是用 WordPress 自帶的 paginate_links() 函數: http://codex.wordpress.org/Function_Reference/paginate_links

<?php paginate_links( $args ) ?>

按照它那頁的例子, 我稍微修改了一下:

function pagenavi() {
global $wp_query, $wp_rewrite;
$wp_query->query_vars[‘paged’] > 1 ? $current = $wp_query->query_vars[‘paged’] : $current = 1;

$pagination = array(
‘base’ => @add_query_arg(‘paged’,’%#%’),
‘format’ => ”,
‘total’ => $wp_query->max_num_pages,
‘current’ => $current,
‘show_all’ => false,
‘type’ => ‘plain’,
‘prev_text’ => ‘« ‘,
‘next_text’ => ‘ »’
);

if( $wp_rewrite->using_permalinks() )
$pagination[‘base’] = user_trailingslashit( trailingslashit( remove_query_arg(‘s’,get_pagenum_link(1) ) ) . ‘page/%#%/’, ‘paged’);

if( !empty($wp_query->query_vars[‘s’]) )
$pagination[‘add_args’] = array(‘s’=>get_query_var(‘s’));

echo paginate_links($pagination);
}

喜歡用哪個就挑哪個, 速度和效果都差不多.

密技公開

最後, 還是把我這邊用的公開一下, 已經避開了 get_pagenum_link() 函數, 速度最快, 但只適用於默認的鏈接形式:

/* Mini Pagenavi v1.0+ by Willin Kan. */
function pagenavi( $p = 2 ) {
global $wp_query, $paged;
$max_page = $wp_query->max_num_pages;
if ( $max_page == 1 ) return;
if ( empty( $paged ) ) $paged = 1;
$request = $_SERVER[‘REQUEST_URI’];
$tmp = strpos($request, ‘paged’);
if ( $tmp ) $request = substr($request, 0, $tmp – 1);
echo “<div id=”pagenavi”>n”;
if ( $paged > $p + 1 ) p_link( 1, $request, ‘最前頁’ );
if ( $paged > $p + 2 ) echo ” <span class=’dots’> … </span>n”;
for( $i = $paged – $p; $i <= $paged + $p; $i++ ) {
if ( $i > 0 && $i <= $max_page ) $i == $paged ? print ” <span class=’page-numbers current’>{$i}</span>n” : p_link( $i, $request );
}
if ( $paged < $max_page – $p – 1 ) echo ” <span class=’dots’> … </span>n”;
if ( $paged < $max_page – $p ) p_link( $max_page, $request, ‘最後頁’ );
echo “</div>n”;
}
function p_link( $i, $request, $title = ” ) {
if ( $title == ” ) $title = “第 {$i} 頁”;
$request = ( $i == 1 ) ? $request : ( strpos($request, ‘?’) ? “{$request}&amp;paged={$i}” : “?paged={$i}” );
echo “<a class=’page-numbers’ href='{$request}’ title='{$title}’>{$i}</a> “; // 用 $request 取代 get_pagenum_link()
}
// — END —————————————-

有興趣的話, 可以將上面這段改成你所用的鏈接形式.

此文转自:http://kan.willin.org/?p=1323

思章老师

认准了方向,就要勇敢地走下去,十年磨一剑,我相信,只要坚持,一切都有可能。

相关日志

  1. 没有图片

    2010.05.26

    再挖WordPress3.0版新亮点

    WordPress 3.0 Beta 2正式…

  2. 没有图片

    2010.09.15

    好的教育

    好的教育应该是让你自由寻找那些有意义的事情,…

  3. 没有图片

    2010.05.07

    腾讯微博:世界感情之最

    世界最难断的是感情,最难求的是爱情,最难还的…

  4. 没有图片

    2010.05.30

    WordPress 3.0 RC1 正式发布

    小百度刚刚升级到WordPress 3.0 …

  5. 没有图片

    2011.01.25

    新年前的最后一篇日志,祝大家新年快乐!

    快过年了,菠萝也要拖家带口回老家过年了,本篇…

  6. 没有图片

    2011.03.02

    iPad2发布会将于3月3日凌晨开始,期待降价

    消息称,iPad2将于2011年月3日凌晨召…

评论

  1. Firm 2011.01.06 8:35下午

    刚好新搞了一个图片主题,没有分页来着。。