閉じる

WordPressのWP_Queryでカスタムフィールドを使って記事を絞り込む方法と注意点

WordPressのサイト制作において、カスタムフィールドの内容に基づいて記事を抽出し、表示内容を動的に変更したい場面は非常に多く存在します。

WP_Queryクラスを活用することで、特定のカスタムフィールドを持つ記事や、特定の値に合致する記事だけを効率的に取得することが可能になります。

本記事では、WP_Queryにおけるカスタムフィールドの絞り込み設定である「meta_query」の基本的な書き方から、複数の条件を組み合わせた高度な検索方法まで詳しく解説します。

柔軟なデータ取得を実現するためのテクニックを身につけ、WordPressサイトのカスタマイズ性をさらに高めていきましょう。

WP_Queryによるカスタムフィールド絞り込みの基本

WordPressでカスタムフィールドを用いた絞り込みを行うには、WP_Queryの引数として「meta_query」を使用します。

基本的な絞り込みでは、フィールドの名前を指定するmeta_keyと、比較したい値を指定するmeta_value、そして比較方法を指定するcompareを組み合わせて記述します。

まずは、最もシンプルな「特定のフィールドに特定の値が入っている記事」を取得するコード例を見てみましょう。

PHP
$args = array(
    'post_type' => 'post',
    'meta_query' => array(
        array(
            'key'     => 'recommend_flag', // カスタムフィールドのキー
            'value'   => '1',              // 比較する値
            'compare' => '='               // 比較演算子(一致するもの)
        ),
    ),
);
$query = new WP_Query($args);
実行結果
// 実行結果:カスタムフィールド「recommend_flag」の値が「1」である投稿のみが取得されます。

このように、meta_queryは多次元配列の形式で記述するのが標準的なルールとなっています。

単一の条件であれば、'meta_key' => 'key_name'のように直接指定することも可能ですが、拡張性を考慮して常に配列形式で記述することをおすすめします。

meta_queryで使用できる比較演算子の種類

カスタムフィールドの値をどのように比較するかは、compareパラメータによって決まります。

デフォルト値は「=」ですが、数値の大小比較や曖昧検索など、多様な条件を指定することができます。

利用頻度の高い比較演算子を以下の表にまとめました。

演算子説明
=指定した値と等しい。
!=指定した値と等しくない。
>指定した値より大きい。
>=指定した値以上。
<指定した値より小さい。
<=指定した値以下。
LIKE指定した文字列を含む(部分一致)。
NOT LIKE指定した文字列を含まない。
IN配列で指定した複数の値のいずれかに合致する。
NOT IN配列で指定した複数の値のいずれにも合致しない。
BETWEEN指定した値の範囲内にある(数値や日付で使用)。
EXISTSカスタムフィールドのキー自体が存在する。
NOT EXISTSカスタムフィールドのキー自体が存在しない。

特に「EXISTS」や「NOT EXISTS」は、値に関わらず「その項目が設定されているかどうか」で判定できるため非常に便利です。

複数のカスタムフィールド条件を組み合わせる方法

実務では「価格が1,000円以上」かつ「在庫がある」といった、複数のカスタムフィールドを条件にしたいケースがよくあります。

このような場合は、meta_queryの中に複数の配列を並べ、それらの関係性をrelationパラメータで指定します。

relationには、すべての条件を満たす場合に取得する「AND」と、いずれかの条件を満たす場合に取得する「OR」が指定可能です。

PHP
$args = array(
    'post_type' => 'product',
    'meta_query' => array(
        'relation' => 'AND', // 条件をすべて満たす必要がある(省略時はAND)
        array(
            'key'     => 'price',
            'value'   => 1000,
            'compare' => '>=',
            'type'    => 'NUMERIC'
        ),
        array(
            'key'     => 'stock_status',
            'value'   => 'instock',
            'compare' => '='
        ),
    ),
);
$query = new WP_Query($args);

上記のコードでは、価格が1,000円以上かつ在庫ステータスが「instock」である投稿を取得しています。

relationを指定しない場合はデフォルトで「AND」として扱われるため、必要に応じて使い分けましょう。

さらに複雑な「(A かつ B) または (C かつ D)」といった入れ子構造の条件(ネスト)も構築することが可能です。

数値や日付で絞り込む際の注意点とtypeパラメータ

カスタムフィールドの値はデータベース上では基本的に「文字列(文字列型)」として保存されています。

そのため、数値の比較(大小比較など)を行う際には、正しく計算されるようにデータ型を明示する必要があります。

そこで重要になるのが「type」パラメータです。

PHP
array(
    'key'     => 'item_score',
    'value'   => 80,
    'compare' => '>',
    'type'    => 'NUMERIC' // 数値として比較する
)

typeを指定しない場合、「10」よりも「2」の方が大きいと判定されるなど、文字列としての並び順で評価されてしまい、意図しない結果を招くことがあります。

数値比較を行う際は、必ず'type' => 'NUMERIC'を指定するようにしてください。

日付で絞り込みを行う場合も同様に、'type' => 'DATE''type' => 'DATETIME'の指定が推奨されます。

WordPressで利用できる主なデータ型には以下のようなものがあります。

  • NUMERIC:整数として扱う。
  • DECIMAL:小数点を含む数値として扱う。
  • DATE:日付として扱う。
  • DATETIME:日時として扱う。
  • CHAR:文字列として扱う(デフォルト)。
  • BINARY:大文字小文字を区別するバイナリとして扱う。

カスタムフィールドの絞り込みにおけるパフォーマンスの注意点

カスタムフィールドによる絞り込みは非常に強力ですが、大量の投稿データがある環境では、クエリの実行速度が低下する可能性があります。

WordPressのデータベース構造上、カスタムフィールドが保存されるwp_postmetaテーブルは、投稿情報とは別の場所にあります。

絞り込みを行うたびにテーブルの結合(JOIN)が発生し、特に複雑なmeta_queryや「LIKE」演算子による曖昧検索は、サーバーに大きな負荷をかけがちです。

パフォーマンスを改善するためには、以下のような対策を検討しましょう。

1. 絞り込み条件をできるだけ絞る:タクソノミー(カテゴリーやタグ)との組み合わせを活用し、検索対象となる投稿数を事前に減らすことが有効です。

2. キャッシュの活用:クエリの結果を「Transients API」などで一時的に保存し、毎回データベースへ問い合わせない工夫が必要です。

3. 検索プラグインや外部検索エンジンの利用:極端に件数が多い場合は、Elasticsearchなどの専用検索エンジンを導入することも一つの選択肢です。

特に'compare' => 'NOT IN''compare' => 'NOT LIKE'といった「否定」の条件は、データベースのインデックスが効率的に機能しにくいため、多用には注意が必要です。

実践例:特定の価格範囲と公開日の記事を取得する

最後に、これまでの内容を応用した具体的な実装例を紹介します。

「価格が5,000円から15,000円の間」かつ「2024年以降に公開された」記事を取得する設定です。

PHP
$args = array(
    'post_type'      => 'product',
    'posts_per_page' => 10,
    'meta_query'     => array(
        'relation' => 'AND',
        array(
            'key'     => 'product_price',
            'value'   => array(5000, 15000),
            'compare' => 'BETWEEN',
            'type'    => 'NUMERIC'
        ),
        array(
            'key'     => 'release_date',
            'value'   => '2024-01-01',
            'compare' => '>=',
            'type'    => 'DATE'
        ),
    ),
    'orderby' => 'meta_value_num',
    'meta_key' => 'product_price',
    'order' => 'ASC'
);

$query = new WP_Query($args);

この例ではBETWEENを使用して範囲指定を行い、同時に公開日の比較も行っています。

また、orderbymeta_value_numを指定することで、絞り込んだ結果を価格の安い順に並べ替えて表示させています。

カスタムフィールドを絞り込みだけでなく、並び替えの基準としても活用できる点は非常に重要です。

まとめ

WP_Queryのmeta_queryを活用すれば、WordPressの標準的な投稿機能を超えた、高度なデータ表示システムを構築できます。

基本となるkeyvaluecompareの組み合わせを理解し、さらにtypeパラメータを適切に設定することが成功の鍵です。

ただし、カスタムフィールドの絞り込みは多用しすぎるとサイトの表示速度に影響を及ぼすことがあるため、パフォーマンス面への配慮も忘れないようにしましょう。

今回の内容を参考に、ユーザーにとって価値のある、最適な情報の絞り込み機能を実装してみてください。

URLをコピーしました!