当サイト、Codex 日本語版は今後積極的な更新は行わない予定です。後継となる新ユーザーマニュアルは、https://ja.wordpress.org/support/ にあります。
万が一、当サイトで重大な問題を発見した際などは、フォーラムWordSlack #docs チャンネルでお知らせください。</p>

「The Loop」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(一部を翻訳しました。徐々に加筆していこうと思います。文意が損なわれている所があれば、修正お願いします。)
(最新版に更新。)
1行目: 1行目:
{{Old}}
 
 
{{NeedTrans}}
 
{{NeedTrans}}
  
 
__TOC__
 
__TOC__
「'''WordPressループ'''」とは、記事を表示させるために使うPHPコードのセットのことです。WordPressはこの「ループ」を使って、現在のページに表示される各記事を処理したり、ループタグ内で指定された基準にそって記事の形式を整えたりします。「ループ」の開始部分と終了部分の間に書きこんだ [[用語集#HTML|HTML]] や [[用語集#PHP|PHP]] のコードは、各記事の表示に使われます。
+
「'''ループ'''」は、WordPress の投稿を表示するために使います。このループを使えば、現在のページに表示される各投稿を処理したり、ループタグ内で指定された条件に沿って投稿の形式を整えたりできます。ループの開始部分と終了部分の間に書きこんだ [[用語集#HTML|HTML]] や [[用語集#PHP|PHP]] のコードは、各投稿の表示に使われます。
  
テンプレートタグやプラグインの説明内に、「このタグ(プラグイン)はループ内で使います」とある場合、このWordPressタグのことを指しています。
+
[[テンプレートタグ]]やプラグインの説明内に「このタグ(プラグイン)はループ内で使います」とある場合、タグが各投稿で繰り返して表示されます。
  
以下はループ内に含める記事の情報例です。
+
以下はループ内に含める投稿の情報例です。
  
記事のタイトル(<tt>[[テンプレートタグ/the_title|the_title()]]</tt>
+
* 投稿のタイトル - <tt>[[テンプレートタグ/the_title|the_title()]]</tt>
記事の公開日時(<tt>[[テンプレートタグ/the_time|the_time()]]</tt>
+
* 投稿の公開日時 - <tt>[[テンプレートタグ/the_time|the_time()]]</tt>
属するカテゴリー(<tt>[[テンプレートタグ/the_category|the_category()]]</tt>
+
* 属するカテゴリー - <tt>[[テンプレートタグ/the_category|the_category()]]</tt>
記事の本文(<tt>[[テンプレートタグ/the_content|the_content()]]</tt>
+
* 投稿の本文 - <tt>[[テンプレートタグ/the_content|the_content()]]</tt>
  
さらに他の[[テンプレートタグ/the_category|テンプレートタグ]]を使ったり<tt>$post</tt>変数にアクセスしたりして、記事に関する様々な情報を表示することもできます。
+
さらに他の[[テンプレートタグ]]を使ったり <tt>$post</tt> 変数にアクセスしたりして、投稿に関する様々な情報を表示することもできます。
  
ループに始めて触れる人は、[[ループの使用例]]ページも参照してください。
+
ループに始めて触れる人は、[[The_Loop_in_Action|ループの使用例]]/[[:en:The_Loop_in_Action|en]] ページも参照してください。
  
== WordPressループの使い方 ==
+
== ループの使い方 ==
  
WordPressループは、 <tt>index.php</tt> や <tt>archive.php</tt> など、複数の記事を表示させるためのテンプレートに挿入して使います。WordPressのバージョンにより多少書式が異なりますので、インストールしたWordPressの[[:Category:バージョン|バージョンを確認]]/[[:en:WordPress Versions#Finding_your_version|en]]しましょう。
+
ループは <tt>index.php</tt> などのテンプレートファイルに含め、投稿の情報を表示するために使います。
  
=== WordPress 1.5~2.x ===
+
[[Theme Development|テーマ]]のテンプレートの最初で、ヘッダーテンプレートを必ず呼び出すようにしてください。もしループをテンプレート以外の自分のデザインで使っている場合、<tt>WP_USE_THEMES</tt> を <tt>false</tt> に設定します。
 
+
現在使用中の[[テーマの作成|テーマ]]テンプレートの最初に、ヘッダーテンプレートを呼び出しておくのを忘れないようにしましょう。もし独自のデザイン内にWordPressループを挿入する場合、以下のようにして<tt>WP_USE_THEMES</tt> を <tt>false</tt> に設定しておきます。
+
  
 
<pre><?php define('WP_USE_THEMES', false); get_header(); ?></pre>
 
<pre><?php define('WP_USE_THEMES', false); get_header(); ?></pre>
  
WordPressループは以下の行から始まります。
+
== ループの例 ==
 
+
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
+
 
+
以下の行が、ループの終わりです。
+
 
+
<?php endwhile; else: ?>
+
&lt;p&gt;<?php _e('Sorry, no posts matched your criteria.'); ?>&lt;/p&gt;
+
<?php endif; ?>
+
 
+
=== WordPress 1.2 ===
+
 
+
indexページの最初に、 <tt>wp-blog-header.php</tt> をインクルードしておきます。その際、同ファイルへの正しいパスを記入しましょう。
+
 
+
<?php /* Don't remove this line. */ require('./wp-blog-header.php'); ?>
+
 
+
WordPressループは以下の行から始まります。
+
 
+
<?php if ( $posts ) : foreach ( $posts as $post ) : start_wp(); ?>
+
 
+
以下の行が、ループの終わりです。
+
 
+
<?php endforeach; else: ?>
+
&lt;p&gt;<?php _e('Sorry, no posts matched your criteria.'); ?>&lt;/p&gt;
+
<?php endif; ?>
+
 
+
== WordPressループの例 ==
+
 
+
=== 特定のカテゴリにある記事のスタイルを変更する ===
+
  
''以下の説明は、WordPress v1.5 以上向けです。''
+
=== 特定のカテゴリにある投稿のスタイルを変更する ===
  
以下のコードは、 <tt>[[テンプレートタグ/in_category|in_category()]]</tt> [[テンプレートタグ]]を使ってカテゴリー番号が3の記事に他とは別のCSSクラス名を割り当てる場合の例です。CSS(style.css)内でこのクラスの宣言を追加・編集することにより、カテゴリー3の記事にのみ特別なスタイルを加えることができます。
+
以下のコードは、 <tt>[[テンプレートタグ/in_category|in_category()]]</tt> [[テンプレートタグ]]を使ってカテゴリー番号が3の投稿に他とは別のCSSクラス名を割り当てる場合の例です。CSS(style.css)内でこのクラスの宣言を追加・編集することにより、カテゴリー3の投稿にのみ特別なスタイルを加えることができます。
  
 
<tt><nowiki><!-- --></nowiki></tt> というHTMLコメントで囲まれた部分は、実際にブラウザでは表示されません。ここではコードを分かりやすくするためにHTMLコメントで囲んだ説明を挿入していますが、実際にはテンプレート内に書き込まなくてもかまいません。
 
<tt><nowiki><!-- --></nowiki></tt> というHTMLコメントで囲まれた部分は、実際にブラウザでは表示されません。ここではコードを分かりやすくするためにHTMLコメントで囲んだ説明を挿入していますが、実際にはテンプレート内に書き込まなくてもかまいません。
  
 
  <nowiki>
 
  <nowiki>
  <!-- WordPressループ開始 -->
+
  <!-- ループ開始 -->
 
  <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
 
  <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
  
  <!-- 以下で、記事がカテゴリー3に属しているかテスト -->
+
  <!-- 以下で、投稿がカテゴリー3に属しているかテスト -->
 
  <!-- もし属している場合、"post-cat-three"というCSSクラスのdivボックスを表示 -->
 
  <!-- もし属している場合、"post-cat-three"というCSSクラスのdivボックスを表示 -->
 
  <!-- それ以外の場合、"post"というCSSクラスのdivボックスを表示 -->
 
  <!-- それ以外の場合、"post"というCSSクラスのdivボックスを表示 -->
77行目: 46行目:
 
  <?php } ?>
 
  <?php } ?>
  
  <!-- 記事のタイトルとパーマリンクを表示 -->
+
  <!-- 投稿のタイトルとパーマリンクを表示 -->
 
  <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
 
  <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
  
83行目: 52行目:
 
  <small><?php the_time('F jS, Y'); ?></small>
 
  <small><?php the_time('F jS, Y'); ?></small>
  
  <!-- 記事の本文をdiv内に表示 -->
+
  <!-- 投稿の本文をdiv内に表示 -->
 
  <div class="entry">
 
  <div class="entry">
 
   <?php the_content(); ?>
 
   <?php the_content(); ?>
 
  </div>
 
  </div>
  
  <!-- 記事のカテゴリーをコンマ区切りで表示 -->
+
  <!-- 投稿のカテゴリーをコンマ区切りで表示 -->
 
  <p class="postmetadata">Posted in <?php the_category(', '); ?></p>
 
  <p class="postmetadata">Posted in <?php the_category(', '); ?></p>
 
  </div> <!-- 最初の div ボックスを閉じる -->
 
  </div> <!-- 最初の div ボックスを閉じる -->
  
  <!-- “else”部分を除いたWordPressループ終了 -->
+
  <!-- “else”部分を除いたループ終了 -->
 
  <?php endwhile; else: ?>
 
  <?php endwhile; else: ?>
  
  <!-- 最初の“if”にて表示する記事があるかどうかをテストしたため、“else”では記事がない場合に実行 -->
+
  <!-- 最初の“if”にて表示する投稿があるかどうかをテストしたため、“else”では投稿がない場合に実行 -->
  <!-- つまり、記事がなければ以下を表示 -->
+
  <!-- つまり、投稿がなければ以下を表示 -->
 
  <p>Sorry, no posts matched your criteria.</p>
 
  <p>Sorry, no posts matched your criteria.</p>
  
  <!-- WordPressループを「完全に」終了 -->
+
  <!-- ループを「完全に」終了 -->
 
  <?php endif; ?></nowiki>
 
  <?php endif; ?></nowiki>
  
106行目: 75行目:
 
=== Exclude Posts From Some Category ===
 
=== Exclude Posts From Some Category ===
  
''For WordPress v1.5 Only''
+
This example can be used to exclude a certain Category or Categories from being displayed.  In this case, posts from Categories 3 and 8 are excluded.  The example is different than the [[#Style Posts From Some Category Differently|example above]] in that it makes a change to the [[テンプレートタグ/query_posts|query]] itself.
 
+
This example can be used to exclude a certain Category from being displayed.  It is based on the example [[#Style Posts From Some Category Differently|above]].  
+
  
 
  <nowiki>
 
  <nowiki>
 +
<?php query_posts($query_string . '&cat=-3,-8'); ?>
 
  <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
 
  <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
  
<!-- If the post is in the category we want to exclude, we simply pass to the next post. -->
 
<?php if (in_category('3')) continue; ?>
 
 
 
  <div class="post">
 
  <div class="post">
 
   
 
   
  <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
+
<!-- Display the Title as a link to the Post's permalink. -->
   
+
<h2><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'); ?></small>
+
 
 +
  <!-- Display the date (November 16th, 2009 format) and a link to other posts by this posts author. -->
 +
<small><?php the_time('F jS, Y') ?> by <?php the_author_posts_link() ?></small>
 
   
 
   
 
   <div class="entry">
 
   <div class="entry">
133行目: 100行目:
 
  <?php endif; ?></nowiki>
 
  <?php endif; ?></nowiki>
  
'''Note''': If you use this example for your main page, you should use a different [[テンプレート|Template]] for your Category archives.  Otherwise, WordPress will exclude all posts in Category 3 even when viewing that Category Archive!  
+
'''Note''': If you use this example for your main page, you should use a different [[テンプレート|Template]] for your [[Category Templates|Category archives]], otherwise, WordPress will exclude all posts in Category 3, even when viewing that Category Archive! However, if you want to use the same template file, you can avoid this by using the <tt>[[関数リファレンス/is_home|is_home()]]</tt> tag to ensure posts from Category 3 will only be excluded from the main page:
 
+
However, if you want to use the same template file, you can avoid this by using the <tt>is_home()</tt> tag:
+
 
+
 
  ...
 
  ...
  <?php if (in_category('3') && is_home() ) continue; ?>
+
  <?php if ( is_home() ) {
 +
query_posts($query_string . '&cat=-3');
 +
}
 +
?>
 
  ...
 
  ...
 
+
There are other [[Conditional Tags]] that can be used to control the output depending on whether or not a particular condition is true with respect to the requested page.
This will ensure that posts from Category 3 will only be excluded from the main page. There are other [[Conditional Tags]] that can be used to control the output depending on whether or not a particular condition is true with respect to the requested page.
+
 
+
Please note that even though the post is not being displayed it is still being counted by WordPress as having been shown -- this means that if you have WordPress set to show at most seven posts and that two of the last seven are from Category 3 then you will only display five posts on your main page. If this is a problem for you, there is more complicated hack you can employ described in the [[FAQ/レイアウトとデザイン|Layout and Design FAQ]] or you can use [[テンプレートタグ/query_posts | query_posts]] if you only need to exclude one category from the loop.
+
  
 
==複数のループ==
 
==複数のループ==
149行目: 113行目:
 
この章ではループの発展的用途について解説します。少々技術的な内容ですが、怖がらずに読んでください。簡単なところから徐々に発展した内容に入っていきます。ほんの少しの常識や我慢、そして熱意があれば、あなたも複数のループを使うことが出来るでしょう。
 
この章ではループの発展的用途について解説します。少々技術的な内容ですが、怖がらずに読んでください。簡単なところから徐々に発展した内容に入っていきます。ほんの少しの常識や我慢、そして熱意があれば、あなたも複数のループを使うことが出来るでしょう。
  
はじめに、<b>「なぜ複数のループが必要なのか?」</b>という点について考えてみましょう。おそらくあなたは<b>何か</b>をある記事のグループに対して行い、<b>別の何か</b>を他の記事のグループ対して行ったけれど、<u>同じページが両方のグループに表示されてしまった</u>のでしょう。Something could mean almost anything; you are only limited by your PHP skill and your imagination.  
+
はじめに、<b>「なぜ複数のループが必要なのか?」</b>という点について考えてみましょう。おそらくあなたは<b>何か</b>をある投稿のグループに対して行い、<b>別の何か</b>を他の投稿のグループ対して行ったけれど、<u>同じページが両方のグループに表示されてしまった</u>のでしょう。Something could mean almost anything; you are only limited by your PHP skill and your imagination.  
  
 
では、例に入りましょう。まずは普通のループから。
 
では、例に入りましょう。まずは普通のループから。
160行目: 124行目:
 
(ソースコードを読むのに慣れている人は飛ばして下さい)。
 
(ソースコードを読むのに慣れている人は飛ばして下さい)。
 
これを日本語で言えば、以下の様になります。
 
これを日本語で言えば、以下の様になります。
もし記事を表示できれば、次へと進む。
+
もし投稿を表示できれば、次へと進む。
そして一覧に存在している記事ごそれぞれに<tt>&lt;!-- 何かの処理 ... --&gt;</tt>を行う。
+
そして一覧に存在している投稿ごそれぞれに<tt>&lt;!-- 何かの処理 ... --&gt;</tt>を行う。
最後の記事にたどり着いたら、終了する。
+
最後の投稿にたどり着いたら、終了する。
 
ここでの<tt>&lt;!-- 何かの処理 ... --&gt;</tt>はテンプレートに依ります。
 
ここでの<tt>&lt;!-- 何かの処理 ... --&gt;</tt>はテンプレートに依ります。
  
177行目: 141行目:
 
Once WordPress has finished loading the blog header and is descending into the template, we arrive at our post Loop.  The <tt>have_posts()</tt> simply calls into <tt>$wp_query->have_posts()</tt> which checks a loop counter to see if there are any posts left in the post array.  And <tt>the_post()</tt> calls <tt>$wp_query->the_post()</tt> which advances the loop counter and sets up the global <tt>$post</tt> variable as well as all of the global post data.  Once we have exhausted the loop, <tt>have_posts()</tt> will return false and we are done.
 
Once WordPress has finished loading the blog header and is descending into the template, we arrive at our post Loop.  The <tt>have_posts()</tt> simply calls into <tt>$wp_query->have_posts()</tt> which checks a loop counter to see if there are any posts left in the post array.  And <tt>the_post()</tt> calls <tt>$wp_query->the_post()</tt> which advances the loop counter and sets up the global <tt>$post</tt> variable as well as all of the global post data.  Once we have exhausted the loop, <tt>have_posts()</tt> will return false and we are done.
  
==== Loop Examples====
+
<div id="Loop_Examples">
 +
==== ループの例====
 +
</div>
  
 
Below are two example of using multiple loops.  The key to using multiple loops is that <tt>$wp_query</tt> can only be called once.  In order to get around this it is possible to re-use the query by calling <tt>rewind_posts()</tt> or by creating a new query object.  This is covered in example 1.  In example 2, using a variable to store the results of a query is covered.  Example 3 documents the use of <tt>update_post_caches();</tt> function to avoid common plugin problems.  Finally, ‘multiple loops in action’ brings a bunch of ideas together to document one way of using multiple loops to promote posts of a certain category on your blog’s homepage.
 
Below are two example of using multiple loops.  The key to using multiple loops is that <tt>$wp_query</tt> can only be called once.  In order to get around this it is possible to re-use the query by calling <tt>rewind_posts()</tt> or by creating a new query object.  This is covered in example 1.  In example 2, using a variable to store the results of a query is covered.  Example 3 documents the use of <tt>update_post_caches();</tt> function to avoid common plugin problems.  Finally, ‘multiple loops in action’ brings a bunch of ideas together to document one way of using multiple loops to promote posts of a certain category on your blog’s homepage.
192行目: 158行目:
 
   <?php endwhile; ?>
 
   <?php endwhile; ?>
  
もし既に標準のクエリに関するループを終了したあと、別のクエリを使いたくなったら、<tt>$wp_query</tt>オブジェクトを<tt>query_posts()</tt>から呼び出すことが可能です。<tt>query_posts()</tt>は新しいクエリ、記事リストを作り、ループをリセットします。
+
もし既に標準のクエリに関するループを終了したあと、別のクエリを使いたくなったら、<tt>$wp_query</tt>オブジェクトを<tt>query_posts()</tt>から呼び出すことが可能です。<tt>query_posts()</tt>は新しいクエリ、投稿リストを作り、ループをリセットします。
  
   // special_catカテゴリから10件の記事を取り出します。
+
   // special_catカテゴリから10件の投稿を取り出します。
 
   <?php query_posts('category_name=special_cat&showposts=10'); ?>
 
   <?php query_posts('category_name=special_cat&showposts=10'); ?>
 
   
 
   
212行目: 178行目:
 
(訳注: ただのhave_posts()やthe_posts()ではなく、事前に生成した$my_queryのメソッドであることに注意して下さい。)
 
(訳注: ただのhave_posts()やthe_posts()ではなく、事前に生成した$my_queryのメソッドであることに注意して下さい。)
  
=====Multiple Loops Example 2=====
+
=====複数ループの例 2=====
  
Another version of using multiple Loops takes another tack for getting around the inability to use <tt>have_posts()</tt> and <tt>the_post()</tt>.  To solve this, you need to store the original query in a variable, then re-assign it when with the other Loop. This way, you can use all the standard functions that rely on all the globals.
+
Another version of using multiple Loops takes another tack for getting around the inability to use <tt>have_posts()</tt> and <tt>the_post()</tt>.  To solve this, you need to store the original query in a variable, then re-assign it with the other Loop. This way, you can use all the standard functions that rely on all the globals.
  
 
For example:
 
For example:
222行目: 188行目:
 
  &lt;!-- Do stuff... --&gt;
 
  &lt;!-- Do stuff... --&gt;
 
   
 
   
  <?php query_posts('category_name=special_cat&showposts=10'); ?>
+
  <?php query_posts('category_name=special_cat&posts_per_page=10'); ?>
 
   
 
   
 
  <?php while (have_posts()) : the_post(); ?>
 
  <?php while (have_posts()) : the_post(); ?>
231行目: 197行目:
 
  <?php $wp_query = $temp_query; ?>
 
  <?php $wp_query = $temp_query; ?>
  
'''Note:''' In PHP 5, objects are referenced with the "="-operator instead of copied like in php4. To make Example 2 work in PHP 5 you need to use the following code:
+
'''Note:''' In PHP 5, objects are referenced with the "="-operator instead of copied like in PHP 4. To make Example 2 work in PHP 5 you need to use the following code:
  
 
<pre>
 
<pre>
238行目: 204行目:
 
  &lt;!-- Do stuff... --&gt;
 
  &lt;!-- Do stuff... --&gt;
 
   
 
   
  <?php query_posts('category_name=special_cat&showposts=10'); ?>
+
  <?php query_posts('category_name=special_cat&posts_per_page=10'); ?>
 
   
 
   
 
  <?php while (have_posts()) : the_post(); ?>
 
  <?php while (have_posts()) : the_post(); ?>
 
   &lt;!-- Do special_cat stuff... --&gt;
 
   &lt;!-- Do special_cat stuff... --&gt;
 
  <?php endwhile; ?>
 
  <?php endwhile; ?>
 +
<?php endif; ?>
 
   
 
   
 
  // now back to our regularly scheduled programming
 
  // now back to our regularly scheduled programming
248行目: 215行目:
 
</pre>
 
</pre>
  
=====Multiple Loops Example 3 - Plugins=====
+
However, this second example does not work in WordPress 2.1.
 +
 
 +
=====複数ループの例 3 - プラグイン=====
  
 
It has been found that some plugins don’t play nice with multiple loops.  In these cases it was discovered that some plugins which deal with the keyword(s) and tagging of posts, only work for the first instance of a loop in a page where that loop consists of a subset of total posts.  If you find that this is the case, you might want to try the following implementation of the basic loop which adds the <tt>update_post_caches($posts)</tt> function.  This function resets the post cache and is as yet undocumented.  This implementation would be used on the second loop in a page only if the first loop retrieves a subset of posts.
 
It has been found that some plugins don’t play nice with multiple loops.  In these cases it was discovered that some plugins which deal with the keyword(s) and tagging of posts, only work for the first instance of a loop in a page where that loop consists of a subset of total posts.  If you find that this is the case, you might want to try the following implementation of the basic loop which adds the <tt>update_post_caches($posts)</tt> function.  This function resets the post cache and is as yet undocumented.  This implementation would be used on the second loop in a page only if the first loop retrieves a subset of posts.
266行目: 235行目:
 
     <?php endwhile; ?>
 
     <?php endwhile; ?>
  
====Multiple Loops in Action====
+
====複数ループの使い方====
  
 
The best way to understand how to use multiple loops is to actually show an example of its use.  Perhaps the most common use of multiple loops is to show two (or more) lists of posts on one page.  This is often done when a webmaster wants to feature not only the very latest post written, but also posts from a certain category.
 
The best way to understand how to use multiple loops is to actually show an example of its use.  Perhaps the most common use of multiple loops is to show two (or more) lists of posts on one page.  This is often done when a webmaster wants to feature not only the very latest post written, but also posts from a certain category.
274行目: 243行目:
 
<b>Step 1.</b>  Get only one post from the ‘featured’ category.
 
<b>Step 1.</b>  Get only one post from the ‘featured’ category.
  
   <?php $my_query = new WP_Query('category_name=featured&showposts=1');
+
   <?php $my_query = new WP_Query('category_name=featured&posts_per_page=1');
 
   while ($my_query->have_posts()) : $my_query->the_post();
 
   while ($my_query->have_posts()) : $my_query->the_post();
 
   $do_not_duplicate = $post->ID; ?>
 
   $do_not_duplicate = $post->ID; ?>
301行目: 270行目:
 
<b>The End Result</b>
 
<b>The End Result</b>
  
Here is what the final piece of code looks like <u>without any formatting</u>:
+
Here is what the final piece of code looks like <i>without any formatting</i>:
  
   <?php $my_query = new WP_Query('category_name=featured&showposts=1');
+
   <?php $my_query = new WP_Query('category_name=featured&posts_per_page=1');
 
   while ($my_query->have_posts()) : $my_query->the_post();
 
   while ($my_query->have_posts()) : $my_query->the_post();
 
   $do_not_duplicate = $post->ID;?>
 
   $do_not_duplicate = $post->ID;?>
316行目: 285行目:
 
The end result would be a page with two lists.  The first list contains only one post -- the most recent post from the 'feature' category.  The second list will contain X recent posts (as defined in WordPress preferences) <i>except</i> the post that is already shown in the first list.  So, once the feature post is replaced with a new one, the previous feature will show up in standard post list section below (depending on how many posts you choose to display and on the post frequency).  This technique (or similar) has been used by many in conjunction with knowledge of the [[テンプレート階層|Template Hierarchy]] to create a different look for home.php and index.php.  See associated resources at the bottom of this page.
 
The end result would be a page with two lists.  The first list contains only one post -- the most recent post from the 'feature' category.  The second list will contain X recent posts (as defined in WordPress preferences) <i>except</i> the post that is already shown in the first list.  So, once the feature post is replaced with a new one, the previous feature will show up in standard post list section below (depending on how many posts you choose to display and on the post frequency).  This technique (or similar) has been used by many in conjunction with knowledge of the [[テンプレート階層|Template Hierarchy]] to create a different look for home.php and index.php.  See associated resources at the bottom of this page.
  
<h3>Sources:</h3> This article on multiple loops is a combination of [http://boren.nu Ryan Boren] and [http://www.alexking.org Alex King's] [http://comox.textdrive.com/pipermail/hackers/2005-January/003578.html discussion] about the Loop on the [[:en:Mailing Lists#Hackers|Hackers Mailing List]] as well as the tutorial written at [http://www.maxpower.ca/wordPress-hack-sticky-adhesive-kubrick/2005/05/03/ MaxPower].
+
<b>Note for Multiple Posts in the First Category</b>
  
==More Loop Resources==
+
If posts_per_page=2 or more, you will need to alter the code a bit.  The variable $do_not_duplicate needs to be changed into an array as opposed to a single value.  Otherwise, the first loop will finish and the variable $do_not_duplicate will equal only the id of the latest post.  This will result in duplicated posts in the second loop.  To fix the problem replace
 +
 +
<?php $my_query = new WP_Query('category_name=featured&amp;posts_per_page=1');
 +
  while ($my_query->have_posts()) : $my_query->the_post();
 +
  $do_not_duplicate = $post->ID;?>
 +
 
 +
with
 +
 
 +
<?php $my_query = new WP_Query('category_name=featured&amp;posts_per_page=2');
 +
  while ($my_query->have_posts()) : $my_query->the_post();
 +
  $do_not_duplicate[] = $post->ID ?>
 +
 
 +
Note that "posts_per_page" can be any number.
 +
This changes $do_not_duplicate into an array.  Then replace
 +
 +
<?php if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID ==
 +
  $do_not_duplicate ) continue; update_post_caches($posts); ?>
 +
 
 +
with
 +
 
 +
<?php if (have_posts()) : while (have_posts()) : the_post();
 +
  if (in_array($post->ID, $do_not_duplicate)) continue;
 +
  update_post_caches($posts); ?>
 +
 
 +
Where you continue the pattern for whatever posts_per_page is set equal to (2 in this case).
 +
 
 +
Alternatively you can pass the entire <tt>$do_not_duplicate</tt> array to <tt>$wp_query</tt> and only entries that match your criteria will be returned:
 +
 +
<?php query_posts(array('post__not_in'=>$do_not_duplicate));
 +
  if (have_posts()) : while (have_posts()) : the_post();
 +
  update_post_caches($posts); ?>
 +
 
 +
Note that instead a string, the query parameter was an associative array, with <tt>post__not_in</tt> option.
 +
 
 +
===ソース===
 +
This article on multiple loops is a combination of [http://boren.nu Ryan Boren] and [http://www.alexking.org Alex King's] [http://comox.textdrive.com/pipermail/hackers/2005-January/003578.html discussion] about the Loop on the [[Mailing Lists#Hackers|Hackers Mailing List]] as well as the tutorial written at [http://www.maxpower.ca/wordPress-hack-sticky-adhesive-kubrick/2005/05/03/ MaxPower].
 +
 
 +
==その他のループ関連リソース==
  
 
To learn more about the WordPress Loop, and the various template tags that work only within the Loop, here are more resources.
 
To learn more about the WordPress Loop, and the various template tags that work only within the Loop, here are more resources.
  
* [[The Loop in Action]]
+
* [[The_Loop_in_Action|ループの使用例]]/[[:en:The_Loop_in_Action|en]]
* [[テンプレートタグ|Template Tags]]
+
* [[テンプレートタグ]]
* [[テンプレート|Using the Loop in Template Files]]
+
* [[テンプレート|ループをテンプレートファイル内で使う]]
 +
 
 +
===リソース===
  
===Resources===
+
==== 日本語 ====
 +
* [http://tekapo.com/st/2006/09/04/themeguide4/ WordPress テーマの詳説:第四章 (tekapo.com)]
 +
* [http://tech.ludicmind.net/cms/wordpress/wordpress_1.html WordPressループの使用方法 (tech.ludicmind.net)]
 +
* [http://www.findxfine.com/wordpress/528.html ループ : WordPress (FindxFine)]
  
 +
==== 英語 ====
 
* [http://mattread.com/archives/2005/04/wordpress-is-not-php/ Matt Read Loop Article]
 
* [http://mattread.com/archives/2005/04/wordpress-is-not-php/ Matt Read Loop Article]
 
* [http://www.maxpower.ca/wordPress-hack-sticky-adhesive-kubrick/2005/05/03/ MaxPower Dynamic Sticky Tutorial]
 
* [http://www.maxpower.ca/wordPress-hack-sticky-adhesive-kubrick/2005/05/03/ MaxPower Dynamic Sticky Tutorial]
335行目: 347行目:
 
* [http://rhymedcode.net/1001-wordpression-loops/ 1001 WordPression Loops]
 
* [http://rhymedcode.net/1001-wordpression-loops/ 1001 WordPression Loops]
  
{{原文|The Loop|7527}}
+
{{原文|The Loop|89201}} <!-- 2010-05-29T18:44:24 Lloydbudd 版 -->
  
 
{{DEFAULTSORT:るうふ}}
 
{{DEFAULTSORT:るうふ}}
343行目: 355行目:
  
 
[[en:The Loop]]
 
[[en:The Loop]]
 +
[[ru:Цикл WordPress]]

2010年6月27日 (日) 12:11時点における版

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

ループ」は、WordPress の投稿を表示するために使います。このループを使えば、現在のページに表示される各投稿を処理したり、ループタグ内で指定された条件に沿って投稿の形式を整えたりできます。ループの開始部分と終了部分の間に書きこんだ HTMLPHP のコードは、各投稿の表示に使われます。

テンプレートタグやプラグインの説明内に「このタグ(プラグイン)はループ内で使います」とある場合、タグが各投稿で繰り返して表示されます。

以下はループ内に含める投稿の情報例です。

さらに他のテンプレートタグを使ったり $post 変数にアクセスしたりして、投稿に関する様々な情報を表示することもできます。

ループに始めて触れる人は、ループの使用例/en ページも参照してください。

ループの使い方

ループは index.php などのテンプレートファイルに含め、投稿の情報を表示するために使います。

テーマのテンプレートの最初で、ヘッダーテンプレートを必ず呼び出すようにしてください。もしループをテンプレート以外の自分のデザインで使っている場合、WP_USE_THEMESfalse に設定します。

<?php define('WP_USE_THEMES', false); get_header(); ?>

ループの例

特定のカテゴリにある投稿のスタイルを変更する

以下のコードは、 in_category() テンプレートタグを使ってカテゴリー番号が3の投稿に他とは別のCSSクラス名を割り当てる場合の例です。CSS(style.css)内でこのクラスの宣言を追加・編集することにより、カテゴリー3の投稿にのみ特別なスタイルを加えることができます。

<!-- --> というHTMLコメントで囲まれた部分は、実際にブラウザでは表示されません。ここではコードを分かりやすくするためにHTMLコメントで囲んだ説明を挿入していますが、実際にはテンプレート内に書き込まなくてもかまいません。

 <!-- ループ開始 -->
 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

 <!-- 以下で、投稿がカテゴリー3に属しているかテスト -->
 <!-- もし属している場合、"post-cat-three"というCSSクラスのdivボックスを表示 -->
 <!-- それ以外の場合、"post"というCSSクラスのdivボックスを表示 -->
 <?php if ( in_category('3') ) { ?>
           <div class="post-cat-three">
 <?php } else { ?>
           <div class="post">
 <?php } ?>

 <!-- 投稿のタイトルとパーマリンクを表示 -->
 <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>

 <!-- 日時を表示 -->
 <small><?php the_time('F jS, Y'); ?></small>

 <!-- 投稿の本文をdiv内に表示 -->
 <div class="entry">
  <?php the_content(); ?>
 </div>

 <!-- 投稿のカテゴリーをコンマ区切りで表示 -->
 <p class="postmetadata">Posted in <?php the_category(', '); ?></p>
 </div> <!-- 最初の div ボックスを閉じる -->

 <!-- “else”部分を除いたループ終了 -->
 <?php endwhile; else: ?>

 <!-- 最初の“if”にて表示する投稿があるかどうかをテストしたため、“else”では投稿がない場合に実行 -->
 <!-- つまり、投稿がなければ以下を表示 -->
 <p>Sorry, no posts matched your criteria.</p>

 <!-- ループを「完全に」終了 -->
 <?php endif; ?>

注: HTMLコードをテンプレート内に書く場合は、必ず <?php  ?> というPHP開始・終了タグの外側に書かなければなりません。逆に、PHPコードは、必ず <?php  ?> タグの内側に書きます。上記のように、ifelse ステートメント内でもPHPコードを一時的に閉じ、HTMLコードを書くことができます。

Exclude Posts From Some Category

This example can be used to exclude a certain Category or Categories from being displayed. In this case, posts from Categories 3 and 8 are excluded. The example is different than the example above in that it makes a change to the query itself.

 <?php query_posts($query_string . '&cat=-3,-8'); ?>
 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

 <div class="post">
 
 <!-- Display the Title as a link to the Post's permalink. -->
 <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>

 <!-- Display the date (November 16th, 2009 format) and a link to other posts by this posts author. -->
 <small><?php the_time('F jS, Y') ?> by <?php the_author_posts_link() ?></small>
 
  <div class="entry">
    <?php the_content(); ?>
  </div>

  <p class="postmetadata">Posted in <?php the_category(', '); ?></p>
 </div> <!-- closes the first div box -->

 <?php endwhile; else: ?>
 <p>Sorry, no posts matched your criteria.</p>
 <?php endif; ?>

Note: If you use this example for your main page, you should use a different Template for your Category archives, otherwise, WordPress will exclude all posts in Category 3, even when viewing that Category Archive! However, if you want to use the same template file, you can avoid this by using the is_home() tag to ensure posts from Category 3 will only be excluded from the main page:

...
<?php if ( is_home() ) {
query_posts($query_string . '&cat=-3');
}
?>
...

There are other Conditional Tags that can be used to control the output depending on whether or not a particular condition is true with respect to the requested page.

複数のループ

この章ではループの発展的用途について解説します。少々技術的な内容ですが、怖がらずに読んでください。簡単なところから徐々に発展した内容に入っていきます。ほんの少しの常識や我慢、そして熱意があれば、あなたも複数のループを使うことが出来るでしょう。

はじめに、「なぜ複数のループが必要なのか?」という点について考えてみましょう。おそらくあなたは何かをある投稿のグループに対して行い、別の何かを他の投稿のグループ対して行ったけれど、同じページが両方のグループに表示されてしまったのでしょう。Something could mean almost anything; you are only limited by your PHP skill and your imagination.

では、例に入りましょう。まずは普通のループから。

     <?php if (have_posts()) : ?>
               <?php while (have_posts()) : the_post(); ?>    
     <!-- 何かの処理 ... -->
     <?php endwhile; ?>

(ソースコードを読むのに慣れている人は飛ばして下さい)。 これを日本語で言えば、以下の様になります。 もし投稿を表示できれば、次へと進む。 そして一覧に存在している投稿ごそれぞれに<!-- 何かの処理 ... -->を行う。 最後の投稿にたどり着いたら、終了する。 ここでの<!-- 何かの処理 ... -->はテンプレートに依ります。

Aside on Do stuff: in this example it is simply a placeholder for a bunch of code that determines how to format and display each post on a page. This code can change depending on how you want your WordPress to look. If you look at the Kubrick theme’s index.php the do stuff section would be everything below:

     <?php while (have_posts()) : the_post(); ?>

To above:

     <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?>

An explanation for the coders out there: The have_posts() and the_post() are convenience wrappers around the global $wp_query object, which is where all of the action is. The $wp_query is called in the blog header and fed query arguments coming in through GET and PATH_INFO. The $wp_query takes the arguments and builds and executes a DB query that results in an array of posts. This array is stored in the object and also returned back to the blog header where it is stuffed into the global $posts array (for backward compatibility with old post loops).

Once WordPress has finished loading the blog header and is descending into the template, we arrive at our post Loop. The have_posts() simply calls into $wp_query->have_posts() which checks a loop counter to see if there are any posts left in the post array. And the_post() calls $wp_query->the_post() which advances the loop counter and sets up the global $post variable as well as all of the global post data. Once we have exhausted the loop, have_posts() will return false and we are done.

ループの例

Below are two example of using multiple loops. The key to using multiple loops is that $wp_query can only be called once. In order to get around this it is possible to re-use the query by calling rewind_posts() or by creating a new query object. This is covered in example 1. In example 2, using a variable to store the results of a query is covered. Example 3 documents the use of update_post_caches(); function to avoid common plugin problems. Finally, ‘multiple loops in action’ brings a bunch of ideas together to document one way of using multiple loops to promote posts of a certain category on your blog’s homepage.

複数ループの例 1

二度目のループでも同じ様に処理を行うにはrewind_posts()を呼び出して下さい。 この関数はループのカウンタをリセットし、別のループを実行出来るようにします。

  <?php rewind_posts(); ?>
 
  <?php while (have_posts()) : the_post(); ?>
    <!-- Do stuff... -->
  <?php endwhile; ?>

もし既に標準のクエリに関するループを終了したあと、別のクエリを使いたくなったら、$wp_queryオブジェクトをquery_posts()から呼び出すことが可能です。query_posts()は新しいクエリ、投稿リストを作り、ループをリセットします。

  // special_catカテゴリから10件の投稿を取り出します。
  <?php query_posts('category_name=special_cat&showposts=10'); ?>

  <?php while (have_posts()) : the_post(); ?>
    <!-- special_cat についての処理... -->
  <?php endwhile;?>

もし標準のクエリを保持しておきたければ、新しいクエリオブジェクトを生成するという方法があります。

<?php $my_query = new WP_Query('category_name=special_cat&showposts=10'); ?>

<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
  <!-- Do special_cat stuff... -->
<?php endwhile; ?>

$wp_query用のhave_posts()the_post() が使えないので、新たなオブジェクトmy_queryを生成します。 (訳注: ただのhave_posts()やthe_posts()ではなく、事前に生成した$my_queryのメソッドであることに注意して下さい。)

複数ループの例 2

Another version of using multiple Loops takes another tack for getting around the inability to use have_posts() and the_post(). To solve this, you need to store the original query in a variable, then re-assign it with the other Loop. This way, you can use all the standard functions that rely on all the globals.

For example:

// going off on my own here
<?php $temp_query = $wp_query; ?>
<!-- Do stuff... -->

<?php query_posts('category_name=special_cat&posts_per_page=10'); ?>

<?php while (have_posts()) : the_post(); ?>
  <!-- Do special_cat stuff... -->
<?php endwhile; ?>

// now back to our regularly scheduled programming
<?php $wp_query = $temp_query; ?>

Note: In PHP 5, objects are referenced with the "="-operator instead of copied like in PHP 4. To make Example 2 work in PHP 5 you need to use the following code:

 // going off on my own here
 <?php $temp_query = clone $wp_query; ?>
 <!-- Do stuff... -->
 
 <?php query_posts('category_name=special_cat&posts_per_page=10'); ?>
 
 <?php while (have_posts()) : the_post(); ?>
   <!-- Do special_cat stuff... -->
 <?php endwhile; ?>
 <?php endif; ?>
 
 // now back to our regularly scheduled programming
 <?php $wp_query = clone $temp_query; ?>

However, this second example does not work in WordPress 2.1.

複数ループの例 3 - プラグイン

It has been found that some plugins don’t play nice with multiple loops. In these cases it was discovered that some plugins which deal with the keyword(s) and tagging of posts, only work for the first instance of a loop in a page where that loop consists of a subset of total posts. If you find that this is the case, you might want to try the following implementation of the basic loop which adds the update_post_caches($posts) function. This function resets the post cache and is as yet undocumented. This implementation would be used on the second loop in a page only if the first loop retrieves a subset of posts.

Simply amend:

   <?php if (have_posts()) : ?>
               <?php while (have_posts()) : the_post(); ?>    
     <!-- Do stuff... -->
   <?php endwhile; ?>

to become:

   <?php if (have_posts()) : ?>
               <?php while (have_posts()) : the_post(); update_post_caches($posts); ?>
     <!-- Do stuff... -->
   <?php endwhile; ?>

複数ループの使い方

The best way to understand how to use multiple loops is to actually show an example of its use. Perhaps the most common use of multiple loops is to show two (or more) lists of posts on one page. This is often done when a webmaster wants to feature not only the very latest post written, but also posts from a certain category.

Leaving all formatting and CSS issues aside, let us assume we want to have two lists of posts. One which would list the most recent posts (the standard 10 posts most recently added), and another which would contain only one post from the category ‘featured’. Posts in the ‘featured’ category should be shown first, followed by the second listing of posts (the standard). The catch is that no post should appear in both categories.

Step 1. Get only one post from the ‘featured’ category.

  <?php $my_query = new WP_Query('category_name=featured&posts_per_page=1');
  while ($my_query->have_posts()) : $my_query->the_post();
  $do_not_duplicate = $post->ID; ?>
    <!-- Do stuff... -->
  <?php endwhile; ?>

In English the above code would read:

Set $my_query equal to the result of querying all posts where the category is named featured and by the way, get me one post only. Also, set the variable $do_not_duplicate equal to the ID number of the single post returned. Recall that the Do stuff line represents all the formatting options associated for the post retrieved.

Note that we will need the value of $do_not_duplicate in the next step to ensure that the same post doesn't appear in both lists.

Step 2. The second loop, get the X latest posts (except one).

The following code gets X recent posts (as defined in WordPress preferences) save the one already displayed from the first loop and displays them according to Do stuff.

  <?php if (have_posts()) : while (have_posts()) : the_post(); 
  if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
   <!-- Do stuff... -->
  <?php endwhile; endif; ?>

In English the above code would read:

Get all posts, where a post equals $do_not_duplicate then just do nothing (continue), otherwise display all the other the posts according to Do stuff. Also, update the cache so the tagging and keyword plugins play nice. Recall, $do_not_duplicate variable contains the ID of the post already displayed.

The End Result

Here is what the final piece of code looks like without any formatting:

  <?php $my_query = new WP_Query('category_name=featured&posts_per_page=1');
  while ($my_query->have_posts()) : $my_query->the_post();
  $do_not_duplicate = $post->ID;?>
    <!-- Do stuff... -->
  <?php endwhile; ?>
    <!-- Do other stuff... -->
  <?php if (have_posts()) : while (have_posts()) : the_post(); 
  if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
   <!-- Do stuff... -->
  <?php endwhile; endif; ?>

The end result would be a page with two lists. The first list contains only one post -- the most recent post from the 'feature' category. The second list will contain X recent posts (as defined in WordPress preferences) except the post that is already shown in the first list. So, once the feature post is replaced with a new one, the previous feature will show up in standard post list section below (depending on how many posts you choose to display and on the post frequency). This technique (or similar) has been used by many in conjunction with knowledge of the Template Hierarchy to create a different look for home.php and index.php. See associated resources at the bottom of this page.

Note for Multiple Posts in the First Category

If posts_per_page=2 or more, you will need to alter the code a bit. The variable $do_not_duplicate needs to be changed into an array as opposed to a single value. Otherwise, the first loop will finish and the variable $do_not_duplicate will equal only the id of the latest post. This will result in duplicated posts in the second loop. To fix the problem replace

<?php $my_query = new WP_Query('category_name=featured&posts_per_page=1');
 while ($my_query->have_posts()) : $my_query->the_post();
 $do_not_duplicate = $post->ID;?>

with

<?php $my_query = new WP_Query('category_name=featured&posts_per_page=2');
  while ($my_query->have_posts()) : $my_query->the_post();
  $do_not_duplicate[] = $post->ID ?>

Note that "posts_per_page" can be any number. This changes $do_not_duplicate into an array. Then replace

<?php if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID ==
  $do_not_duplicate ) continue; update_post_caches($posts); ?>

with

<?php if (have_posts()) : while (have_posts()) : the_post(); 
 if (in_array($post->ID, $do_not_duplicate)) continue;
 update_post_caches($posts); ?>

Where you continue the pattern for whatever posts_per_page is set equal to (2 in this case).

Alternatively you can pass the entire $do_not_duplicate array to $wp_query and only entries that match your criteria will be returned:

<?php query_posts(array('post__not_in'=>$do_not_duplicate));
 if (have_posts()) : while (have_posts()) : the_post();
 update_post_caches($posts); ?> 

Note that instead a string, the query parameter was an associative array, with post__not_in option.

ソース

This article on multiple loops is a combination of Ryan Boren and Alex King's discussion about the Loop on the Hackers Mailing List as well as the tutorial written at MaxPower.

その他のループ関連リソース

To learn more about the WordPress Loop, and the various template tags that work only within the Loop, here are more resources.

リソース

日本語

英語

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