【WordPress】「get_posts」関数を使ってみた


はじめまして!社会人2年目エンジニアの関です!
今回は、WordPressで開発をする上でなくてはならない「get_posts」について簡単に説明していきたいと思います。

はじめに
get_postsって実際どんなときに使えばいいの?というと、

get_posts の最も適切な使い方は、パラメータに基づいて投稿データの配列を作成することです。最近の投稿あるいはパラメータに一致した投稿を取得します。
参照:WordPress Codex テンプレートタグ/get posts

だそうです。

この条件で記事を取得してきたい。
でもSQLを書くのは苦手。負荷もSQLインジェクションも気になる。
という人にぜひオススメしたい関数です。

※利用目的がよく似ているquery_postsWP_QUERYとの使い分けについては、
以下をご参照ください。
参照:WordPressで押さえておきたい!get_posts,WP_Query,query_posts の違いと用例

パラメータ指定方法
get_postsで利用する主なパラメータは以下の通りです。
※内部的にWP_QUERYを利用するため、WP_QUERYのパラメータも利用可能です。

パラメータ 指定条件 備考
numberposts 取得件数 省略時は5件取得
category カテゴリID 配列で指定
tag_id タグID 配列で指定
orderby 並び替え条件 省略時は日付順(date)
order 並び替え順 省略時はDESC
include 取得したい投稿ID 配列で指定
exclude 取得したくない投稿ID 配列で指定
post_type 投稿タイプ 省略時は記事(post)
post_status 投稿ステータス post_typeがattachmentの場合はinherit
それ以外の場合はpublish 

実際に使ってみる
例えば、最新の公開済み記事の中から5件取得したい場合、以下のように記述します。

$args = array(
     'posts_per_page' => 5,
     'post_status' => 'publish',
     'orderby' => 'date',
     'order' => 'DESC'
);
$posts_arr = get_posts($args);

実行すると、以下のようなクエリが自動的に吐き出されます。

 SELECT wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC LIMIT 0, 5

その他のパラメータ
①カスタムフィールド
カスタムフィールド(postmeta)を指定したい場合、以下のパラメータを使用します。

※複数指定する場合は「meta_query」を使用します。
参照:get_postsで、複数のカスタムフィールドをキーにして検索・取得する方法

  • meta_key
  • meta_value
  • meta_compare(比較演算子)

カスタムフィールド「test」の値が1かつ最新の公開記事の中から5件取得する場合:
●実行するコード

$args = array(
     'posts_per_page' => 5,
     'post_status' => 'publish',
     'meta_key' => 'test',
     'meta_value' => '1',
     'meta_compare' => '==',
     'orderby' => 'date',
     'order' => 'DESC'
);
$posts_arr = get_posts($args);

●上記のコードにより実行されるクエリ

SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND (( wp_postmeta.meta_key = 'test' AND wp_postmeta.meta_value = '1' )) AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5

②期間
投稿日を指定したい場合は、パラメータ「date_query」を使用します。
参照:WordPressのdate_queryパラメータを使って、複雑な期間指定の投稿を取得する

1ヶ月以内に投稿された記事の中からランダムに5件取得する場合:
●実行するコード

$date = date_i18n('Y-m-d', strtotime("-1 month"));
$args = array(
     'posts_per_page' => 5,
     'post_status' => 'publish',
     'date_query' => array('after' => $date),
     'orderby' => 'rand',
);
$posts_arr = get_posts($args);

●上記のコードにより実行されるクエリ

SELECT wp_posts.ID FROM wp_posts WHERE 1=1 AND (wp_posts.post_date > '2016-07-28 23:59:59') AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) ORDER BY RAND() LIMIT 0, 5

(この期間指定の方法を知ったとき、あまりの簡単さに私は感動しました。)

おわりに
WordPress特有の、あまり正規化されていないDBのテーブル構造に悩まされている人も少なからずいると思います。(私も最初は頭を抱えました…orz)

しかし、get_postsのようなWordPress標準の関数を使うと、
この値をSELECTしてきて、あのテーブルをJOINしてきて…といったことを考えずに、SQLを意識することなく、内部でなかなかイイかんじにクエリを生成してくれるので非常に便利です。

WordPressで開発を行う際にはぜひぜひ活用してみてください。