WordPress ページネーションの作成(paginate_links)
さあ今回は久しぶりのPHP
WordPressでの記事ページで記事数が多くなってきたので
ページ送りを作成する関数を使用して
ページネーションを作ろうと思います
実際に出来たコードはこちら
<div class="page_links">
<?php
global $wp_query;
$big = 9999999999;
$arg = array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages
);
echo paginate_links($arg);
?>
</div>
こちらのコードは
WordPressの関数で定義されていて
paginate_links($arg)というように配列をパラメータとして渡して上げることで機能します
では配列パラメータの解説に参ります
global $wp_query; $big = 9999999999;
$wp_query;はグローバル変数のインスタンス(コピーのようなもの)
を定義しております
$big変数はページの際限に使用するためありえない数を設定しておきます
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
‘base’ =>で、ページ番号付きのリンクを生成するために使われるベースの URL を指定します
PHPの関数でURLを置換して渡します
str_replace
( $検索文字列 , $置換後文字列 , $検索対象変数か$配列 [, int &$count ] )
esc_url( get_pagenum_link( $big )にて全てのページ番号を取得します。
%#%’ のように書けば ‘%#%’ の部分がページ番号に置き換わります。
str_replace関数
さてstr_replace
関数ですが、今までのことを踏まえると、「ページ番号のリンクの$big
に該当する場所を'%#%'
で置き換える」という処理をしています。
なんで999999999
なんて変な数字をつかっている理由は、ありえない数字であればURL内のどこにもかぶることがないから、置換の間違いがなくなるためです。
短い数字とかアルファベット(そもそもget_pagenum_linkはアルファベットを引数にできない)だとURLにそれが含まれていた場合、そこがリプレイスされて欲しいURLが得られないことになりかねません。
'current' => max( 1, get_query_var('paged') ),
‘current’は現在のページ番号を設定します。
PHP関数max()を使用して最大の数値を取得しています
get_query_var()はWordPress関数で現在のクエリ情報から指定したキーでいろいろな値を取得してきます、
使い方は簡単で、get_query_var(取得するキー , 値がない場合に返す値)となります。
現在のページ順の情報を‘paged’で取得してきているわけですね、
しかし現在のページ番号は0が返ってくるためここでは「1」を代入しています。
現在ページが0
になってしまうとpaginate_links
の挙動がおかしくなります。そのためにmax
関数を使って、1
以上の値を出す様にしています。
max
関数は与えられた数値(配列)の中で一番大きな数字を返します。その為、paged
が0
の場合は予め設定していた1
が返ることになります。
もちろんif
で条件分岐できますが、max
関数で要件を満たしているので大丈夫です。
こういった処理でcurrent
には1
以上の現在ページ番号が入ることになります。
'total' => $wp_query->max_num_pages
‘total’は全体のページ数を設定します。
ここで先程インスタンス化したグローバル変数$wp_queryから
max_num_pagesで現在のクエリ(表示するリクエスト)の中から最大ページ数を取得することが出来ます。
これでページネーション自体は表示させることが出来ます。
ちなみにnew WP_Query でループのクエリを作成している場合、’total’ パラメーターにWP_Queryオブジェクトの max_num_pages プロパティを設定してください。とのことでつまりは、
ループを生成する際に書き変数を定義してループのパラメーターとして渡す必要があります
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;//(現在のページが変な値にならないようにするためのもの)
そして最大ページ数の設定をこう書きます
absint( get_query_var( ‘paged’ )こちらの関数にて、
数値であっても文字列であっても絶対の数値に変換される関数であるため
3項演算となってget_query_varの数値か絶対値か「1」かの記述になります
最終的に現在のページ番号を絶対の数値にします。
それを$wp_queryの配列のパラメータとして設定しておきます
'paged' => $paged,
そしてそれをパラメータとして設定した$the_queryから最大ページ数を取得することでうまく設定できると思います。
'total' => $the_query->max_num_pages
これで一応の完成ですがまだまだ他のパラメーターも設定できるので簡単に紹介します
'type' => 'list',//HTMLをリストで出力する。
'prev_next' => false,//リストの中に「次へ」「前へ」の文字を入れるかどうか。
'prev_text' => '前へ戻る',
'next_text' => '次のページへ',
'end_size' => 1,//ページ番号のリストの両端(最初と最後)にいくつの数字を表示するか。
'mid_size' => 2// 現在のページの両側にいくつの数字を表示するか。ただし現在のページは含みません
後はこちらのページネーションをCSSで整えていきましょう。
コメントをお待ちしております