【WordPress】 paginate_links関数を用いたページネーションの実装方法

こんにちは。今日も学習した内容をアウトプットということで、タイトル通り

 paginate_links関数を用いたページネーションの実装方法
について忘備録がてらまとめていきたいと思います。ページネーションを実装するにはプラグインを使うこともできるみたいですが、複雑な仕様でもないし、シンプルなデザインで作りたかったので自分で実装できないかと色々とググっていたところ、上記の関数を使えば作れるよーというブログ記事を発見。ありがとうございます。ほぼ丸パクリみたいになってしまいましたが、一応自分なりに落とし込んで作成しました。
 という訳で、今日は実装するにあたって学んだことをまとめていきたいと思いますので、同様のことでお悩みの方がいらっしゃれば、この記事も何かしらヒントになるのではないかと思います。わかりにくい表現があるかもしれませんが、その点については予めご了承ください。それでは参りましょう。
 何はともあれ、まずは結論。これでページネーションを実装できました。
 <? php
 $args = array(
 ’post_type’=>’news’, //カスタム投稿タイプ名
 ’posts_per_page’=>10, // 表示件数
 ’paged’=>get_query_var(‘paged’) //サブループを用いた場合に必要な記述
 );
 ?>
 <?php
 $big = 9999999999;  //後の置き換え処理のためにありえない大きな数を指定しておく
 $arg = array(
 ’base’=>str_replace($big, ‘%#%’, esc_url(get_pagenum_link($big))),  //$bigを%#%に置き換え
 ’current’=>max(1, get_query_var(‘paged’)),
 ’total’=> $myposts->max_num_pages
 );
 echo paginate_links($arg);
 ?>
 これで一応望んでいたページネーションを実装することができました。それぞれのコードについて自分で説明できる範囲で書いていきます。その前に原典にあたった結果を簡単にまとめると、
コーデックスによる説明
 「アーカイブされた投稿ページのページ番号付きのリンクを取得します。この関数は任意のページへ飛ぶためのページ番号つきリンクを生成できます」
と書いてあります。
使い方は
 <?php echo paginate_links($args); ?>
ということで、「取得」する関数から「表示」するためにechoしなきゃいけないのは前回と同じでした。ただ、こいつはパラメータで持っている引数が結構多い。「args」と書いてある通り配列で持ってます。でも、実際の使用場面においてお世話になるパラメータは限られているみたい。
 今回使用したパラメータは、
  • base(ページ番号つきのリンクを生成するために使われるベースのURLを指定)
  • current(現在のページ番号(初期値は0))
  • total(全体のページ数(初期値は1))
の3つです。
 次は、実際のコードの中身に可能な限り触れていきます。
baseの記述

ひとまず、ベースとなるURLを指定する必要があるということで、パラメータを使います。ここで行っている処理は、

①esc_url関数というWordPressの関数を用いることで、セキュリティ的に向上されるらしい

②get_pagenum_link関数というこれまたWordPressの関数を用いて、引数(今回は$big)で与えられたページ番号のリンクを返す

③str_replace関数はPHPで出てくる関数で、第一引数(今回は$big)を第二引数(今回は%#%)で置き換えるもので、第三引数(今回はesc_url(get_pagenum_link($big)))が置き換えの検索範囲になる

まあ、そんな感じらしい。

 

currentの記述

現在のページ番号を指定するが、get_query_var関数によって指定したクエリデータを取得できるみたいだけども、pagedが「0」だった場合、今回お世話になる「paginate_links」が動かなくなる?ことから、そのような事態を避けるためにmax関数を使うことで、「1」以上の数字が返るようにしているみたい。「みたい」を多用している。。。理解がまだまだ甘いです。とりあえず、この記述をしておくことで、おかしな挙動をする事態からは避けられるということ。

 

totalの記述

全体のページ数を指定。要はページネーションの数ということで、これはWP_Queryの$max_num_pagesを引っ張ってこれば良いということですが、、、

$max_num_pages = ページの合計数。$found_postsを$posts_per_pageで割った結果

とコーデックスにも記載されているので、そういうことですね。超ざっくりですが、今はこれくらいの理解でOKと自分に言い聞かせるスタイル。

これで一応出力はできました。なお、出力はaタグで出てきます。が、これをリストで出したい場合は、パラメータの「type」を「’type’ => ‘list’」にするとliタグで取れるらしいです。自分はaタグでスタイルは整えました。

 

「'paged'=>get_query_var('paged') //サブループを用いた場合に必要な記述」の意味

これは、WP_Queryのサブループを使って値を取得した場合には必要で、メインループで値を取得する場合にはこの記載はなくても問題ないそうです。サブループを用いたが故に「paged」に本来与えられているはずの値が入っていない事態に陥ることから、だそうですが、、、詳しい理由は下記のブログにお任せします。自分もしっかり理解して説明できるようになりたい。。。頑張らないと。

ざっくりとこんな感じで。自分用の忘備録なので説明不足も甚だしいですが、アウトプットすることに大きな意味があるからOK。明日もアウトプットできるだけのインプットします。

以上!おしまい。