The Loop << WordPress Codexの和訳かつ要約です。
WordPressループの使い方
テーマテンプレートの最初に、ヘッダーテンプレートを呼び出す。独自のデザイン内にWordPressループを挿入する場合、以下のようにしてWP_USE_THEMES を false に設定する。
<?php define('WP_USE_THEMES', false); get_header(); ?>
WordPressループは以下の行から始まる。
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
以下の行が、ループの終わり。
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
WordPressループの例
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
記事が存在する場合のコード
<?php endwhile; else: ?>
記事がない場合のコード
<?php endif; ?>
複合型のループ
基本的なループは以下のようになっている。
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<!-- do stuff ... -->
<?php endwhile; ?>
ループの実例
以下に複合型のループを使った2つのサンプルを挙げる。複合型ループを使う鍵は、$wp_queryは1回しかコールできないこと。これを回避するために、rewind_posts()をコールするか、新しいクエリオブジェクトを作成する事によって、クエリの再使用が可能になる。詳細は実例1にある。実例2では、クエリの結果をストアするために変数を使用する。実例3では、共通のプラグインの問題を回避するためのupdate_post_caches()関数の使い方を挙げる。最後に、ブログのホームページで特定のカテゴリの投稿を打ち出すための複合型ループの使い方と合わせて、「動作の中の複合型ループ」がもたらすアイデア群を挙げる。
複合型ループの実例1
同じクエリで2回ループするために、rewind_posts()をコールする。これはループカウンタをリセットし、違うループを実行可能にする。
<?php rewind_posts(); ?>
<?php while (have_posts()) : the_post(); ?>
<!-- Do stuff... -->
<?php endwhile; ?>
最初のクエリ処理が完了し、違うクエリを使用したい場合、query_posts()をコールする事で$wp_queryオブジェクトを再利用でき、ループバックする。query_posts()は新しいクエリを実行し、新しい投稿の配列を構築し、ループカウンタをリセットする。
// special_catカテゴリ内の最後の10投稿を取得する
<?php query_posts('category_name=special_cat&showposts=10'); ?>
<?php while (have_posts()) : the_post(); ?>
<!-- Do special_cat stuff... -->
<?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; ?>
my_queryクエリオブジェクトは、have_posts()とthe_post()が使用できないので使用される。その代わりに、新しい$my_queryオブジェクトの中でコールする。
複合型ループの実例2
have_posts()とthe_post()が使えない場合の別の回避法。これを回避するには、最初のクエリを変数に保持したい時に、別のループ時に変数を再アサインします。この方法で、全ての標準関数を使用可能になります。
// going off on my own here
<?php $temp_query = $wp_query; ?>
<!-- Do stuff... -->
<?php query_posts('category_name=special_cat&showposts=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; ?>
注:PHP5では"="演算子を使うと参照渡しになる。PHP5で動作するには以下のようにする。
// going off on my own here
<?php $temp_query = clone $wp_query; ?>
<!-- Do stuff... -->
<?php query_posts('category_name=special_cat&showposts=10'); ?>
<?php while (have_posts()) : the_post(); ?>
<!-- Do special_cat stuff... -->
<?php endwhile; ?>
// now back to our regularly scheduled programming
<?php $wp_query = clone $temp_query; ?>
しかしこれはWordPress2.1では動作しない。
複合型ループの実例3 - プラグイン
いくつかのプラグインは、複合型ループ内では正常に機能しない。
複合型ループ in action
ステップ1. "featured"カテゴリーから1投稿だけ取得する
<?php $my_query = new WP_Query('category_name=featured&showposts=1');
while ($my_query->have_posts()) : $my_query->the_post();
$do_not_duplicate = $post->ID; ?>
<!-- Do stuff... -->
<?php endwhile; ?>
ステップ2. 最後のX投稿だけを抽出する(1つの場合を除く)
<?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; ?>
最終結果
<?php $my_query = new WP_Query('category_name=featured&showposts=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; ?>
最初のカテゴリの複合型ループの注釈
showposts=2かそれ以上の場合、コードを少し変更しなければいけない。$do_not_duplicate変数は単一の値から配列に変更される必要がある。そうでなければ、最初のループは終了し、$do_not_duplicate変数は最新の投稿のIDと同一になる。2回目のループは1回目のループと同じ投稿を出力してしまう。問題を解決するには以下のようにする。
変更前
<?php if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
変更後
<?php if (have_posts()) : while (have_posts()) : the_post();
if( $post->ID == $do_not_duplicate[] ) continue; update_post_caches($posts); ?>
この変更は$do_not_duplicateを配列にする。この場合、次のような変更をする。
変更前
<?php if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
変更後
<?php if (have_posts()) : while (have_posts()) : the_post(); if($post->ID == $do_not_duplicate[0] || $post->ID == $do_not_duplicate[1] || $post->ID == $do_not_duplicate[2]) continue; update_post_caches($posts); ?>


コメントする