WordPressのページネーション
はじめに書いたコードが以下である。このコードはトップページ(front-page.php)または、カテゴリー(category.php)上では正常に動作するが、固定ページではページング処理ができなかった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $arg = array( 'posts_per_page' => 10, // 表示する件数 'orderby' => 'modified', // 更新日でソート 'order' => 'DESC', // DESCで最新から表示、ASCで最古から表示 'category_name' => 'hoge', // 特定のカテゴリースラッグを指定 'paged' => $paged, // ページ設定 ); $posts = get_posts($arg); if ($posts) : foreach ($posts as $post) : setup_postdata($post); ?> // ここに投稿記事を表示する処理をかく <p><?php the_content(); ?></p> <?php endforeach; endif; wp_reset_postdata(); ?> <?php /* 以下、ページャーの表示 */ if (function_exists('pagination')) : pagination($wp_query->max_num_pages, get_query_var('paged')); endif; ?> |
動作させるには上記コードのほかにページャーを生成する関数をfunctions.phpに定義しなければいけない。
ページャー用コードは下記サイトのものを使わせてもらった。

WordPressでページャー(ページネーション)をプラグインなしで実装 | WEMO
WordPressでページャーを表示する時はこれまで「WP-PageNavi」というプラグインに頼っていたのですが、そろそろコード直書きで実装してみることにしてみました。ググればほぼ同じ内容のコードがたくさん出てきたのですが、そのコードだとエラーが出たりしてちょっと気に食わなかったので、自分なりにカスタマイズしてみまし...
1 2 3 4 5 6 7 8 9 10 11 |
/** * ページネーション出力関数 * $paged : 現在のページ * $pages : 全ページ数 * $range : 左右に何ページ表示するか * $show_only : 1ページしかない時に表示するかどうか */ public static function pagination( $pages, $paged, $range = 2, $show_only = false ) { // 中身は参照URLからコピーしてね } |
固定ページでページネーション
さて、冒頭のコードでは固定ページでページネーションできない理由はというと、「固定ページでページネーションする場合、ループ処理はget_posts()ではなく、WP_Query()を使って、max_num_pagesを取得しなければいけない」からだ。
なので、以下のように修正すれば固定ページでもページネーションできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $arg = array( 'posts_per_page' => 10, // 表示する件数 'orderby' => 'modified', // 更新日でソート 'order' => 'DESC', // DESCで最新から表示、ASCで最古から表示 'category_name' => 'hoge', // 特定のカテゴリースラッグを指定 'paged' => $paged, // ページ設定 ); $query = new WP_Query($arg); // max_num_pagesを取得 $MaxNumPages = $query->max_num_pages; if ($query->have_posts()) : while ($query->have_posts()) { $query->the_post(); ?> // ここに投稿記事を表示する処理をかく <p><?php the_content(); ?></p> <?php } endif; wp_reset_postdata(); ?> <?php /* 以下、ページャーの表示 */ if (function_exists('pagination')) : pagination($MaxNumPages, get_query_var('paged')); endif; ?> |
ちなみに、WP_Queryがクラスなのでwhile文を使ったループに書き換えてあるが、下記のように$query->postsの中身を配列として扱えばforeach文でも同じ処理がかける。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php if ($query->have_posts()) : foreach ($query->posts as $post) : setup_postdata($post); ?> // ここに投稿記事を表示する処理をかく <p><?php the_content(); ?></p> <?php endforeach; endif; wp_reset_postdata(); ?> |
コメント