• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

ページネーション

提供: WordPress Codex 日本語版
移動先: 案内検索

この項目「ページネーション」は、翻訳チェック待ちの項目です。加筆、訂正などを通して、Codex ドキュメンテーションにご協力下さい。

WordPress は、投稿リストまたは個別投稿を「ページ」ナビゲーション向けの複数のページへ分割する機能を持っています。各ページに表示する投稿数は 表示設定/en画面(管理画面 > 設定 > 表示設定)でセットできます。テーマがカスタムクエリなどで上書きしなければ、WordPress によって「1ページに表示する最大投稿数」の値が使われます。テーマのテンプレートファイル内で複数の ループ がある場合、その中のメインループだけがページネーションできます。

プラグインによるページネーション

ほとんどのテーマが「前のページ」と「次のページ」リンクを持ち、古い投稿へ行ったり来たりできるでしょう。それとは違う、番号付きページネーションを使うにはプラグインを利用するのが簡単です。いくつかのテーマはそれ自身がページネーション用プラグインを持っています。利用できるプラグインとその一部のトラブルシュート方法については プラグインの章 を見てください。

関数リファレンス

複数投稿のページネーション
個別投稿のページネーション

ページネーションを含むループの例

この単純な例は メインループ のどの部分へ ページネーション関数 を入れるとよいかを示します。関数をループの直前または直後へ入れます。

<?php if ( have_posts() ) : ?>

<!-- ここへページネーション関数を入れる。 -->

<!-- メインループ開始。 -->
<?php while ( have_posts() ) : the_post();  ?>

<!-- テーマのメインループの残り部分。 -->

<?php endwhile; ?>
<!-- End of the main loop -->

<!-- ここへページネーション関数を入れる。 -->

<div class="nav-previous alignleft"><?php next_posts_link( '過去の投稿' ); ?></div>
<div class="nav-next alignright"><?php previous_posts_link( '新しい投稿' ); ?></div>

<?php else : ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

ループのクエリを WP_Query で行う場合は、この例 を見てください。

ページネーションの問題解決

ときどきページネーションが失敗して予期しない結果になったり、違うページへ移動したり、ページネーションされたページなのに 404(ページが見つかりません)が表示されたりするでしょう。これは普通、テーマが メインループ のクエリに誤った変更を加えた(誤った検索条件)ために起きます。

問題解決の基本ステップ

ページネーションを壊しているプラグインを排除するため、すべての プラグイン を停止します。これで解決すれば、問題のあるプラグイン(複数あるかもしれません)が見つかるまでプラグインをひとつずつ有効化します。ページネーション用にプラグインを使っているなら プラグインの章 を見てください。

パーマリンク設定/en画面(管理画面 > 設定 > パーマリンク設定)でパーマリンク構造を保存しなおすか、デフォルトの構造にセットして、解決するか試しましょう。

次の 問題解決の上級ステップ がちょっと技術的すぎたり、その内容でページネーションの問題が解決しなかったりしたら、フォーラム へ書き込んでください。そのとき:

  • 問題が再現するページへのリンクとテーマをダウンロードした場所を添えて。
  • 問題解決の試したステップとまだ試していないステップがわかるように。

さらに、こうするとボーナスポイントが!

  • フォーラムへようこそ/en を読みましょう。
  • キーワードやタグで他の人が書いた 解決策 を探しましょう。(訳注:英字だけで検索すると日本語フォーラム以外もヒットします。)
  • ページネーションがおかしいテンプレートファイルを特定して、pastebin/en へ貼り付け、リンクをフォーラムトピックへ入れましょう。

問題解決の上級ステップ

次のステップは、テーマ自身がループのクエリを実行していて、さらに複数投稿のページネーション関数のいずれかを使っている場合です。

この上級ステップはあなたが次のことについて基本的な理解を持っていることを想定しています:

重要! テーマを編集する前にテンプレートファイルの バックアップ/en をとり、子テーマ/en を作ってください。

ステップ 1. テンプレートファイルを特定する

まず知る必要があるのは、どのテンプレートファイルでページネーションが壊れているかです。テンプレート階層 を参考にすると使われている テンプレートファイル を見つけやすいでしょう。または プラグインを使ってファイルを確かめます。

ステップ 2. ページネーションされたメインループを見つける

前のステップで見つけたテンプレートファイルを開いてメインループを探します。メインループは(2 つ以上ループがあるときの見分け方は)複数投稿のページネーション関数のどれかが直前または直後にあるループです。もしそういう関数が見つからなければ、そのテーマはプラグインや他のページネーション手法を使っているかもしれません。

クエリに "paged" パラメーターを追加

メインループが query_postsWP_Query で変更されていて "paged" パラメーターがセットされていない場合、get_query_var() を利用してそれを追加する必要があります。このパラメーターで WordPress はどのページを表示するか正確に知ることができます。

例えばクエリが次のような場合("paged" パラメーターがない):

<?php query_posts('posts_per_page=3'); ?>

このようにパラメーターを追加します:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

query_posts('posts_per_page=3&paged=' . $paged); 
?>

次の例も同じですがパラメーターを配列形式で渡します:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
  'posts_per_page' => 3,
  'paged' => $paged
);

query_posts($args); 
?>

参考: query_posts()new WP_Query() への変数の渡し方

静的フロントページ

静的フロントページ のページネーションがおかしい場合、"paged" パラメータをこのように追加する必要があります:

<?php 
if ( get_query_var('paged') ) { $paged = get_query_var('paged'); }
elseif ( get_query_var('page') ) { $paged = get_query_var('page'); }
else { $paged = 1; }

query_posts('posts_per_page=3&paged=' . $paged); 
?>

メインループから query_posts を排除

query_posts() は WordPress が投稿を表示するデフォルトのクエリを変更するいちばん簡単な方法ですが、推奨されるものではなく効率が最高なわけでもありません。それどころか簡単にページネーションを壊してしまえます。もしテーマが query_posts() を使ってメインループを変更していたら、推奨される方法に置き換えることができます。それはアクション 'pre_get_posts' にフックして、is_main_query() を使ってメインクエリを変更するという方法です。これはメインループのクエリを投稿がデータベースから読み出されるより前に変更するので、query_posts() を使うよりも信頼できて高速です。この方法は ページテンプレート を除くすべてのテンプレートで使えます。ページテンプレートで WP_Query を使ったクエリの方法は、この用例を見てください。

例えば、あるテーマのホームページ(index.php)とカテゴリーページ(category.php)のメインループが次のようなクエリであり、ページネーションが動かなかったとしましょう:

<?php 
// ページ毎の投稿数を 3 にするクエリ
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array('posts_per_page' => 3, 'paged' => $paged );
query_posts($args); ?>
<!-- ここからメインループ -->
<?php if ( have_posts() ) : while (have_posts()) : the_post(); ?>
		<!-- ループの残り部分 -->
		<!-- タイトルや本文を表示するなど... -->
<?php endwhile; ?>
<!-- ページネーション -->
<?php next_posts_link(); ?>
<?php previous_posts_link(); ?>
<?php else : ?>
<!-- 投稿が見つからない -->
<?php endif; ?>

この例のテンプレートファイル(index.php、category.php)から query_posts の部分を削除します:

<?php 
// ページ毎の投稿数を 3 にするクエリ
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array('posts_per_page' => 3, 'paged' => $paged );
query_posts($args); ?>

そしてクエリをテーマの functions.php/en ファイルへ入れます:

function my_post_queries( $query ) {
  // 管理画面のクエリを変更せず、さらにメインクエリだけにする
  if ( ! is_admin() && $query->is_main_query() ) {

    // ホームとカテゴリーページのクエリを変更

    if ( is_home() ) {
      $query->set( 'posts_per_page', 3 );
    }

    if ( is_category() ) {
      $query->set( 'posts_per_page', 3 );
    }

  }
}
add_action( 'pre_get_posts', 'my_post_queries' );

このように条件分岐タグ(is_home()、is_category() など)を使えば、クエリを変更したいページを絞り込むことができます。では、"Movies" というスラッグのカテゴリーアーカイブで 1 ページに 6 つの投稿を表示したいとしましょう。それには次のコードを、上の例の my_post_queries() 関数へ追加してそのカテゴリーへ絞り込みます:

    // Movies カテゴリーページのクエリを変更
    if ( is_category( 'Movies' ) ) {
      $query->set( 'posts_per_page', 6 );
    }

pre_get_posts を使ったクエリについて、こちらもどうぞ:

プラグイン

たくさんのページネーション用プラグインが プラグイン ディレクトリ から選べます。番号付きページネーションが作れるプラグインでとても有名なのは wp-pagenaviwp-paginate の 2 つです。

プラグインの問題解決

ページネーション用プラグインを停止した後、WordPress のページネーション関数について問題解決を実施しましょう。それで動くようになったら、ふつうは、プラグインを有効にしても動くはずです。

wp-pagenavi の問題解決

これらはプラグイン作者の一人が用意してくれた手順です:

ページネーション: posts_nav_link(), next_posts_link(), previous_posts_link(), get_next_posts_link(), get_previous_posts_link(), paginate_links(), wp_link_pages(), next_post_link(), previous_post_link(), next_image_link(), previous_image_link(), the_posts_pagination(), get_the_posts_pagination()

最新英語版: WordPress Codex » Pagination最新版との差分