owned mediaウェブ制作に役立つコンテンツを発信中!

WordPressのget_posts()を使って取得した投稿を繰り返す方法とサブループについて(#2:get_postsの注意点)

最終更新日: Update!!
前回記事「WordPressのget_posts()を使って取得した投稿を繰り返す方法とサブループについて(#1:違いと使いわけ)」でサブループを使うときに登場するWP_Queryと、指定したパラメーターで投稿を取得するget_posts()について、違いや使い分けをまとめていましたが、今回はget_posts()を使う上で気をつけておきたい点を見ていきたいと思います。   前回記事でも触れていますが、WP_Queryとget_posts()が似ているということで、同じように使っていると思わぬところで落とし穴にハマってしまいます。どういったところに注意すべきか覚えておきたいですね。  
1. 一部のパラメーターがWP_Queryの場合と表記が異なる
WP_Queryでもget_posts()でも取得する記事の条件にパラメーターで指定する形になります。この点については両者とも同じなのですが、このパラメーターの一部に表記が異なるものがあります。まず、通常投稿のうち指定した投稿IDを除く投稿データを取得する例を見ていきます。まずはWP_Queryの場合は下記のようになります。
<?php
  $the_query = new WP_Query(
    array(
      'post_type' => 'post',
      'post__not_in' => array( 110, 167, 189, 204 )
    )
  );
  if ( $the_query->have_posts() ) :
?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
  ................
  このように「post__not_in」で除外したい投稿IDを配列で指定する形になります。続けて同じ条件でのget_posts()の場合を見ていきます。
<?php
  $posts = get_posts(
    array(
      'post_type' => 'post',
      'exclude' => array( 110, 167, 189, 204 )
    )
  );
?>
<?php foreach( $posts as $post) : setup_postdata( $post ); ?>
  ................
  どちらも指定した投稿IDの配列を当てていますが、get_postsの場合には「exclude」というパラメーター名になっています。このように全てではないものの、一部パラメーター名が異なる点に注意していきます。ちなみにget_postsでの各パラメーターの初期値はこのようになっています。
<?php $args = array(
  'posts_per_page' => 5,
  'offset' => 0,
  'category' => '',
  'category_name' => '',
  'orderby' => 'date',
  'order' => 'DESC',
  'include' => '',
  'exclude' => '',
  'meta_key' => '',
  'meta_value' => '',
  'post_type' => 'post',
  'post_mime_type' => '',
  'post_parent' => '',
  'author' => '',
  'post_status' => 'publish',
  'suppress_filters' => true 
);
$posts_array = get_posts( $args ); ?>
  ほとんどはWP_Queryと同じ見慣れたものが並びますが、下記のパラメーターについては異なるので覚えておくといいですね。
取得するカテゴリID 【get_posts】category /【WP_Query】cat
取得する複数の投稿ID指定 【get_posts】include /【WP_Query】post__in
除外する複数の投稿ID指定 【get_posts】exclude /【WP_Query】post__not_in
  また、「suppress_filters」はフィルタリングの有効化を示すパラメーターで、get_posts()の場合にはデフォルトで「true」となっており、pre_get_postsなどのフィルターフックで使う場合には「false」に設定する必要があります。これも合わせてチェックしておきましょう。  
2. 投稿の先頭に固定表示が有効にならない
もう一点、get_posts()を扱う上で厄介なものがあります。それは、先頭に固定表示されている投稿の並び順が無視されてしまうという点です。WP_Queryのパラメーターの中に「ignore_sticky_posts」というものがあり、こちらは「true」にすることで、先頭に固定表示を無視することができます。
<?php
  $the_query = new WP_Query(
    array(
      'post_type' => 'post',
      'ignore_sticky_posts' => false
    )
  );
  if ( $the_query->have_posts() ) :
?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
  ................
 
'ignore_sticky_posts' => false 投稿の先頭に固定表示を有効とする(設定されているものは1番目で取得される)
'ignore_sticky_posts' => true 投稿の先頭に固定表示を無視する(設定されていても元の順番で取得される)
  これが、get_posts()の場合、常に「true」となるので、通常通りに取得してしまうと、先頭に固定表示されている投稿も1番目に取得できないようになってしまいます。そこで、少し面倒ですが、はじめに先頭に固定表示されている投稿だけを取得します。そして続けて、先頭に固定表示されている投稿を除外した投稿を取得し、それらの配列をつなぎ合わせることで、先頭に固定表示した投稿を有効化させた並び順にすることができます。
<?php
  $sticked_posts = get_posts(
    array(
      'include' => get_option( 'sticky_posts' ),
      'posts_per_page' => -1
    )
  );
  $regular_posts = get_posts(
    array(
      'exclude' => get_option( 'sticky_posts' ),
      'posts_per_page' => 10 - count( $sticked_posts )
    )
  );
  $posts = array_merge( $sticked_posts, $regular_posts );
?>
<?php foreach( $posts as $post) : setup_postdata( $post ); ?>
  ................
  ポイントになるのが、最初に先頭に固定表示されている投稿の取得で「get_option( 'sticky_posts' )」の返り値を「include」で指定している点です。これに該当する全ての投稿を取得することで、先頭に固定表示が適用されている投稿の配列が出来上がります。   そして、それ以外の投稿を取得する際には先ほどとは逆に「get_option( 'sticky_posts' )」の返り値を「exclude」で指定し、指定した表示件数から、先頭に固定表示が適用されている投稿数を引いた数を設定しておきます。こうすることで、先頭に固定表示の投稿を含めながら、表示件数内に収めることができます。  
  第二回にわたり、get_posts()とサブループのWP_Queryでの投稿取得方法について、その違いと使い分け、そして注意点などをまとめてきました。 (関連記事) 「WordPressのget_posts()を使って取得した投稿を繰り返す方法とサブループについて(#1:違いと使いわけ)」   シンプルなWordPressサイトの場合にはそんなに気にしなくてもいいのですが、複雑なカスタマイズが入ってくるとこれらを駆使しながら機能を実装していくことになるので、このような知識はあらかじめ入れておきたいですね。   (参考にさせて頂いたサイト) ここまで違う!WordPressの[WP_Query]と[get_posts()]の特性を暴いてみる テンプレートタグ:get posts
  • はてなブックマーク
  • Pocket
  • Linkedin
  • Feedly

この記事を書いた人

Twitter

sponserd

    keyword search

    recent posts

    • Twitter
    • Github
    contact usscroll to top
      • Facebook
      • Twitter
      • Github
      • Instagram