WordPressテーマ〜(8)WP_Queryについて

WordPressテーマ〜(8)WP_Queryについて

表示の主役はWP_Queryオブジェクト

WP_QueryオブジェクトはURLを指定すると、そのページに必要なデータを自動的に取得して、グローバル変数 $wp_query に格納してくれます。
言い換えると、
URLから必要なデータのクエリを発行し、グローバル変数 $wp_query に格納した後、テンプレート階層に従ってデータを表示する流れになります。

WP_Queryについて

WP_Queryはクラスと呼ばれているものです。
通常のページ表示の動作では、ページのアドレスを基に必要な情報を集めてページの出力で読み込んだ情報を表示します。
WP_Queryオブジェクトを使用すれば自分で自由に読み込むデータを選別することができます。
ページアドレスを基に読み込まれた情報以外に必要なデータを再度読み込むことができるありがた〜い物なのです。
例えば、投稿ページを開いたけれどもページの最初に表示したいのは投稿ページではなくて固定ページのaboutだったらどうなるでしょうか?
開きたいのは投稿ページですからURLは投稿ページに必要なデータが自動的に取得されて、グローバル変数 $wp_query に格納した後、テンプレート階層に従ってデータを表示する。ことになるはずです。固定ページのaboutはどうしたら表示できるのでしょうか?そんなときにWP_Queryオブジェクトを使用すれば解決できるわけです。

WP_Query の使い方

<?php $my_query = new WP_Query(array('pagename'=>'school'));
if($my_query->have_posts()):?>
<?php while ($my_query->have_posts()):$my_query->the_post(); ?>
<?php the_title(); ?>
 <?php the_content(); ?>
 <?php endwhile; ?>
 <?php endif; ?> 

query_posts()で強制的に必要データを書き換える

グローバル変数の$wp_query の値 はURLに従ったクエリが入っています。
$wp_query の値を自分が欲しいクエリに変更できればハッピー!ですね。
query_posts()を使用すると$wp_query の値を変更することができます。
$wp_query の値を変更するということはつまり自分の必要なデータを再度収集した結果を$wp_query に格納することです。
注意があります。$wp_query の値を変更するということはURLの指定したクエリとつじつまが合わなくなり不具合に遭遇することもあります。
wp_reset_query() で、動的に変更した $wp_query をリセットすることを忘れないようにしなければなりません。
query_posts()使用例

<?php query_posts('pagename=school'); ?>
<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
 <article>
            <h2><?php the_title(); ?></h2>
            <?php the_content(); ?>
 </article>     
    <?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_query(); ?>

get_posts() を使用する方法

get_posts()とquery_posts()と使用方法は似ていますが、query_posts() 関数は$wp_query の値を変更してしまうものです。基本的にはメインループの情報を変更したい場合に使用します。またリセットを行わないと不具合がでたりでリスクが伴います。get_posts()はメインループの他にサブループが必要な場合に使うという棲み分けで使用するとよいでしょう。

<?php $myposts = get_posts(array('pagename'=>'school','post_type' => 'page',)); ?>
<?php foreach($myposts as $post) : setup_postdata($post); ?>
 <?php the_title(); ?>
<?php the_content(); ?>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>