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

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

「The Loop in Action」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(en:The Loop in Action 09:32, 10 April 2018 Ggueli 版をマージ(未訳)。)
 
1行目: 1行目:
 +
{{NeedTrans}}
 +
 
{{Rename|T}}
 
{{Rename|T}}
 
__TOC__
 
__TOC__
  
== はじめに ==
+
== はじめに<span id="Introduction"></span> ==
  
 
「[[The_Loop|ループ]]」は WordPress のメイン処理を参照する用語です。訪問者に WordPress の投稿を表示するために[[テンプレート]]の中で使います。ループなしでもテンプレートを作れますが、1つの投稿からデータを表示することしかできません。
 
「[[The_Loop|ループ]]」は WordPress のメイン処理を参照する用語です。訪問者に WordPress の投稿を表示するために[[テンプレート]]の中で使います。ループなしでもテンプレートを作れますが、1つの投稿からデータを表示することしかできません。
  
WordPress はまず最初に必要なファイルがすべて揃っているか確認します。次にデータベースから[[ユーザーの種類と権限#Summary_of_Roles|ブログ管理者]]によって定義されたデフォルト設定を取得します。これには1ページに表示する投稿数や、コメント機能が使用可能かどうかなどが含まれます。これらのデフォルト設定が揃ったら、 WordPress はユーザが何を必要としているのかを確認します。この情報はどの投稿をデータベースから取得するか決めるために使われます。
+
WordPress は最初に、必要なファイルがすべて揃っているか確認します。次にデータベースから[[ユーザーの種類と権限#Summary_of_Roles|ブログ管理者]]によって定義されたデフォルト設定を取得します。これには1ページに表示する投稿数や、コメント機能が使用可能かどうかなどが含まれます。これらのデフォルト設定が揃ったら、WordPress はユーザが何を必要としているのかを確認します。この情報はどの投稿をデータベースから取得するか決めるために使われます。
  
ユーザが特定の投稿、カテゴリ、ページ、日付を指定しなかったとき、 WordPress は前回取得したデフォルト値をどの投稿か決めるために使用します。例えば、ブログ管理者が [[Administration > Settings > Reading]] で1ページあたりの投稿表示数を「5」に設定した場合、 WordPress は最新 5 件の投稿をデータベースから取得します。ユーザが特定の投稿、カテゴリ、ページ、日付を指定したとき、 WordPress はどの投稿をデータベースから取得するのか決定するためにそれらの情報を使います。
+
ユーザが投稿、カテゴリ、ページ、日付を特に指定しなかったとき、WordPress はどの投稿かを決めるために先ほど取得したデフォルト値を使います。例えば、ブログ管理者が [[管理画面/表示設定]] で1ページに表示する最大投稿数を5に設定していた場合、 WordPress は最新 5 件の投稿をデータベースから取得します。ユーザが特定の投稿、カテゴリ、ページ、日付を指定したときは、WordPress はどの''投稿''(複数の場合もあります)をデータベースから取得するのか決めるためにその情報を使います。
  
以上のすべての処理がおわったら WordPress はデータベースに接続し、指定された情報を読み込み、結果を変数に保存します。これが変数にアクセスしてテンプレート内でのデータ表示に使うループです。
+
以上の処理がすべて終わったら WordPress はデータベースに接続し、指定された情報を読み込み、結果を変数に保存します。そしてループはテンプレート内で表示するためにこの変数の値を使います。
  
通常、訪問者は特定の投稿、カテゴリ、ページ、日付を選択していないため、WordPress はすべてを表示するために <tt>index.php</tt> を使います。この文書の前半では <tt>index.php</tt> におけるデフォルト表示にのみ焦点を当て、どのように動くのか理解したら、それ以降は他のテンプレートファイルでループを使用する方法などについて詳細に説明します。
+
デフォルトでは、訪問者が投稿、カテゴリ、ページ、日付を特に指定しなければ、WordPress はすべてを表示するために <tt>index.php</tt> を使います。この文書の前半では <tt>index.php</tt> およびデフォルトのブログ表示にのみ焦点を当てます。そして、どのように動くのか理解した後、他のテンプレートファイルでループを使用する方法などについて詳細に説明します。
  
== もっとも単純なインデックスページ ==
+
== もっとも単純なインデックスページ<span id="The_World.27s_Simplest_Index_Page"></span> ==
  
下記のコードはシンプルではありますが、一通り機能するインデックスページです。各投稿のコンテンツ (本当に本文だけ) をループの状態に応じて表示します。これをお見せしたのはループを機能させるのに必要なものがどれだけ少ないかを示すためです。<tt>index.php</tt> の大半はループの内容を装飾するための CSS、HTML、PHP 宣言と言えます。
+
下記のコードはシンプルではありますが、一通り機能するインデックスページです。各投稿のコンテンツ (本当に本文だけ) をループの状態に応じて表示します。これをお見せしたのはループを機能させるのに必要なものがどれだけ少ないかを示すためです。
  
 
<pre>
 
<pre>
32行目: 34行目:
 
</pre>
 
</pre>
  
それではその装飾の部分を見ていきましょう。
+
<tt>index.php</tt> の大半はループの内容を装飾するための CSS、HTML、PHP 宣言と言えます。それではその装飾の部分を見ていきましょう。
  
== デフォルトループ ==
+
== デフォルトループ<span id="The_Default_Loop"></span> ==
  
 
以下では WordPress 1.5 に同梱されていた <tt>default</tt> と <tt>classic</tt> テーマを例に、1つずつループの使い方を見ていきます。
 
以下では WordPress 1.5 に同梱されていた <tt>default</tt> と <tt>classic</tt> テーマを例に、1つずつループの使い方を見ていきます。
  
=== ループのはじまり ===
+
=== ループのはじまり<span id="Begin_The_Loop"></span> ===
  
デフォルトの <tt>index.php</tt> テンプレートファイルのはじめの方にあるのが[[The_Loop|ループ]]を開始するコードです。
+
デフォルトの <tt>index.php</tt> テンプレートファイルの始めの方に、[[The_Loop|ループ]]を開始するコードがあります。
  
 
<pre>
 
<pre>
47行目: 49行目:
 
</pre>
 
</pre>
  
# はじめに have_posts() 関数を使って1つでも投稿が読み込まれたかどうかを確認します
+
# はじめに have_posts() 関数を使って1つでも投稿が読み込まれたかどうかを確認します。
# 投稿があった場合、 PHP _"while" ループが開始され、カッコ内の条件が真である限り実行されます。したがって、 have_posts() 関数が真を返す限り、「ループ」がまわりつづけます。
+
# 投稿があった場合、PHP <tt>[http://www.php.net/while while]</tt> ループが始まり、カッコ内の条件が真である限り実行されます。従って have_posts() 関数が真を返す限り、<tt>while</tt> ループは回り続けます(繰り返します)
# have_posts() 関数は単純に投稿リストの次の投稿を確認します。もしまだあれば真を返しますし、それ以上次がなければ偽を返します。
+
  
=== 投稿の生成 ===
+
<tt>have_posts()</tt> 関数は単純に投稿リストの次の投稿を確認します。もしまだあれば真を返しますし、それ以上次がなければ偽を返します。
 +
Internally, this is based on a posts counter, which is compared to the total number of posts in the collection. The <tt>the_post()</tt> function then retrieves that next post and updates the internal posts counter. At the next evaluation of <tt>have_posts()</tt> in the <tt>while</tt> clause, if another item is present, the <tt>while</tt> loop body is executed again for the next post. When the posts collection is exhausted (the posts counter matches the total number of posts), the <tt>while</tt> loop ends and The Loop moves on to whatever instructions it has beyond the <tt>while</tt> statement, still within the <tt>if</tt> test. For example, the <tt>if</tt> might have an <tt>else</tt> clause with statements to be executed if the posts collection did not contain any data in the first place.
  
the_post() 関数は投稿リストの中の現在の投稿を取得し、それをループの繰り返しの内部で使えるようにします。 the_post() 関数がないとテーマで使用されているほとんどの[[テンプレートタグ]]は正しく機能しません。
+
=== 投稿の生成<span id="Generating_the_Post"></span> ===
  
投稿データが利用できる状態になれば、テンプレートは投稿データを訪問者に表示しはじめることができます。
+
<tt>the_post()</tt> 関数は投稿リストの中の現在の投稿を取得し、それをループの繰り返しの内部で使えるようにします。<tt>the_post()</tt> 関数がないと、テーマで使用されているほとんどの[[テンプレートタグ]]は正しく機能しません。
  
==== タイトル、日付、著者 ====
+
投稿データが利用できる状態になった後、テンプレートは投稿データを HTML に変換して訪問者に表示する処理を始めることができます。
  
以下の[[テンプレートタグ]]は現在の投稿タイトルを取得します。投稿日時や誰による投稿なのか (著者名) についても同様です。
+
==== タイトル、日付、著者<span id="Title.2C_Date_and_Author"></span> ====
 +
 
 +
次の[[テンプレートタグ]]は現在の投稿タイトル、投稿日時、誰による投稿なのか (著者名) を取得して表示します。
  
 
<pre>
 
<pre>
68行目: 72行目:
 
</pre>
 
</pre>
  
==== 本文 ====
+
==== 本文<span id="Post_Content"></span> ====
  
the_content() テンプレートタグは投稿の内容を表示します。これはループの各繰り返しにおける重要な部分です。
+
<tt>[[テンプレートタグ/the_content|the_content()]]</tt> テンプレートタグは投稿の内容を取得し、[[プラグイン_API/フィルターフック一覧|フィルター]]を適用した後に、表示します。これはループの各繰り返しにおける重要な部分です。
  
 
<pre>
 
<pre>
78行目: 82行目:
 
</pre>
 
</pre>
  
もし[[クイックタグ]]ボタンの '''more''' (<nowiki><!--more--></nowiki> として記述される) が本文に含まれていた場合、閲覧者にはその行より上の部分のみが表示されます。そのためトップページに各投稿の最初の1文または2文のみを表示させたいときは、単純に <nowiki><!--more--></nowiki> を各投稿の最初の1文の直後に入れればよいわけです。
+
<tt>the_content()</tt> の説明ページに示されているように、もし[[記事を投稿する#Visual_Versus_HTML_Editor|クイックタグ]]'''more''' (<nowiki><!--more--></nowiki> として記述される) が本文に含まれていた場合、閲覧者にはその行より上の部分のみが表示されます。そのためトップページに各投稿の最初の1文または2文のみを表示させたいときは、単純に <nowiki><!--more--></nowiki> を各投稿の最初の1文の直後に入れればよいわけです。
 +
The string passed to <tt>the_content()</tt> is used for the "Read More" link after the excerpt. For more about excerpts, the <tt>&lt;!--more--></tt> quicktag, and the "Read More" link see [[Template Tags/the_content]] and ''[[Customizing the Read More]]''.
  
1つの投稿を表示しているときは <nowiki><!--more--></nowiki> の区切りは無視されます。よってすべての投稿に <nowiki><!--more--></nowiki> を置くことは、全文を読みたい訪問者に個別の投稿ページへのアクセスを強制させます。
+
==== メタデータ<span id="Additional_Details"></span> ====
  
==== メタデータ ====
+
<tt>index.php</tt> テンプレートファイルにおいて、各投稿の下の部分は投稿のもっと細かな情報を表示する場所です。具体的にはカテゴリ、投稿日時、コメント情報などが表示され、[[投稿メタデータセクション]]としても知られています。充分な権限を持つログイン済みユーザ (または投稿者) の場合、[[テンプレートタグ/edit_post_link|edit_post_link()]] テンプレートタグ関数によって「編集する」というリンクが表示されます。
 
+
<tt>index.php</tt> テンプレートファイルにおける各投稿の下は投稿のより詳細な情報を表示する場所で、具体的にはカテゴリ、投稿日時、コメント情報などがあります。[[投稿メタデータセクション]]としても知られていますが、権限を持つログイン済みユーザ (または投稿者) の場合、[[テンプレートタグ/edit_post_link|edit_post_link()]] テンプレートタグ関数によって「編集する」というリンクが表示されます。
+
  
 
<pre>
 
<pre>
94行目: 97行目:
 
</pre>
 
</pre>
  
コメント機能が使用可能になっているか、もしくは投稿にコメントが付いている場合、[[テンプレートタグ/comments_popup_link|comments_popup_link()]] テンプレートタグはコメントへのリンクを表示します。[[コメントポップアップウィンドウ]]を使っている場合はクリックすることでコメントウィンドウが開きますが、そうでない場合はこの投稿のコメントに飛びます。またもし訪問者が投稿のリストを見ている場合(ループで複数の投稿を表示している場合)は、[[テンプレートタグ/comments_popup_link|comments_popup_link()]] テンプレートタグは訪問者を個別の投稿記事ページへ飛ばします。
+
コメント機能が使用可能になっているか、もしくは投稿にコメントが付いている場合、[[テンプレートタグ/comments_popup_link|comments_popup_link()]] テンプレートタグはコメントへのリンクを表示します。[[コメントポップアップウィンドウ]]を使っている場合はクリックすることでコメントウィンドウが開きますが、そうでない場合はこの投稿のコメントに飛びます。
 +
 
 +
またもし訪問者が投稿のリストを見ている場合(ループで複数の投稿を表示している場合)は、[[テンプレートタグ/comments_popup_link|comments_popup_link()]] テンプレートタグは訪問者を個別の投稿記事ページへ飛ばします。
  
==== トラックバックの自動検出<span id="Trackback Autodiscovery"></span> ====
+
==== トラックバックの自動検出<span id="Trackback_Auto-Discovery"></span> ====
  
[[テンプレートタグ/trackback_rdf|trackback_rdf]] テンプレートタグの関数は[[用語集#Trackback|トラックバック]]の自動検出に使用される機械可読コードを出力します。
+
<tt>[[テンプレートタグ/trackback_rdf|trackback_rdf]]</tt> テンプレートタグの働きにより、[[用語集#Trackback|トラックバック]]の自動検出に使用される機械可読コードを出力します。
  
 
<pre>
 
<pre>
106行目: 111行目:
 
</pre>
 
</pre>
  
Note: The trackback_rdf() tag is supposed to be used with comments around it. It is not "turned off".
+
'''Note:''' The <tt>trackback_rdf()</tt> tag is ''intentionally'' used within [[Commenting_Code|an HTML comment]]; it is not being "turned off". The reason for this is that, otherwise, RDF breaks validation in non-XML documents, and in XHTML documents it is parsed incorrectly by most browsers.
  
=== ループのおわり ===
+
=== ループの終わり<span id="Ending_The_Loop"></span> ===
  
下記のコードはループを終了させます。これ以降のコードでは様々な投稿データに関連したテンプレートタグが期待通り機能しません (またはループの最後の投稿データが使用されます)。これはテンプレートタグを'''ループ内で'''使いたいときは、常にこの行より前にそれらのコードを置く必要があることを意味しています。
+
次のコードはループを終了させます。これより後のコードでは、様々な投稿データに関連したテンプレートタグが期待通り機能しません (またはループの最後の投稿データが使用されます)。これはテンプレートタグを'''ループ内で'''使いたければ、この行より前にそのタグを置く必要があることを意味しています。
  
 
<pre>
 
<pre>
116行目: 121行目:
 
</pre>
 
</pre>
  
このセクションはループが終わるとすぐにページ間を前後に移動するためのナビゲーションコントロールを表示します。
+
次のセクションは、ループの終わりの直後にあります。これはページ間を前後に移動するためのナビゲーションコントロールを表示します。
 +
More information is available in function reference for [[Function_Reference/posts_nav_link|posts_nav_link()]].
  
 
<pre>
 
<pre>
127行目: 133行目:
 
ブログが1ページあたり10件の投稿をを表示するように設定されていて、ループが全部で25件の投稿を保持している場合、10件のページが2ページと、5件のページが1ページの合わせて3ページ、移動可能なページが存在します。ナビゲーションリンクは訪問者が各ページ間を前後に移動できるようにします。
 
ブログが1ページあたり10件の投稿をを表示するように設定されていて、ループが全部で25件の投稿を保持している場合、10件のページが2ページと、5件のページが1ページの合わせて3ページ、移動可能なページが存在します。ナビゲーションリンクは訪問者が各ページ間を前後に移動できるようにします。
  
ナビゲーションコントロールはループの''外側''にありますが、それらは何らかの投稿がある場合にのみ表示するため、<tt>if</tt> 条件文の''内側''に含まれます。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.
+
ナビゲーションコントロールはループの''外側''にありますが、それらは何らかの投稿がある場合にのみ表示するため、<tt>if</tt> 条件文の''内側''に含まれます。
 +
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.
  
 
<pre>
 
<pre>
136行目: 143行目:
 
</pre>
 
</pre>
  
<tt>else</tt> 節には最初の have_posts() が偽のときに実行されるコードが書かれています。つまりこの <tt>else</tt> 以降の部分は投稿が1件もないときにのみ実行・表示されます。例えば訪問者が投稿が1つもない日付を指定したリクエストや検索をするとこれが表示されます。
+
<code>else :</code> 節には最初の <tt>have_posts()</tt> が偽のときに実行されるコードが書かれています。つまりこの <tt>else</tt> 以降の部分は投稿が1件もないときにのみ実行・表示されます。例えば訪問者が投稿が1つもない日付を指定したリクエストや検索をするとこれが表示されます。
  
 
<pre>
 
<pre>
142行目: 149行目:
 
</pre>
 
</pre>
  
このコードによって条件分岐「もし投稿があるときはこれ、そうでないときはそれ」が終わり、デフォルトの <tt>index.php</tt> テンプレートは次のサイドバーを読み込み、最後にフッタに到達します。
+
このコードによって条件分岐「もし投稿があるときはこれ、そうでないときはそれ」が終わります。その後、デフォルトの <tt>index.php</tt> テンプレートはサイドバーを、最後にフッターを読み込みます。
  
== 他テンプレート内でのループ ==
 
  
 +
== 他のテンプレートにおけるループ<span id="The Loop In Other Templates"></span> ==
  
== その他のループテクニック ==
+
WordPress can use different template files for displaying your blog in different ways.  In the default WordPress theme, there are [[Templates|template files]] for the index view, category view, and archive view, as well as a template for viewing individual posts.  Each of these uses [[The Loop]], but does so with slightly different formatting, as well as different uses of the [[Template_Tags|template tags]].
  
 +
For any view which does not have a separate template file, WordPress will use <tt>index.php</tt> by default.  If a visitor requests a single post, WordPress will first look for a file named <tt>single.php</tt>.  If that file exists, it will be used to present the post to the visitor.  If that file does not exist, WordPress will use <tt>index.php</tt> to present the post to the visitor. This is called the [[Template Hierarchy]].
  
== まとめ ==
+
If you are making your own [[Using Themes|Theme]], it's often helpful to look at the [[Templates|template files]] from the default Theme as a point of reference.  It's also helpful to use your theme's <tt>index.php</tt> as a template for your other template files.  Doing so may give you a known and working page from which to begin making changes as you create more template files.
  
 +
===Different Archive Format===
  
{{原文|The_Loop_in_Action/The_Loop_in_Action|89202}}<!-- 22:47, 29 May 2010‎ Lloydbudd 版 -->
+
An <em>archive</em> is a collection of historical posts.  In the default usage, the posts displayed on your main index are recent [http://mydatapages.com/chronological.html chronological] postings.  When a visitor clicks on one of your archive links, or if they manually request a specific date (<nowiki>http://www.example.com/blog/index.php?m=200504</nowiki> or <nowiki>http://www.example.com/blog/2005/04</nowiki> to select all posts from April, 2005), WordPress will display an <em>archive</em> view. By default, the archive will use <tt>index.php</tt>, and thus look the same as your front page, just displaying the posts from April 2005.
  
 +
When WordPress prepares an [[Creating_an_Archive_Index|archive view]] for a visitor, it specifically looks for a file named <tt>archive.php</tt> in your current theme's directory.  If you'd like to visually disambiguate archives from your front page, simply copy <tt>index.php</tt> to <tt>archive.php</tt>, and edit <tt>archive.php</tt> as necessary!
 +
 +
For example, if you want to show only post titles, and no post content, for your list of archives, you could use something like this:
 +
<pre>
 +
&lt;?php get_header(); ?&gt;
 +
&lt;div id="content" class="narrowcolumn"&gt;
 +
 +
  &lt;?php if (have_posts()) : ?&gt;
 +
  &lt;?php while (have_posts()) : the_post(); ?&gt;
 +
    &lt;div class="post"&gt;
 +
    &lt;h2 id="post-&lt;?php the_ID(); ?&gt;"&gt;
 +
&lt;a href="&lt;?php the_permalink() ?&gt;" rel="bookmark" title="Permanent Link to &lt;?php the_title_attribute(); ?&gt;"&gt;&lt;?php the_title(); ?&gt;&lt;/a&gt;&lt;/h2&gt;
 +
    &lt;small&gt;&lt;?php the_time('F jS, Y') ?&gt; &lt;!-- by &lt;?php the_author() ?&gt; --&gt;&lt;/small&gt;
 +
      &lt;/div&gt;
 +
    &lt;?php endwhile; ?&gt;
 +
&lt;div class="navigation"&gt;
 +
&lt;div class="alignleft"&gt;
 +
&lt;?php posts_nav_link('','','&amp;laquo; Previous Entries') ?&gt;
 +
&lt;/div&gt;
 +
&lt;div class="alignright"&gt;
 +
&lt;?php posts_nav_link('','Next Entries &amp;raquo;','') ?&gt;
 +
&lt;/div&gt;
 +
  &lt;/div&gt;
 +
&lt;?php else : ?&gt;
 +
  &lt;h2 class="center"&gt;Not Found&lt;/h2&gt;
 +
&lt;p class="center"&gt;&lt;?php _e("Sorry, but you are looking for something that isn't here."); ?&gt;&lt;/p&gt;
 +
  &lt;?php endif; ?&gt;
 +
&lt;/div&gt;
 +
&lt;?php get_sidebar(); ?&gt;
 +
&lt;?php get_footer(); ?&gt;
 +
</pre>
 +
 +
===Different Category Format===
 +
 +
Like the archive views, WordPress looks for a separate template file for [[Category_Templates|category views]].  If a visitor clicks on a link for a category in your blog, they will be taken to the category view.  WordPress will prepare The Loop with posts from that category only, limiting the number of posts per the blog's default settings.
 +
 +
To make your category view different from your index view, copy <tt>index.php</tt> and rename it <tt>category.php</tt>.  For a category view, it's probably not necessary to list the categories to which a post is assigned, so let's remove that portion.  Instead, let's announce the category at the top of the page:
 +
<pre>
 +
&lt;?php get_header(); ?&gt;
 +
&lt;div id="content" class="narrowcolumn"&gt;
 +
&lt;p&gt;
 +
&lt;strong&gt;
 +
  &lt;?php single_cat_title('Currently browsing '); ?&gt;
 +
  &lt;/strong&gt;&lt;br /&gt;
 +
&lt;?php echo category_description(); ?&gt;
 +
&lt;/p&gt;
 +
&lt;?php if (have_posts()) : ?&gt;
 +
  &lt;?php while (have_posts()) : the_post(); ?&gt;
 +
    &lt;div class="post"&gt;
 +
      &lt;h2 id="post-&lt;?php the_ID(); ?&gt;"&gt;
 +
&lt;a href="&lt;?php the_permalink() ?&gt;" rel="bookmark" title="Permanent Link to &lt;?php the_title_attribute(); ?&gt;"&gt;
 +
&lt;?php the_title(); ?&gt;&lt;/a&gt;&lt;/h2&gt;
 +
  &lt;small&gt;
 +
    &lt;?php the_time('F jS, Y') ?&gt;
 +
        &lt;!-- by &lt;?php the_author() ?&gt; --&gt;
 +
  &lt;/small&gt;
 +
&lt;/div&gt;
 +
&lt;?php endwhile; ?&gt;
 +
&lt;div class="navigation"&gt;
 +
  &lt;div class="alignleft"&gt;
 +
    &lt;?php posts_nav_link('','','&amp;laquo; Previous Entries') ?&gt;
 +
  &lt;/div&gt;
 +
  &lt;div class="alignright"&gt;
 +
    &lt;?php posts_nav_link('','Next Entries &amp;raquo;','') ?&gt;
 +
  &lt;/div&gt;
 +
&lt;/div&gt;
 +
&lt;?php else : ?&gt;
 +
  &lt;h2 class="center"&gt;Not Found&lt;/h2&gt;
 +
&lt;p class="center"&gt;&lt;?php _e("Sorry, but you are looking for something that isn't here."); ?&gt;&lt;/p&gt;
 +
&lt;?php endif; ?&gt;
 +
&lt;/div&gt;
 +
&lt;?php get_sidebar(); ?&gt;
 +
&lt;?php get_footer(); ?&gt;
 +
</pre>
 +
 +
===Different Formats for Different Categories===
 +
 +
As explained in the [[Template Hierarchy]], it is possible to [[Category_Templates|create separate template files for each category]].  Simply name the file <tt>category-<b><u>X</u></b>.php</tt>, where <b><u>X</u></b> is the numerical ID of the category.  Consider carefully whether you need a whole new template for a specific category.
 +
 +
Let's look at two categories, "Plants" and "Flowers", with category IDs 3 and 4, respectively.  Next to each post title in the output you want to have picture of either a plant, or a flower, depending on which category is being displayed.  You could:
 +
* Use two separate files, <tt>category-3.php</tt> and <tt>category-4.php</tt>, each with a different <tt>img</tt> tag for each post title.
 +
* Use a conditional test inside your default <tt>category.php</tt> file to check whether the current category is "Plants" or "Flowers" (or neither), and display the appropriate image:
 +
<pre>
 +
&lt;?php if (is_category('3') ):
 +
// we're in the Plants category, so show a plant ?&gt;
 +
&lt;img src='/images/plant.png' alt='a plant' /&gt;
 +
&lt;?php } elseif (is_category('4') ):
 +
// we're in the Flowers category, so show a flower ?&gt;
 +
&lt;img src='/images/flower.png' alt='a pretty flower' /&gt;
 +
&lt;?php endif; // end the if, no images for other other categories ?&gt;
 +
</pre>
 +
 +
If you added another category, "Cars", which you wanted to display in a <em>significantly</em> different way, then a separate <tt>category-<b><u>X</u></b>.php</tt> would be more appropriate.
 +
 +
=== Different CSS For Different Categories ===
 +
 +
Many users want to create separate CSS files for a specific category.  This, too, can be easily accomplished.  It is important to remember that stylesheets are defined and loaded in the <tt>&lt;head&gt;</tt> section of the HTML document.  WordPress uses the <tt>header.php</tt> file for this.  In the default <tt>header.php</tt>, find this line:
 +
<pre>
 +
&lt;link rel="stylesheet" href="&lt;?php bloginfo('stylesheet_url'); ?&gt;" type="text/css" media="screen" /&gt;
 +
</pre>
 +
And change it to something like this:
 +
<pre>
 +
&lt;?php if ( is_category('5') ) { // Load special CSS for "Cars" category ?&gt;
 +
  <link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/category-5.css" type="text/css" media="screen" />;
 +
&lt;?php } else { ?&gt;
 +
  <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
 +
&lt;?php } ?&gt;
 +
</pre>
 +
<strong>Note:</strong> The Cars template uses the <tt>category-5.css</tt> file to override the default layout.  In this example the CSS file is named after the category template file to which it will be applied, rather than the actual name of the category.  Thus, you know that <tt>category-5.css</tt> goes with <tt>category-5.php</tt>.
 +
 +
===Different Single Post Format===
 +
 +
When viewing any single post (or [[Glossary#Permalink|permalink]]), WordPress will use <tt>single.php</tt>, if present.
 +
 +
This portion, from the WordPress default single.php, provides the [[Post_Meta_Data_Section|post meta data information]] about the current post:
 +
<pre>
 +
<p class="postmetadata alt">
 +
<small>
 +
This entry was posted on &lt;?php the_time('l, F jS, Y') ?&gt; at &lt;?php the_time() ?&gt;
 +
and is filed under &lt;?php the_category(', ') ?&gt;.
 +
You can follow any responses to this entry through
 +
the &lt;?php comments_rss_link('RSS 2.0'); ?&gt; feed.
 +
&lt;?php
 +
if ( comments_open() && pings_open() ) {
 +
// Both Comments and Pings are open
 +
?&gt;
 +
  You can &lt;a href="#respond"&gt;leave a response&lt;/a&gt;, or
 +
  &lt;a href="&lt;?php trackback_url(display); ?&gt;"&gt;trackback&lt;/a&gt;
 +
from your own site.
 +
&lt;?php
 +
} elseif ( !comments_open() && pings_open() ) {
 +
// Only Pings are Open
 +
?&gt;
 +
  Responses are currently closed, but you can
 +
  &lt;a href="&lt;?php trackback_url(display); ?&gt; "&gt;trackback&lt;/a&gt;
 +
from your own site.
 +
&lt;?php
 +
} elseif ( comments_open() && !pings_open() ) {
 +
// Comments are open, Pings are not
 +
?&gt;
 +
  You can skip to the end and leave a response. Pinging is currently not allowed.
 +
&lt;?php
 +
} else {
 +
// Neither Comments, nor Pings are open
 +
?&gt;
 +
  Both comments and pings are currently closed.
 +
&lt;?php
 +
}
 +
edit_post_link('Edit this entry.','',''); ?&gt;
 +
&lt;/small&gt;
 +
&lt;/p&gt;
 +
</pre>
 +
This sort of information -- whether comments are open or closed -- is largely inappropriate on an index, archive, or category view; which is why it's only included in the <tt>single.php</tt> template file.
 +
 +
 +
== その他のループテクニック<span id="Other Loop Tricks"></span> ==
 +
 +
Now that you have a good introduction to the basic uses for the WordPress Loop, let's introduce you to some more Loop effects and tricks.
 +
 +
===Static Front Page===
 +
 +
How can you display something special <em>only</em> on the front page of your blog? That's right, only on the front page or home page, and have it not be seen anywhere else on your site. Easy! We call this the ''static front page''.  The front or first page of your site isn't really static.  It's just using the Loop to make it look that way.
 +
 +
To make this Loop trick work, use the <tt>[[Function_Reference/is_home|is_home()]]</tt> conditional template tag function.
 +
 +
In your <tt>index.php</tt>, use an <tt>if ()</tt> test to [[Conditional Tags|conditionally]] output additional content:
 +
 +
<pre>
 +
&lt;?php get_header(); ?&gt;
 +
&lt;?php if (is_home()) {
 +
// we're on the home page, so let's show a picture of our new kitten!
 +
echo "&lt;img src='/images/new_kitty.jpg' alt='Our new cat, Rufus!' /&gt;";
 +
// and now back to our regularly scheduled home page
 +
} ?&gt;
 +
</pre>
 +
 +
The function <tt>[[Function_Reference/is_home|is_home()]]</tt> will only produce a true value if the visitor is not requesting a specific post, page, category, or date, so it only shows up on the "home" page.
 +
 +
For more information, see [[Creating a Static Front Page]].
 +
 +
===Excerpts Only===
 +
 +
The easiest way to display excerpts, instead of the full content of posts, is to replace all instances of <tt>[[Template_Tags/the_content|the_content]]()</tt> with <tt>[[Template_Tags/the_excerpt|the_excerpt()]]</tt>.  If you have not created explicit excerpts for your posts, this function will automatically display the first 55 words of the post.
 +
<pre>
 +
&lt;div class="entry"&gt;
 +
&lt;?php the_excerpt(); ?&gt;
 +
&lt;/div&gt;
 +
</pre>
 +
 +
===Showing Excerpts or Full Post Depending Upon Number of Posts===
 +
 +
In some circumstances, for example on archive pages, you may want to show the full post if there is only one post or excerpts if there are multiple posts. You can customize the loop to do this.
 +
 +
<pre>
 +
<?php if (have_posts()) : ?>
 +
 +
  <?php if (($wp_query->post_count) > 1) : ?>
 +
    <?php while (have_posts()) : the_post(); ?>
 +
      <!-- Do your post header stuff here for excerpts-->
 +
          <?php the_excerpt() ?>
 +
      <!-- Do your post footer stuff here for excerpts-->
 +
    <?php endwhile; ?>
 +
 +
  <?php else : ?>
 +
 +
    <?php while (have_posts()) : the_post(); ?>
 +
      <!-- Do your post header stuff here for single post-->
 +
          <?php the_content() ?>
 +
      <!-- Do your post footer stuff here for single post-->
 +
    <?php endwhile; ?>
 +
 +
  <?php endif; ?>
 +
 +
<?php else : ?>
 +
    <!-- Stuff to do if there are no posts-->
 +
 +
<?php endif; ?>
 +
 +
</pre>
 +
 +
===Different Headers/Sidebars/Footers===
 +
 +
WordPress offers the <tt>[[Function Reference/get_header|get_header()]]</tt>, <tt>[[Function Reference/get_sidebar|get_sidebar()]]</tt>, and <tt>[[Function Reference/get_footer|get_footer()]]</tt> [[Include Tags]] for use in your [[Templates|template files]]. These functions make it easy to define a standard header/sidebar/footer which is easily editable. Any changes made to these files will immediately be made visible to viewers, without any work on your part.
 +
 +
But sometimes you might not <em>want</em> a sidebar. If you don't want a sidebar, simply exclude the call to the <tt>[[Function Reference/get_sidebar|get_sidebar()]]</tt> function from your template. For example, the <tt>single.php</tt> template in the WordPress default theme does not include a sidebar.
 +
 +
To create your own <strong>different</strong> sidebar, you have two choices:
 +
# Include the sidebar contents directly into the template file on which you're working.  If you want category-3 to have a different sidebar, edit <tt>category-3.php</tt> and include the necessary HTML and PHP to generate your distinctive sidebar.
 +
# Use the PHP <tt>[http://www.php.net/include include]</tt> function, to include another file. The WordPress <tt>[[Function Reference/get_sidebar|get_sidebar()]]</tt> function <em>only</em> loads <tt>sidebar.php</tt>.  If you make a file named <tt>sideleft.php</tt>, you would include it like this:
 +
<pre>
 +
&lt;?php include(TEMPLATEPATH . '/sideleft.php'); ?&gt;
 +
</pre>
 +
 +
In WordPress [[Version 2.5]] and above you can also call a sidebar like this:
 +
<pre>
 +
&lt;?php get_sidebar('right'); ?&gt;
 +
</pre>
 +
 +
This causes the template TEMPLATEPATH . 'sidebar-right.php' to be included.
 +
 +
Using the WordPress default [[Template Hierarchy]], if you want to use the same elements on multiple or different templates, it's probably best to put them in separate template files and use the PHP <tt>[http://us3.php.net/manual/en/function.include.php include()]</tt> function. If the element you're adding is specifically for one template file, it's probably best to include it directly in that template file.
 +
 +
 +
== まとめ<span id="Summary"></span> ==
 +
 +
We've just scratched the surface of what can be done with the Loop.  As a reminder, the following are resources that will help you customize your own [[The Loop|WordPress Loop]].
 +
 +
* [[テンプレート|テンプレートファイル]]
 +
* [[テンプレートタグ]]
 +
* [[テンプレート階層]]
 +
* [[条件分岐タグ]]
 +
 +
{{原文|The_Loop_in_Action|162359}} <!-- 09:32, 10 April 2018 Ggueli 版 -->
 +
 +
{{DEFAULTSORT:The Loop in Action}}
 
[[Category:WordPress レッスン ]]
 
[[Category:WordPress レッスン ]]
 
[[Category:WordPress の開発]]
 
[[Category:WordPress の開発]]
 
[[Category:プラグイン]]
 
[[Category:プラグイン]]
 
[[Category:デザインとレイアウト]]
 
[[Category:デザインとレイアウト]]
 +
 +
[[en:The Loop in Action]]
 +
[[es:The Loop in Action]]
 +
[[fr:La Boucle En Action]]
 +
[[zh-cn:运行中的循环]]
 +
[[uk:The Loop in Action]]
 +
[[ru:Цикл в действии]]
 +
<!-- [[bn:দি লুপের ক্রিয়া]] -->
 +
[[it:Il Loop in Azione]]

2018年8月25日 (土) 15:16時点における最新版

このページ「The Loop in Action」は未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています

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

はじめに

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

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

ユーザが投稿、カテゴリ、ページ、日付を特に指定しなかったとき、WordPress はどの投稿かを決めるために先ほど取得したデフォルト値を使います。例えば、ブログ管理者が 管理画面/表示設定 で1ページに表示する最大投稿数を5に設定していた場合、 WordPress は最新 5 件の投稿をデータベースから取得します。ユーザが特定の投稿、カテゴリ、ページ、日付を指定したときは、WordPress はどの投稿(複数の場合もあります)をデータベースから取得するのか決めるためにその情報を使います。

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

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

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

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

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

index.php の大半はループの内容を装飾するための CSS、HTML、PHP 宣言と言えます。それではその装飾の部分を見ていきましょう。

デフォルトループ

以下では 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() 関数が真を返す限り、while ループは回り続けます(繰り返します)

have_posts() 関数は単純に投稿リストの次の投稿を確認します。もしまだあれば真を返しますし、それ以上次がなければ偽を返します。 Internally, this is based on a posts counter, which is compared to the total number of posts in the collection. The the_post() function then retrieves that next post and updates the internal posts counter. At the next evaluation of have_posts() in the while clause, if another item is present, the while loop body is executed again for the next post. When the posts collection is exhausted (the posts counter matches the total number of posts), the while loop ends and The Loop moves on to whatever instructions it has beyond the while statement, still within the if test. For example, the if might have an else clause with statements to be executed if the posts collection did not contain any data in the first place.

投稿の生成

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

投稿データが利用できる状態になった後、テンプレートは投稿データを HTML に変換して訪問者に表示する処理を始めることができます。

タイトル、日付、著者

次のテンプレートタグは現在の投稿タイトル、投稿日時、誰による投稿なのか (著者名) を取得して表示します。

<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>

the_content() の説明ページに示されているように、もしクイックタグmore (<!--more--> として記述される) が本文に含まれていた場合、閲覧者にはその行より上の部分のみが表示されます。そのためトップページに各投稿の最初の1文または2文のみを表示させたいときは、単純に <!--more--> を各投稿の最初の1文の直後に入れればよいわけです。 The string passed to the_content() is used for the "Read More" link after the excerpt. For more about excerpts, the <!--more--> quicktag, and the "Read More" link see Template Tags/the_content and Customizing the Read 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() テンプレートタグはコメントへのリンクを表示します。コメントポップアップウィンドウを使っている場合はクリックすることでコメントウィンドウが開きますが、そうでない場合はこの投稿のコメントに飛びます。

またもし訪問者が投稿のリストを見ている場合(ループで複数の投稿を表示している場合)は、comments_popup_link() テンプレートタグは訪問者を個別の投稿記事ページへ飛ばします。

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

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

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

Note: The trackback_rdf() tag is intentionally used within an HTML comment; it is not being "turned off". The reason for this is that, otherwise, RDF breaks validation in non-XML documents, and in XHTML documents it is parsed incorrectly by most browsers.

ループの終わり

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

<?php endwhile; ?>

次のセクションは、ループの終わりの直後にあります。これはページ間を前後に移動するためのナビゲーションコントロールを表示します。 More information is available in function reference for posts_nav_link().

<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 can use different template files for displaying your blog in different ways. In the default WordPress theme, there are template files for the index view, category view, and archive view, as well as a template for viewing individual posts. Each of these uses The Loop, but does so with slightly different formatting, as well as different uses of the template tags.

For any view which does not have a separate template file, WordPress will use index.php by default. If a visitor requests a single post, WordPress will first look for a file named single.php. If that file exists, it will be used to present the post to the visitor. If that file does not exist, WordPress will use index.php to present the post to the visitor. This is called the Template Hierarchy.

If you are making your own Theme, it's often helpful to look at the template files from the default Theme as a point of reference. It's also helpful to use your theme's index.php as a template for your other template files. Doing so may give you a known and working page from which to begin making changes as you create more template files.

Different Archive Format

An archive is a collection of historical posts. In the default usage, the posts displayed on your main index are recent chronological postings. When a visitor clicks on one of your archive links, or if they manually request a specific date (http://www.example.com/blog/index.php?m=200504 or http://www.example.com/blog/2005/04 to select all posts from April, 2005), WordPress will display an archive view. By default, the archive will use index.php, and thus look the same as your front page, just displaying the posts from April 2005.

When WordPress prepares an archive view for a visitor, it specifically looks for a file named archive.php in your current theme's directory. If you'd like to visually disambiguate archives from your front page, simply copy index.php to archive.php, and edit archive.php as necessary!

For example, if you want to show only post titles, and no post content, for your list of archives, you could use something like this:

<?php get_header(); ?>
 <div id="content" class="narrowcolumn">

  <?php if (have_posts()) : ?>
   <?php while (have_posts()) : the_post(); ?>
     <div class="post">
     <h2 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
     <small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
      </div>
    <?php endwhile; ?>
<div class="navigation">
<div class="alignleft">
<?php posts_nav_link('','','&laquo; Previous Entries') ?>
</div>
<div class="alignright">
<?php posts_nav_link('','Next Entries &raquo;','') ?>
</div>
  </div>
<?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>
  <?php endif; ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Different Category Format

Like the archive views, WordPress looks for a separate template file for category views. If a visitor clicks on a link for a category in your blog, they will be taken to the category view. WordPress will prepare The Loop with posts from that category only, limiting the number of posts per the blog's default settings.

To make your category view different from your index view, copy index.php and rename it category.php. For a category view, it's probably not necessary to list the categories to which a post is assigned, so let's remove that portion. Instead, let's announce the category at the top of the page:

<?php get_header(); ?>
 <div id="content" class="narrowcolumn">
 <p>
 <strong>
  <?php single_cat_title('Currently browsing '); ?>
  </strong><br />
 <?php echo category_description(); ?>
 </p>
 <?php if (have_posts()) : ?>
   <?php while (have_posts()) : the_post(); ?>
     <div class="post">
      <h2 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>">
<?php the_title(); ?></a></h2>
   <small>
     <?php the_time('F jS, Y') ?> 
        <!-- by <?php the_author() ?> -->
   </small>
 </div>
<?php endwhile; ?>
 <div class="navigation">
   <div class="alignleft">
    <?php posts_nav_link('','','&laquo; Previous Entries') ?>
   </div>
   <div class="alignright">
    <?php posts_nav_link('','Next Entries &raquo;','') ?>
   </div>
 </div>
<?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>
 <?php endif; ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Different Formats for Different Categories

As explained in the Template Hierarchy, it is possible to create separate template files for each category. Simply name the file category-X.php, where X is the numerical ID of the category. Consider carefully whether you need a whole new template for a specific category.

Let's look at two categories, "Plants" and "Flowers", with category IDs 3 and 4, respectively. Next to each post title in the output you want to have picture of either a plant, or a flower, depending on which category is being displayed. You could:

  • Use two separate files, category-3.php and category-4.php, each with a different img tag for each post title.
  • Use a conditional test inside your default category.php file to check whether the current category is "Plants" or "Flowers" (or neither), and display the appropriate image:
<?php if (is_category('3') ):
 // we're in the Plants category, so show a plant ?>
 <img src='/images/plant.png' alt='a plant' />
<?php } elseif (is_category('4') ):
 // we're in the Flowers category, so show a flower ?>
 <img src='/images/flower.png' alt='a pretty flower' />
<?php endif; // end the if, no images for other other categories ?>

If you added another category, "Cars", which you wanted to display in a significantly different way, then a separate category-X.php would be more appropriate.

Different CSS For Different Categories

Many users want to create separate CSS files for a specific category. This, too, can be easily accomplished. It is important to remember that stylesheets are defined and loaded in the <head> section of the HTML document. WordPress uses the header.php file for this. In the default header.php, find this line:

<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />

And change it to something like this:

<?php if ( is_category('5') ) { // Load special CSS for "Cars" category ?>
  <link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/category-5.css" type="text/css" media="screen" />;
<?php } else { ?>
   <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
<?php } ?>

Note: The Cars template uses the category-5.css file to override the default layout. In this example the CSS file is named after the category template file to which it will be applied, rather than the actual name of the category. Thus, you know that category-5.css goes with category-5.php.

Different Single Post Format

When viewing any single post (or permalink), WordPress will use single.php, if present.

This portion, from the WordPress default single.php, provides the post meta data information about the current post:

<p class="postmetadata alt">
<small>
This entry was posted on <?php the_time('l, F jS, Y') ?> at <?php the_time() ?> 
and is filed under <?php the_category(', ') ?>.
You can follow any responses to this entry through 
the <?php comments_rss_link('RSS 2.0'); ?> feed.
<?php
if ( comments_open() && pings_open() ) {
// Both Comments and Pings are open
?>
  You can <a href="#respond">leave a response</a>, or 
  <a href="<?php trackback_url(display); ?>">trackback</a> 
from your own site.
<?php 
} elseif ( !comments_open() && pings_open() ) {
// Only Pings are Open 
?>
  Responses are currently closed, but you can 
  <a href="<?php trackback_url(display); ?> ">trackback</a> 
from your own site.
<?php
} elseif ( comments_open() && !pings_open() ) { 
// Comments are open, Pings are not 
?>
  You can skip to the end and leave a response. Pinging is currently not allowed.
<?php
} else { 
// Neither Comments, nor Pings are open 
?>
  Both comments and pings are currently closed.
<?php 
} 
edit_post_link('Edit this entry.','',''); ?>
</small>
</p>

This sort of information -- whether comments are open or closed -- is largely inappropriate on an index, archive, or category view; which is why it's only included in the single.php template file.


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

Now that you have a good introduction to the basic uses for the WordPress Loop, let's introduce you to some more Loop effects and tricks.

Static Front Page

How can you display something special only on the front page of your blog? That's right, only on the front page or home page, and have it not be seen anywhere else on your site. Easy! We call this the static front page. The front or first page of your site isn't really static. It's just using the Loop to make it look that way.

To make this Loop trick work, use the is_home() conditional template tag function.

In your index.php, use an if () test to conditionally output additional content:

<?php get_header(); ?>
<?php if (is_home()) {
 // we're on the home page, so let's show a picture of our new kitten!
 echo "<img src='/images/new_kitty.jpg' alt='Our new cat, Rufus!' />";
 // and now back to our regularly scheduled home page
} ?> 

The function is_home() will only produce a true value if the visitor is not requesting a specific post, page, category, or date, so it only shows up on the "home" page.

For more information, see Creating a Static Front Page.

Excerpts Only

The easiest way to display excerpts, instead of the full content of posts, is to replace all instances of the_content() with the_excerpt(). If you have not created explicit excerpts for your posts, this function will automatically display the first 55 words of the post.

<div class="entry">
<?php the_excerpt(); ?>
</div>

Showing Excerpts or Full Post Depending Upon Number of Posts

In some circumstances, for example on archive pages, you may want to show the full post if there is only one post or excerpts if there are multiple posts. You can customize the loop to do this.

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

  <?php if (($wp_query->post_count) > 1) : ?>
     <?php while (have_posts()) : the_post(); ?>
       <!-- Do your post header stuff here for excerpts-->
          <?php the_excerpt() ?>
       <!-- Do your post footer stuff here for excerpts-->
     <?php endwhile; ?>

  <?php else : ?>

     <?php while (have_posts()) : the_post(); ?>
       <!-- Do your post header stuff here for single post-->
          <?php the_content() ?>
       <!-- Do your post footer stuff here for single post-->
     <?php endwhile; ?>

  <?php endif; ?>

<?php else : ?>
     <!-- Stuff to do if there are no posts-->

<?php endif; ?>

Different Headers/Sidebars/Footers

WordPress offers the get_header(), get_sidebar(), and get_footer() Include Tags for use in your template files. These functions make it easy to define a standard header/sidebar/footer which is easily editable. Any changes made to these files will immediately be made visible to viewers, without any work on your part.

But sometimes you might not want a sidebar. If you don't want a sidebar, simply exclude the call to the get_sidebar() function from your template. For example, the single.php template in the WordPress default theme does not include a sidebar.

To create your own different sidebar, you have two choices:

  1. Include the sidebar contents directly into the template file on which you're working. If you want category-3 to have a different sidebar, edit category-3.php and include the necessary HTML and PHP to generate your distinctive sidebar.
  2. Use the PHP include function, to include another file. The WordPress get_sidebar() function only loads sidebar.php. If you make a file named sideleft.php, you would include it like this:
<?php include(TEMPLATEPATH . '/sideleft.php'); ?>

In WordPress Version 2.5 and above you can also call a sidebar like this:

<?php get_sidebar('right'); ?>

This causes the template TEMPLATEPATH . 'sidebar-right.php' to be included.

Using the WordPress default Template Hierarchy, if you want to use the same elements on multiple or different templates, it's probably best to put them in separate template files and use the PHP include() function. If the element you're adding is specifically for one template file, it's probably best to include it directly in that template file.


まとめ

We've just scratched the surface of what can be done with the Loop. As a reminder, the following are resources that will help you customize your own WordPress Loop.

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