2020年5月14日

wordpressでquery_postsからWP_Queryに書き換える方法と条件指定について

サイト構築でよく使用するWordpressですが、記事情報を出力するにあたり避けて通れないのがループ処理です。そのループ処理ですが、シンプルに基本機能だけで実装が完了する事はあまり無いかと思います。

トップページには特定のカテゴリの記事を表示させたくなかったり、サイドバーには特定のタグが付けられた記事だけを表示させたかったり。ループに対して条件を指定したいケースが多々あるかと思います。

query_postsは非推奨

ループに対して条件を指定する方法として、「query_posts」があります。記述方法は以下のようになります。

$args = Array(
        'post_type' => 'post',
        'posts_per_page' => 5,
); 
 
query_posts( $args );

if (have_posts()) : 
	while (have_posts()) : 
		the_post();

//記事の内容を記述

	endwhile;
else:

//該当する記事が無い場合の内容を記述

endif;

wp_reset_query();

絞り込みを行う時はデータベースに投げかける条件文=クエリを上書きして投げかけるようなイメージなのですが、この「query_posts」はページの表示速度が遅くなったり、他のページのクエリも書き換わってしまう危険性もあるため、非推奨とされています。

そこで「query_posts」の代替の記述方法の一つである「WP_Query」について確認してみます。同じ条件で「query_posts」から「WP_Query」に書き換えると以下のようになります。

$args = Array(
        'post_type' => 'post',
        'posts_per_page' => 5,
);

$wp_query = new WP_Query( $args );

if ( $wp_query->have_posts() ) {
    while ( $wp_query->have_posts() ) {
        $wp_query->the_post();

//記事の内容を記述

	endwhile;
else:

//該当する記事が無い場合の内容を記述

endif;
wp_reset_postdata();

「new WP_Query」でクエリを定義して、ループ開始周りの記述を書き換え、「wp_reset_query();」を「wp_reset_postdata();」とする事で、書き換え完了です。オブジェクトとして扱うため直感的に理解しやすいかと思います。

WP_Queryで条件として指定できるプロパティの例

条件については以下のように複数指定することが可能です。まずは基本的な投稿に関する指定です。

$args = array(
  'p' => 10,                      //投稿IDを指定
  'name' => 'news',               //投稿スラッグを指定
  'page_id' => 50,                //固定ページIDを指定
  'pagename' => 'news',           //固定ページスラッグを指定
  'post_parent' => 20,            //親IDを指定
  'post__in' => array(1, 11, 35), //投稿IDを配列で指定
  'post__not_in' => array(2, 20), //除外したい投稿のIDを配列で指定
  'posts_per_page' => 5           //表示させる記事数を指定
);

記事の表示順序については以下のように指定することが可能です。

$args = array(
  'order' => 'ASC',  //昇順 or 降順
  'orderby' => 'rand'  //何順で並べるか、randはランダム
);

日時についても以下のように指定が可能です。

$args = array(
  'year' => 2017,    //年
  'mouthnum' => 6,   //月
  'w' => 6,          //週(番号で指定)
  'day' => 14,       //日
  'hour' => 20,      //時間
  'minute' => 0,     //分
  'second' => 0,     //秒
  'm' => 201706      //年と月をyyyymmで指定
);

カテゴリやタグを絞り込みたい場合は以下のように指定できます。

カテゴリ

$args = array(
  'cat' => 2, //カテゴリID、除外の場合は - (マイナス) で指定
  'category_name' => 'php, sample',
  'category__and' => array( 1, 6 ), //1 and 6
  'category__in' => array( 1, 6 ), //1 or 6
  'category__not_in' => array( 4, 9 ) //4 と 9 以外
);

タグ

$args = array(
  'tag_id' => 3, //タグID、除外の場合は - (マイナス) で指定
  'tag' => 'html+css',
  'tag__and' => array( 1, 5 ), //1 and 5
  'tag__in' => array( 1, 5 ), //1 or 5
  'tag__not_in' => array( 3, 8 ), //3 と 8 以外
  'tag_slug__and'=> array( 'html', 'css' ),
  'tag_slug__in'=> array( 'html', 'css' )
);

取得した件数は以下のように取得することが可能です。

$wp_query   = new WP_Query($args);
$post_count  = $wp_query->post_count;  //ページに表示した件数
$posts__all = $wp_query->found_posts;  //条件に該当する全件数

以上、wordpressでquery_postsからWP_Queryに書き換える方法と条件指定についてでした。

コメントを残す

メールアドレスが公開されることはありません。