Go to top Go to bottom

WordPressには様々な機能が用意されていますが、その中でも「投稿」の機能を用いて作成した記事をページに出力することは、もっとも重要な操作であるといえます。たとえば、トップページで記事の一覧を表示し、記事を選択したらその内容を表示する、といったことはよくあります。

この投稿を出力する一連の処理をWordPressループと呼びます。記事をたくさん出力する、1つ出力するにかかわらず、WordPressループを利用します。

用例
  • index.phpやcategory.phpなどのアーカイブページで記事一覧を表示する
  • single.phpなどの個別ページで記事を表示する
Codex

一般的なWordPressループ

よく使われるWordPressループは次のような形をしています。

<?php if ( have_posts() ) : ?>
  <?php while( have_posts() ) : the_post(); ?>
    各々の記事に関する処理
  <?php endwhile;?>
<?php else : ?>
  記事が1件も見つからなかったときの処理
<?php endif; ?>

最初のif ( have_posts() )で、記事が存在するかどうかを確認しています。have_posts()はクエリした結果記事を取得できたかどうかを判定する関数です。

次のwhile( have_posts() )で、投稿が存在する限り繰り返し処理を行っていきます。the_post()は記事をグローバル変数$postにセットし、次の記事へと進める処理を行う関数です。記事が複数ある場合でも、the_post()が実行されるたびに記事の数が減っていくため、やがてhave_posts()falseになり、while文を抜けるわけですね。

また、あまり起こりませんが、記事が見つからない、というケースも発生し得ます。そのようなときのために、記事が見つからなかった場合の処理も追加しておいた方がユーザフレンドリーでしょう。else文の後に、たとえば「お探しの記事は見つかりませんでした」などと出力します。

実践的なWordPressループの例

上で示したコードは概念でしたが、実際には記事のタイトルや内容、投稿日時などを表示することになると思います。そこで、以下に簡単なコードの例を示してみます。

<?php if ( have_posts() ) : ?>
  <?php while( have_posts() ) : the_post(); ?>
    <section class="post-item">
      <h2><?php the_title(); ?></h2>
      <p><?php the_content(); ?></p>
    </section>
  <?php endwhile;?>
<?php else : ?>
  <div class="error">
    <p>お探しの記事は見つかりませんでした。</p>
  </div>
<?php endif; ?>

HTMLとして機能するよう、タグも入れてみました。the_title()記事のタイトルを出力する関数the_content()記事の本文を出力する関数です。これをアーカイブ系のページで実行すると、例えば次のような出力を得ることができます(index.phpで試すのが簡単です)。

WordPressループサンプルの実行結果
WordPressループサンプルの実行結果

「続きを読む」タグが記事に挿入されていれば、the_content()は文章をそこで区切り、記事へのリンクを自動的に挿入してくれます。とても便利ですね。ただし、このタグが挿入されていない場合は、本文すべてが表示されます。

この、the_content()the_title()テンプレートタグと呼ばれる、WordPressに処理を実行、出力してもらうための関数で、他にも日付を表示するthe_date()やカテゴリ一覧を表示するthe_category()など、様々な種類が用意されています。このテンプレートタグのおかげで、テーマ作成者はありとあらゆる情報を簡単に出力することができます。

また、個別ページでこの処理を実行すると、該当記事を表示します。この場合は「続きを読む」リンクは表示されず、本文すべてが出力されます。

WordPressループの中でしか使えないテンプレートタグ

テンプレートタグの中には、WordPressループの中でしか使えない(厳密には$postが正しくセットされている状態でしか使えない)ものがあります。これは、関数名の先頭に”the”がついているかどうかで見分けることができます。theが頭についている場合はループ内でしか正しく機能しません。したがって、上述のthe_title()the_content()はループ内でしか使えないことになります。

WordPressループのPHP的な書き方

上の例ではコロン構文を用いてif文やwhile文を分割し、HTMLとの親和性を良くしていました。HTMLよりもプログラム的な処理がメインの場合は、コロン構文を使わなくても記述することができます。たとえば、上の例をコロン構文なしで書くと、次のようになります(いくつかタグを省略しています)。

<?php
  if ( have_posts() ) {
    while ( have_posts() ) {
      the_post();

      echo '<h2>';
      the_title();
      echo '</h2>';

      echo '<p>';
      the_content();
      echo '</p>';
    }
  } else {
    echo 'お探しの記事は見つかりませんでした。';
  }
?>

いちいちタグをechoするのはあまり美しくありませんが、このような書き方ができることを知っておいて損はありません。

あるいは、次のように途中でPHPモードを抜ける書き方もできます。

<?php
  if ( have_posts() ) {
    while ( have_posts() ) {
      the_post();
      ?>

      <section class="post-item">
        <h2><?php the_title(); ?></h2>
        <p><?php the_content(); ?></p>
      </section>

      <?php
    }
  } else {
    ?>
  
      <div class="error">
        <p>お探しの記事は見つかりませんでした。</p>
      </div>

    <?php
  }
?>

テンプレートファイルではコロン構文を使用することをおすすめしますが、少し発展的な処理を行う場合は、記述する内容がPHP主体か、あるいはHTML主体かによって使い分けるとよいでしょう。このような書き方は特にプラグインやウィジットを作成する際に役に立ちます。