カルキチブログ

WordPressでよく使う!WP_Queryとget_postsの違い

恥ずかしながら、WP_Queryとget_postsに違いがあるということを昨日初めて知ったので、軽くまとめてみました。

WP_Queryに関しては、以前記事を書いたのでもっと詳しく知りたい方はこちらの記事をお読みください。

WordPressを使うなら知っておきたい!WP_Queryの使い方

WP_Queryとget_postsとは?

WP_Queryとget_postsとは簡単に説明すると、カスタムループ(投稿一覧などとは別に存在するループ)を作って、自由に投稿を取得することができるWPのクラスとメソッドです。

WP Queryにしかない特徴

まずは、WP_Queryにしかない特徴から書いていきます。

僕はget_postsよりもWP_Queryのがよく使う気がします。

WP_Queryは投稿を表示する時にはwhileを使用する

<?php
  $args = [
    'post_type' => 'shop_info',
    'post_status' => 'publish',
    'posts_per_page' => 3,
  ];
  $query_instance = new WP_Query($args);
?>
<?php if ($query_instance->have_posts()): while ($query_instance->have_posts()): $query_instance->the_post(); ?>
  <h2>
    <a href="<?= get_the_permalink($shop->ID) ?>">
      <?= $shop->post_title ?>
    </a>
  </h2>
<?php 
  endwhile; 
  endif; 
  wp_reset_postdata(); 
?>

WP_Queryに関しては、冒頭でも述べたように以前記事を執筆したので、詳しく知りたい方はこちらの記事を読んでいただければと思います。

WP Queryは投稿の情報を持ったインスタンスを生成して、have_posts()で表示する投稿があるかどうかチェックし、投稿があったらthe_post()でループを実行することで投稿を自由に表示することができます。

WP Queryは投稿データ以外にもページの情報も取得できる

ここが一番大きな違いっぽいです。

WP_Queryは投稿データ以外にも表示されているページそのものの情報も取得できます。

表示されているページが投稿ページなのか固定ページなのかや、リクエストされたクエリの情報(パーマリンクや筆者、設定されているカテゴリーなど)も取得できます。

get_postsにしかない特徴

続いてはget_postsにしかない特徴について書いていきます。

get_postsはループする時にはforeachを使用する

get_postsは投稿を取得する時にこんな感じで書きます。

<?php
  $args = [
    'post_type' => 'shop_info',
    'post_status' => 'publish',
    'posts_per_page' => 3,
  ];
  $shop_posts = get_posts($args);
  foreach($shop_posts as $shop): 
?>
  <h2>
    <a href="<?= get_the_permalink($shop->ID) ?>">
      <?= $shop->post_title ?>
    </a>
  </h2>
<?php endforeach ?>

get_postsは投稿の情報を持った配列を返すメソッドなので、foreachで処理が可能です。

WP_Queryと違い、have_posts()とかで投稿があるかどうかの判定を行う必要がない分シンプルに書ける印象はあります。

get_postsは記事に関する情報しか取得できない

get_postsはWP_Queryと異なり記事に関する情報しか取得できません。

逆に言えば、投稿データ以外の情報は必要ないという時はget_postsで十分と言えます。

条件に合致した投稿が存在しない時は空のオブジェクトが返却されるので、一致する投稿がない時は要素ごと非表示にしたいという時はget_postsのがいいかもしれないです。

→WP_Queryだと条件に合致する記事がなかったとしても、is_single()やis_page()など表示されているページに関する情報は取得される為、上記のような使い方は多分できないと思います。

get_postsはWP_Queryのラッパー

ここは興味ある人だけ読んでいただければ大丈夫です。

意味わからない人はすっ飛ばしてもらって構いません。

実はget_postsはWP_Queryのラッパーです。

某ウェブ制作会社のブログに書いてあったのを見て知ったのですが、本当なのかどうか僕の方でも実際に調べてみました。

wp-includesディレクトリに対してget_postsで検索をかけてみました。

見つかりました。

$defaultsには、post_typeやorderbyなど投稿に関係するようなものが初期値として設定されていることがわかります。

見つかったコードをスクロールしていくと、、、

ありました!

get_postsのなかでWP_Queryを呼び出して、queryでメソッドの実行結果のみを戻り値として返しています。

get_postsはWP_Queryのラッパーというのは間違いなさそうです。

どちらにも共通すること

違いもありますが、共通点も多いです。

  • 投稿データを取得する時に使用される
  • カスタムループを作成する際に使用される
  • オプションとして指定できる引数は共通のものが多い

基本は好きな方を使うという感じで問題はないような気はします。

まとめ

  • WP_Queryとget_postsとは、投稿を自由に取得したい時に使うクラスとメソッド
  • 基本は好きな方を使っておいて大丈夫
  • 対応が難しい時は、使い分けましょう

おまけ

本日の記事の内容とは全く関係がないのですが、最近キーボード打ちすぎて指というか腕が痛いです。。。

土日もコード書きたいけど、腕は休めなければダメなのかもしれないです。

疲れ知らずの強靭な指とリスト(手首)が欲しいです。