ページネーションの作り方
当サイトでのページネーションの作り方を備忘録として紹介します。
……ページネーション表示のように、簡単にページ表示記事も制御できるのかなぁ?
■前提
※WordPressを使用しています。
撮影録のアーカイブページのページネーションを例にします。
撮影録は、カスタム投稿で、投稿タイプは「photo」です。
■概略
大きく二つのことをしました。
1.1ページに表示する記事件数の制御
2.ページネーション表示
1.1ページに表示する記事件数の制御
以下の流れで実装することにしました。
(1) 現在ページを取得する(ない場合は1ページとする)
(2) 対象記事をデータベースから全件取得する
(3) 該当ページに表示する記事を制御する
(1) 現在ページ番号を取得する
現在ページ番号は、URLの最後に「?page=」で引き渡すことにしました。
そのため、「$_GET[‘page’]」で値を取得し、変数に格納します。
※引き渡しページ番号が存在しない場合、現在ページ番号は1(1ページ目)です。
$now_page = 1; // 現在ページ番号の初期値は1
if (isset($_GET['page'])) { // URLのページ設定部分を読み込み、存在する場合
$now_page = $_GET['page']; // 該当ページ番号を現在ページ番号に設定する
}
併せて、該当ページに表示する記事が、何記事目から何記事目までになるのか、あらかじめ取得しておきます。
$maxPost = 10; // 1ページに表示する記事の件数を10件と定義
$nPostFrom = ($nowPage-1) * $maxPost + 1; // 該当ページの表示最初の記事が何記事目にあたるか
$nPostTo = $nowPage * $maxPost; // 該当ページの表示最終の記事が何記事目にあたるか
(2) 表示記事をデータベースから取得する
カスタム投稿の記事なので、wp_postから、公開された記事で、post_typeがphotoのものだけを、公開日の降順で抽出します。
global $wpdb;
$query = "
SELECT * FROM $wpdb->posts // wp_postから、全項目を抽出
WHERE post_status='publish' // 公開された記事
AND post_type = 'photo' // かつ、post_type「photo」
ORDER BY post_date DESC // 公開日の降順に並べる
";
$rows = $wpdb->get_results( $query, ARRAY_A ); // 結果を$rowsに連想配列で格納する
(3) 該当ページに表示する記事を制御する
$i = 0; // カウントは0スタート
foreach ($rows as $row) { // 取得した結果を$rowとして1件ずつ処理する
$i = $i + 1; // カウントを1上げる
if ($i < $nPostFrom) { // カウントが表示対象最初の記事より前なら
continue; // 何もせず、次の$rowへ進む
}
$postID = $row['ID']; // 該当の$rowのIDをpostIDとして格納する
display_content($postID); // 該当postIDの記事を表示する(別途関数を用意)
if ($i >= $nPostTo) { // カウントが最終記事に達したら(もしくは超えたら)
break ; // foreachループ終了
}; // カウントが最終記事に達することがなければ、
}; // foreachの最後まで処理する
2.ページネーション表示
こちらは、「paginate_links()」で解決しました。
global $wp_query; // グローバル変数を使用
echo paginate_links(array( // paginate_linksに配列で引数を渡す
'mid_size' => 2, // 現在位置から前後それぞれ2ページ分、ページ番号を表示する
'format' => '?page=%#%', // URLの最後に「?page=」でページ番号を渡す
'prev_next' => true, // 前へと次へを表示する
'prev_text' => '前へ', // 前へは「前へ」と表示する
'next_text' => '次へ', // 次へは「次へ」と表示する
'current' => $nowPage, // 現在ページは「1(1)」で取得した現在ページ番号
'total' => $wp_query -> max_num_pages, // 最終ページのページ番号を取得する
));
ここで、「’format’ => ‘?page=%#%’format’ => ‘?page=%#%’」を設定していることにより、「1(1)」でページ番号を取得できるようになります。
■補足
「1(1)」で「1ページに表示する記事の件数を定義」しましたが、「2」の「ページネーション」が表示される条件は、WordPressの設定>表示設定>1ページに表示する最大投稿数 で設定された値を超えた場合のようです。そのため、両値は一致させる必要があります。
一致させないと、
・1ページに表示する件数を超えているのに、ページネーションが表示されない
・1ページを超えない記事件数なのに、ページネーションが表示される
ということが発生します。
ページごとに表示件数を変えたい……という場合について記載したサイトもありましたので、必要があれば、探してみてください。