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

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

最終更新日: Update!!
WordPressには様々な条件に対応した投稿記事の情報をデータベースから呼び出すメソッドがいくつか用意されています。今回はその中でも特に使用頻度が高い、サブループ(WP_Query)とget_postsメソッドについて詳しくみていきたいと思います。   この2つのメソッドは特定の条件にマッチした投稿を取得したいときに使われており、両方ともとてもよく似ています。この両者の違いや使い分けを知ることでより効率よくWordPressサイトを作成することができます。どちらか一方しか使わないというのは勿体無いのでこれを機に是非覚えておきたいところですね。  
投稿記事を繰り返し表示させる時に使える「WP_Query」と「get_posts」
まずサブループ(サブクエリとも呼ばれる)として有名な「WP_Query」です。これはWordPressの中で定義されたクラスで投稿データが格納されるものになります。当サイトでも過去にいろんな記事を紹介してきましたのでお馴染みですが、実際のコードはこのように記述していきます。
<?php
  $the_query = new WP_Query(
    array(
      'post_type' => 'post',
      'category_name' => 'news',
      'posts_per_page' => 3
    )
  );
  if ( $the_query->have_posts() ) :
?>
  <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    // 投稿記事を繰り返す部分
  <?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
  まず、WP_Queryクラスのインスタンスを作成し、その引数に取得条件を配列で指定していきます。後述で紹介するget_postsと比較しやすいようにここでは「通常投稿のnewsカテゴリの記事を3件取得する」という条件で紹介していきます。そのインスタンスから、「if〜while」でループ処理を行っていきます。メインクエリを書き換えている形になるので、最後には必ず「wp_reset_postdata()」を実行しておくのがお決まりですね。   それでは、このWP_Queryで取得したデータはどのようになっているかを見ていきます。その場合にはデバッグ方法としてよく使われる「print_r」メソッドを使います。合わせて「pre」要素で囲っておくと見やすくなりますね。
<?php
  .....
  echo '<pre>' . print_r( $the_query ) . '</pre>'; 
  .....
?>
  実際にデバッグを行い、出力された中身を見るとこのようになっていました。一部省略としていますが、query_varsやpostsというキーがついた値を保持するオブジェクト型のデータになっているのがわかります。つまり、WP_Queryで取得したデータには投稿情報だけでなく、検索条件などの投稿情報に付随する様々データも取得することができます。
WP_Query Object (
  [query]
  [query_vars]
  [tax_query]
  [meta_query]
  [posts] (
    [0] (
      [ID] => 292
      [post_title] => 記事タイトル
      [post_content] => 記事の本文テキストです
      [post_type] => post
      [post_date] => 2020-08-24 00:51:53
      .....
    )
    ..... 
  )
  ..... 
)
  続いて、こちらもWordPressの中でよく使われるメソッドの「get_posts」です。これはその名の通り投稿記事を取得するときに使うもので、引数にはWP_Queryと同じように配列で条件を指定します。比較しやすいようにこちらも「通常投稿のnewsカテゴリの記事を3件取得する」という条件で合わせています。そのメソッドの返り値を「foreach」でループ処理を行っていきます。WP_Queryの時と比較するとよりスッキリとしているのがわかりますね。こちらも同じく最後に「wp_reset_postdata」を実行するのですが、ループを繰り返す前に「setup_postdata」を実行しておきます。こうすることで、the_title()などのメソッドもループ内で使えるようになります。ついでに忘れず入れておくようにするといいですね。
<?php
  $posts = get_posts(
    array(
      'post_type' => 'post',
      'category_name' => 'news',
      'posts_per_page' => 3
    )
  );
?>
<?php foreach( $posts as $post) : setup_postdata( $post ); ?>
  // 投稿記事を繰り返す部分
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
  それでは、先ほどと同じく、get_postsで取得したデータはどのようになっているかを見ていきます。今回もその場合にはデバッグ方法としてよく使われる「print_r」メソッドを使います。
<?php
  .....
  echo '<pre>' . print_r( $posts ) . '</pre>'; 
  .....
?>
  実際にデバッグを行い、出力された中身を見るとこのようになっていました。同じく一部省略としていますが、ここでは単純に投稿情報のみが配列となって取得されているのがわかります。先ほどのWP_Queryの時と比べると明らかですね。よりデータ構造もシンプルになっています。
Array (
  [0] (
    [ID] => 292
    [post_title] => 記事タイトル
    [post_content] => 記事の本文テキストです
    [post_type] => post
    [post_date] => 2020-08-24 00:51:53
    ..... 
  )
  [1] (
    [ID] => 294
    [post_title] => 記事タイトルその2
    [post_content] => 記事その2の本文テキストです
    [post_type] => post
    [post_date] => 2020-08-24 00:51:53
  )
  ..... 
)
  つまり、同じように投稿記事を取得するのに使っている、WP_Queryとget_postsも、返り値を比較するとこのように大きな違いがあります。この違いに注意しながら実際にはどのように使い分けていくのかを考えてみます。  
「WP_Query」と「get_posts」の違いと使い分け
このように、サブループとして使われるWP_Queryと、投稿データを取得するメソッドのget_postsでは若干の違いがあります。まとめますと下記のようになるのではないでしょうか。
WP_Query パラメータで指定した条件の投稿をオブジェクトとして受け取る。投稿に付随する情報も合わせて取得できる。whileでループ処理を行う。
get_posts() パラメータで指定した条件の投稿を配列として受け取る。取得できるデータは投稿情報のみとなる。foreachでループ処理を行う。
  やはり取得できるデータの内容と形が異なるという点がポイントになりますね。実際にどのように投稿データを扱うかという視点で適切なものを採用していきたいですね。個人的には下記のような基準で使い分けています。 WP_Query ・サブループとして基本的な投稿データの取得 ・ページ数などの投稿データ以外の情報を扱いたいとき ・WordPressの独自メソッドを使いたいとき ・繰り返し処理の中で複雑な条件分岐を行いたいとき get_posts() ・異なる複数の投稿データを結合させて扱いたいとき ・取得した投稿データを配列処理で加工させたいとき ・少ない投稿データを扱うとき   ちなみにですが、get_postsメソッドを扱う際にはそれ以外にもいくつか注意点がありますが、こちらはまた次回記事にて紹介していきたいと思います。  
  今回は、WordPressのget_posts()を使って取得した投稿をくり返す方法とサブループについて、その違いや使い分けの基準となるポイントについてまとめていきました。WordPressには数多くの便利なメソッドが用意されており、適切に扱うことで効率よく制作を進めていくことができますので是非覚えておきたいですね。   (こちらの記事も参考にどうぞ) ・条件指定して記事を表示させるサブループのWP Queryパラメータ指定方法まとめ ・固定ページでWP_Queryのサブループを使ったアーカイブのページャーを実装する ・WordPressでサブループを使った非同期での無限ローディング機能を作成してみる
  • はてなブックマーク
  • Pocket
  • Linkedin
  • Feedly

この記事を書いた人

Twitter

sponserd

    keyword search

    recent posts

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