Shaqna's photo site

ページネーションの作り方


当サイトでのページネーションの作り方を備忘録として紹介します。
……ページネーション表示のように、簡単にページ表示記事も制御できるのかなぁ?


■前提

※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ページを超えない記事件数なのに、ページネーションが表示される
ということが発生します。

ページごとに表示件数を変えたい……という場合について記載したサイトもありましたので、必要があれば、探してみてください。




TOP