WordPress Queries

WordPress をカスタマイズする上で肝となるアレ...
良く忘れるてしまうので、備忘録。

WordPress で他のページの情報を取得したい場合、利用できるコマンドは3つある。

  • query_posts
  • get_posts
  • WP_Query

query_posts を利用したクエリとループ

少し前までは、他のページの情報を取得するコマンドという認識でいたが query_posts() コマンドは、メインクエリを上書きすることになるため、現状では推奨されていないコマンドらしい。(古めの WordPress の解説本だとこのコマンドはよく使われている)

メインクエリと同様に $wp_query というオブジェクトを作成する。
メインクエリとメインループ以外のクエリのために使用すると、メインクエリとメインループにも影響をおぼすことになる。

<?php // クエリ ?>
<?php query_posts( array(
      'post_type' => 'post',
      'post_per_page' => '5'
) ); ?>

<?php // ループ ?>
<?php if(have_posts()): while(have_posts()) : the_post(); ?>

// 処理

<?php endwhile; endif; ?>

<?php wp_reset_query(); ?>

特定のページで表示件数を変えるといった場合は、メインクエリの処理そのものを変更する pre_get_posts を利用することが推奨されている。

get_posts を利用したクエリとループ

get_posts() コマンドは $wp_query というオブジェクトを作成しない。
そのため、メインクエリとメインループに影響することなく、メインクエリ以外のクエリのために使用することができる。

<?php // クエリ ?>
<?php $myposts = get_posts( array(
      'post_type' => 'post',
      'posts_per_page' => '5'
) ); ?>

<?php // ループ ?>
<?php if($myposts) :
foreach ($myposts as $post) :
setup_postdata( $post ); ?>

// 処理

<?php endforeach;
wp_reset_postdata();
endif; ?>

WP_Query を利用したクエリとループ

WP_Query() コマンドは query_postsget_posts から呼び出されているコマンド。
処理を細かく制御したい場合に使用する。

<?php // クエリ ?>
<?php $myquery = new WP_Query( array(
      'post_type' => 'post',
      'posts_per_page' => '5'
) ); ?>

<?php // ループ ?>
<?php if($myquery->have_posts()) :
while($myquery->have_posts()) :
$myquery->the_post(); ?>

// 処理

<?php endwhile;
wp_reset_postdata();
endif; ?>

先にあげた2つのコマンドは、それぞれ、特化された WP_Query

  • query_posts = メインクエリ用 WP_Query
  • get_posts = メインクエリ以外のクエリ用 WP_Query

なお、WP_Query が実行されると、メインクエリの結果が一時的に退避されて、クエリとループの処理後にデータを復元することができる。

$wpquery と $post を合わせて復元する場合には ``wpresetquery()を $post のみを復元する場合にはwpreset_postdata()`` を利用する。

この記述はループの最後に必ず入れるようにする。