【WordPress】WP_Queryやget_postsで良く使うパラメータまとめ

このブログで良く読まれているのが、カスタムフィールドの絞り込み検索の実装のようです。

絞り込み検索はクエリを指定して該当する投稿をループで表示するというのが基本です。

自分自身も、ワードプレスの投稿をデータをして扱い、クエリを使って必要なデータを取り出す・・・ということが多いので、一番良く使う機能でもあります。

が、クエリで指定するパラメータがなかなか覚えられず、使うたびにリファレンスで確認をしているんですが。

使うものは大体同じで、探すのが面倒なんですよね。

なので、クエリの指定に使用するパラメータの中で良く使うものをピックアップしてまとめておこうかと思います。

WP_Queryとget_postsでパラメータは変わらない

パラメータのまとめに入る前に少し触れておきますが。

WP_Queryでもget_postsでも、クエリで指定するパラメータは変わりません。

ワードプレスの投稿の中から、クエリに当てはまる投稿データの返り方が違うだけなので、取得した投稿データを扱う目的によって使い分けてください。

個人的なWP_Queryとget_postsの使い分けについてはこちら

良く使うパラメータを種類ごとに

ここからパラメータを整理していきますが。

パラメータは連想配列で指定します。

よく見る形では$argに配列をいれ、クエリ関数に渡しているという感じです。

このブログでも良く載せてます。

$args = array(
        'post_type' => post,
//・・・のように条件を連想配列でいれる。
);
//そしてクエリ関数に渡し、投稿データを取得する。
$sub_query = new WP_Query( $args );

なので、この連想配列の中で指定するパラメータを種類ごとにまとめます。

投稿関連

投稿タイプや状態を指定するパラメータは主に2つです。

'post_type' => '投稿タイプ',
'post_status' => '投稿ステータス'
'posts_per_page' => '5', //ページネーションの指定

カスタム投稿タイプを操作することが主なので、’post_type’パラメータは必ず使用します。

通常投稿の’post’、固定ページの’page’、カスタム投稿タイプならそのカスタム投稿タイプ名を指定します。

'post_status’は念のために使用していますが、公開している投稿のみを取得するように’publish’を指定します。

'posts_per_page’で該当する投稿の表示件数を指定。最近は全件表示する案件が増えたので、パラメータを「-1」にすることが多いんですが。

その場合は、キャッシュ系のパラメータを追加すると動作が早くなります。

'no_found_rows' => true,

データベースから投稿データを取得するSQL文が減るので早くなるみたいです。

参考:【WordPress】WP_Query関数のno_found_rowsパラメータについて‐ブログ運営のためのブログカスタマイズ

分類指定

分類というとあれですが、カテゴリーやタグ、カスタムタクソノミーのパラメータです。

まずカテゴリー。

'cat' => 1, //カテゴリーのID指定
'category_name' => 'カテゴリーのスラッグ',

カテゴリーを表す’cat’では、カテゴリーのIDを指定しますが、スラッグ名で指定したい場合は’category_name’を使用します。「,」で区切るとカテゴリーを複数指定できます。

タグはカテゴリーの逆の扱い。

'tag' => 'タグのスラッグ',
'tag_id' => 1, //タグのID指定

個人的にはIDで指定するか、スラッグで指定するかで使う方を分けてますかね。

IDで指定するなら’cat’と’tag_id’、スラッグで指定するなら’category_name’と’tag’という感じです。

そして、カスタムタクソノミーです。

'tax_query' => array(
       relation => 'AND', //複数のタクソノミーを指定する場合
       array(  'taxonomy' => 'タクソノミー名',
               'field'       => '探すタームの種類',
               'terms'    => 'タームの内容',
               ),),

カスタムタクソノミーで絞り込む場合は’tax_query’のパラメータで条件を決めます。

'taxonomy’で条件となるタクソノミーを指定します。

'field’はそのタクソノミーの中の分類(ターム)を指定する場合に、そのタームの指定方法を決めます。

例えば、「レシピ」というタクソノミーで「洋食」と「和食」というタームがある場合、どの条件で探すかを決めるという感じです。

デフォルトはIDで探す’term_id’ですが、ターム名で探す’name’やスラッグで探す’slug’も指定できます。

その’field’で指定した内容で探す値を’terms’で指定します。

//IDで指定
'field' => 'term_id',
'terms' => 1,

//ターム名で指定
'field' => 'name',
'terms' => '洋食',

//スラッグで指定
'field' => 'slug',
'terms' => 'western-food',

並び替え

条件に該当するデータの並び替えを行う場合に指定します。

'orderby' => 'ID', //並び替えに使用する項目
'order'   => 'ASC', //ASC(昇順)かDESC(降順)

複数のカスタム投稿タイプからデータを取得する時は、整理のために使用することもあります。

上記のように、IDのの昇順で整理することがほとんどですが、タイトルを自動でつけたりで規則性がある場合は、’orderby’ => 'title’で並び替えることもあります。

あとは日付指定の’date’を利用しますかね。

カスタムフィールドの指定

カスタムフィールドの指定は良く使用します。

まず単一のカスタムフィールドの場合。

'meta_key'         => 'カスタムフィールドのキー、またはフィールド名',
'meta_value'     => '探すフィールド値',
'meta_compare' => '演算子'

'meta_key’で条件の元となるカスタムフィールドを、フィールド名かフィールドキーで指定します。

自分は、最初にフィールド名で指定してみて、取得できなければフィールドキーで指定してます。

'meta_value’で実際に探す値を指定。絞り込み検索の場合は、ここにフォームから受け取った値を突っ込みます。

//かなり省略して書きますが・・・
//利便性を考えて、変数に格納
$get_value = $_GET['test_name'];

・・・
//クエリパラメータの配列で変数を入れる
'meta_value' => $get_value,
・・・

そして、その値とどのような関係だったらデータを取得するかを、’meta_compare’の演算子で指定します。

演算子については後ほど書きますが、デフォルトでは’meta_value’と一致したらtrueの’=’です。

検索したいカスタムフィールドが複数ある場合は、’meta_query’を使用します。

'meta_query' => array(
      relation => 'AND', //複数のカスタムフィールドを指定する場合の関係
            array( 'key'     => 'カスタムフィールドのキー',
             'value'   => 'カスタムフィールドの値',
             'compare' => '演算子',
             'type'    => '値の型',
      ),
      array( //2つ目のカスタムフィールドの条件を指定 ),
      ),

タクソノミーの’tax_query’に似たような使い方ができます。

個人的にハマったことがあるのが、最後の’type’の型比較ですね。指定しないで進めたところ、データを取得できなかったことがあります。

単一のカスタムフィールドを指定する場合と、複数のカスタムフィールドを指定する場合で分けて書きましたが、コチラは併用することも可能です。

簡易的なものを以前記事にしたので、どのように組み合わせるかご覧いただけます。

演算子

'tax_query’や’meta_query’で指定した値を取得する条件を指定するのが演算子です。

比較するものは以下の通り。

=値と一致
!=値と一致しない
>値より大きい
>=値以上
<値より小さい
<=値以下

一致するかしないかは文字列でも指定できますが、大小の比較は数値のみです。

クエリはデータベースにSQL文でリクエストされるので、SQL文を利用したような比較もできます。

LIKE値で指定した文字列に一致
NOT LIKE値で指定した文字列に一致しない
IN値(配列)のいずれかに一致
NOT IN値(配列)のいずれかにも一致しない
BETWEEN2つの値で指定した範囲内
NOT BETWEEN2つの値で指定した範囲外
EXISTS何かしら値がある
NOT EXISTS値がない

文字列比較の場合は、こちらの演算子を利用すると思い通りの結果になりやすい印象です。

BETWEENを利用する場合、valueにはarray(1,10)のように2つの値を配列でいれます。期間指定や金額設定などの範囲指定をするのに便利。

EXISTSはカスタムフィールドなどに値があるかないかを判定するので、valueを省略することができます。

値が文字列に含まれるかどうかを判定に使う場合にもLIKEがつかえるので、頻度はLIKEが多いですかね。

タイプ

こちらはデータの型を指定する場合に利用します。

カスタムフィールドの値を指定する場合は、タイプも指定しておいた方が確実な印象です。

NUMERIC整数
DECIMAL浮動小数点
SIGNED符号あり整数
UNSIGNED符号なし整数
BINARYバイナリ
CHAR文字列
DATE日付
DATETIME日時
TIME時刻

よく使うのはNUMERIC、CHAR、DATEですかね。

数値関連でNUMERIC以外を使う場合ですが。

浮動小数点とは、小数点ありの実数を扱う整数の形です。

符号あり整数は、先頭で正負を表すデータ型の整数。

符号なし整数は、0と正の数のみ扱えるデータ型整数。

という違いがあります。フィールドのデータ型に合わせて指定すると良いでしょう。

バイナリは・・・利用経験がないんですが、音声ファイルや画像ファイルなどを検索対象にする場合に使用するんでしょうかね。

あとは関数にわたすだけ

ということで、WP_Queryやget_postsのクエリを指定するパラメータについて見てきました。

個人的に良く使うもののみですが、これだけでも絞り込み検索の実装はわかりやすくなると思います。

キーワード検索を利用する’s’も覚えておくのも良いかもしれません。

リファレンスだけでなく、参考にさせて頂いたサイトでは全パラメータが丁寧に解説されてましたので、そちらへのリンクも最後においときます。

参考:これは便利!WordPressのWP_Queryでよく使うコードスニペット‐それからデザイン STAFF BLOG