WP-PageNaviを利用することで、「前へ、次へ」リンクではなく、ページ数を指定して飛べる、下の図のようなページナビを出すことができます。
ですが、投稿ではない別のテーブルの場合にはこれが使えないので、下記のようにしてみました。
また、作成にあたってはゆりこさんの、WP-PageNavi を使わずにナビゲーション表示をとても参考にさせてもらいました。ありがとうございます。
今回はマルチサイトを運用中に、全サイトからの最新投稿をストックしている別テーブルwp_site_posts
から、最新の記事を持ってくるページの場合です。
global $wpdb, $wp_rewrite; $posttype = 'post'; $totalPosts = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM " . $wpdb->base_prefix . "site_posts WHERE post_type = %s", $posttype)); $paged = (get_query_var( 'paged' )) ? get_query_var( 'paged' ) : 1 ; $ppp = get_query_var( 'posts_per_page' ); $paginate_base = get_pagenum_link(1); $paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') . user_trailingslashit('page/%#%/', 'paged');; $paginate_base .= '%_%'; $totalPages = ceil( $totalPosts/$ppp ); echo paginate_links( array( 'base' => $paginate_base, 'format' => $paginate_format, 'total' => $totalPages, 'mid_size' => 3, 'current' => ($paged ? $paged : 1), )); $start = ( $paged - 1 ) * $ppp; $query = $wpdb->prepare("SELECT * FROM " . $wpdb->base_prefix . "site_posts WHERE post_type = %s ORDER BY post_published_stamp DESC LIMIT %d, %d", $posttype, $start, $ppp); $tmp_posts = $wpdb->get_results( $query, ARRAY_A ); foreach ($tmp_posts as $tmp_post) { ?> <li><a href="<?php echo $tmp_post['post_permalink']; ?>"><?php echo $tmp_post['post_title']; ?></a></li> <?php }
ポイントは、最後のpaginate_links
という関数に5つの値を渡すところです。これらの値を何とかして自分で作ればよいわけです。
base
は、/page/2, /page/3
といった現在何ページ目にいるのかを示すスラッグを取り除いたベースに和る部分のことです。ゆりこさんのポストからそのまま持ってくるとちゃんと動きます。format
は、ページをどのように示すかで/page/数字
に設定しています。ゆりこさんのポストでは、デフォルトのパーマリンクや?を使ったURLの場合についてもケアされています。僕はそういう形を使わないのでパス。(記事の最後に注あり。)total
は、全部で何ページになるか=最後のページはいくつか、です。3行目で全ての記事の件数を取得して、5件目で1ページ毎にいくつの記事を表示するかを取得しているので、(全記事数/1ページ毎の記事数)を切り上げた数という風にしています。mid_size
は、現在のページの両サイドにいくつ分のページを表示するかの指定です。ページが多くなってきた時に使われます。current
は現在地。
実際の表示は、22行目のところで現在のページに対して最適な件数だけを取得して表示させています。
今回はSQLが関わっているところなのでちょっと時間がかかりました。また、こうした方が速いよ、負荷少ないよ、ということがありましたら教えて下さいm(__)m。
追記:FBで教えてもらいました。 @jim0912さん、いつもありがとうございます!
注:
formatの箇所に関して、ゆりこさんのコードでは、下記のようになっています。
if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) { $paginate_format = ''; $paginate_base = add_query_arg('paged', '%#%'); } else { $paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') . user_trailingslashit('page/%#%/', 'paged');; $paginate_base .= '%_%'; }
僕はページネーションをしつつ?を使ってパラメータも渡したいので今回はやっていないのですが、デフォルトのパーマリンクのままで、こういったことをやりたい場合には、上記の8,9,10行目をゆりこさんのものに置き換えて使ってください。
コメント