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

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

The Loop in Action

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

ページ名検討中: このページ名「The Loop in Action」について改名が提案されています。ご意見をお寄せください。

はじめに

ループ」は WordPress のメイン処理を参照する用語です。訪問者に WordPress の投稿を表示するためにテンプレートの中で使います。ループなしでもテンプレートを作れますが、1つの投稿からデータを表示することしかできません。

WordPress はまず最初に必要なファイルがすべて揃っているか確認します。次にデータベースからブログ管理者によって定義されたデフォルト設定を取得します。これには1ページに表示する投稿数や、コメント機能が使用可能かどうかなどが含まれます。これらのデフォルト設定が揃ったら、 WordPress はユーザが何を必要としているのかを確認します。この情報はどの投稿をデータベースから取得するか決めるために使われます。

ユーザが特定の投稿、カテゴリ、ページ、日付を指定しなかったとき、 WordPress は前回取得したデフォルト値をどの投稿か決めるために使用します。例えば、ブログ管理者が [[Administration > Settings > Reading]] で1ページあたりの投稿表示数を「5」に設定した場合、 WordPress は最新 5 件の投稿をデータベースから取得します。ユーザが特定の投稿、カテゴリ、ページ、日付を指定したとき、 WordPress はどの投稿をデータベースから取得するのか決定するためにそれらの情報を使います。

以上のすべての処理がおわったら WordPress はデータベースに接続し、指定された情報を読み込み、結果を変数に保存します。これが変数にアクセスしてテンプレート内でのデータ表示に使うループです。

通常、訪問者は特定の投稿、カテゴリ、ページ、日付を選択していないため、WordPress はすべてを表示するために index.php を使います。この文書の前半では index.php におけるデフォルト表示にのみ焦点を当て、どのように動くのか理解したら、それ以降は他のテンプレートファイルでループを使用する方法などについて詳細に説明します。

もっとも単純なインデックスページ

下記のコードはシンプルではありますが、一通り機能するインデックスページです。各投稿のコンテンツ (本当に本文だけ) をループの状態に応じて表示します。これをお見せしたのはループを機能させるのに必要なものがどれだけ少ないかを示すためです。index.php の大半はループの内容を装飾するための CSS、HTML、PHP 宣言と言えます。

<?php
get_header();
if (have_posts()) :
   while (have_posts()) :
      the_post();
      the_content();
   endwhile;
endif;
get_sidebar();
get_footer(); 
?>

それではその装飾の部分を見ていきましょう。

デフォルトループ

以下では WordPress 1.5 に同梱されていた defaultclassic テーマを例に、1つずつループの使い方を見ていきます。

ループのはじまり

デフォルトの index.php テンプレートファイルのはじめの方にあるのがループを開始するコードです。

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
  1. はじめに have_posts() 関数を使って1つでも投稿が読み込まれたかどうかを確認します
  2. 投稿があった場合、 PHP の _"while" ループが開始され、カッコ内の条件が真である限り実行されます。したがって、 have_posts() 関数が真を返す限り、「ループ」がまわりつづけます。
  3. have_posts() 関数は単純に投稿リストの次の投稿を確認します。もしまだあれば真を返しますし、それ以上次がなければ偽を返します。

投稿の生成

the_post() 関数は投稿リストの中の現在の投稿を取得し、それをループの繰り返しの内部で使えるようにします。 the_post() 関数がないとテーマで使用されているほとんどのテンプレートタグは正しく機能しません。

投稿データが利用できる状態になれば、テンプレートは投稿データを訪問者に表示しはじめることができます。

タイトル、日付、著者

以下のテンプレートタグは現在の投稿タイトルを取得します。投稿日時や誰による投稿なのか (著者名) についても同様です。

<h2 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
<?php the_title(); ?></a></h2>
<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>

本文

the_content() テンプレートタグは投稿の内容を表示します。これはループの各繰り返しにおける重要な部分です。

<div class="entry">
<?php the_content('Read the rest of this entry »'); ?>
</div>

もしクイックタグボタンの more (<!--more--> として記述される) が本文に含まれていた場合、閲覧者にはその行より上の部分のみが表示されます。そのためトップページに各投稿の最初の1文または2文のみを表示させたいときは、単純に <!--more--> を各投稿の最初の1文の直後に入れればよいわけです。

1つの投稿を表示しているときは <!--more--> の区切りは無視されます。よってすべての投稿に <!--more--> を置くことは、全文を読みたい訪問者に個別の投稿ページへのアクセスを強制させます。

メタデータ

index.php テンプレートファイルにおける各投稿の下は投稿のより詳細な情報を表示する場所で、具体的にはカテゴリ、投稿日時、コメント情報などがあります。投稿メタデータセクションとしても知られていますが、権限を持つログイン済みユーザ (または投稿者) の場合、edit_post_link() テンプレートタグ関数によって「編集する」というリンクが表示されます。

<p class="postmetadata">
Posted in <?php the_category(', ') ?> 
<strong>|</strong>
<?php edit_post_link('Edit','','<strong>|</strong>'); ?>  
<?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>

コメント機能が使用可能になっているか、もしくは投稿にコメントが付いている場合、comments_popup_link() テンプレートタグはコメントへのリンクを表示します。コメントポップアップウィンドウを使っている場合はクリックすることでコメントウィンドウが開きますが、そうでない場合はこの投稿のコメントに飛びます。If the visitor is viewing an index of posts (i.e.: more than one post in The Loop), the comments_popup_link() link will take the reader to this post's individual page.

トラックバックの自動検出

trackback_rdf テンプレートタグの関数はトラックバックの自動検出に使用される機械可読コードを出力します。

<!--
<?php trackback_rdf(); ?>
-->

Note: The trackback_rdf() tag is supposed to be used with comments around it. It is not "turned off".

ループのおわり

下記のコードはループを終了させます。これ以降のコードでは様々な投稿データに関連したテンプレートタグが期待通り機能しません (またはループの最後の投稿データが使用されます)。これはテンプレートタグをループ内で使いたいときは、常にこの行より前にそれらのコードを置く必要があることを意味しています。

<?php endwhile; ?>

このセクションはループが終わるとすぐにページ間を前後に移動するためのナビゲーションコントロールを表示します。

<div class="navigation">
<div class="alignleft"><?php posts_nav_link('','','« Previous Entries') ?></div>
<div class="alignright"><?php posts_nav_link('','Next Entries »','') ?></div>
</div>

ブログが1ページあたり10件の投稿をを表示するように設定されていて、ループが全部で25件の投稿を保持している場合、10件のページが2ページと、5件のページが1ページの合わせて3ページ、移動可能なページが存在します。ナビゲーションリンクは訪問者が各ページ間を前後に移動できるようにします。

ナビゲーションコントロールはループの外側にありますが、それらは何らかの投稿がある場合にのみ表示するため、if 条件文の内側に含まれます。The navigation functions themselves also check whether or not there is anything to which they will link, based on the current Loop, and only display links if there's something to link.

<?php else : ?>
 <h2 class="center">Not Found</h2>
 <p class="center">
<?php _e("Sorry, but you are looking for something that isn't here."); ?></p>

else 節には最初の have_posts() が偽のときに実行されるコードが書かれています。つまりこの else 以降の部分は投稿が1件もないときにのみ実行・表示されます。例えば訪問者が投稿が1つもない日付を指定したリクエストや検索をするとこれが表示されます。

<?php endif; ?>

このコードによって条件分岐「もし投稿があるときはこれ、そうでないときはそれ」が終わり、デフォルトの index.php テンプレートは次のサイドバーを読み込み、最後にフッタに到達します。

他テンプレート内でのループ

その他のループテクニック

まとめ

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