ワードプレスでカスタムフィールドを検索にORで含む方法を解説いたします。この方法はs=の一般検索も同時に行います。


ワードプレスのテキスト検索、もしくはカスタムフィールドの複数の値を検索に含むWP_Query

WP_Queryはワードプレスの投稿を取得する関数です。

検索結果を返す単純なWP_Queryは下記のようになります。

$q = urldecode($_GET["s"]);
$args = [
    "post_type" => "post",
    "s" => $q,
    "posts_per_page" => -1, //取得する数ー1は無制限
];
$search_result = new WP_Query($args);

カスタムフィールドをOR(どれかを含む)検索するクエリは下記のようになります

$q = urldecode($_GET["s"]);
$arg_metaquery = array(
    "post_type" => "post",
    "posts_per_page"    => -1, //取得する数ー1は無制限
    "meta_query"    => array(
        'relation'      => 'OR',
        array(
            'key'       => 'カスタムフィールドのキー(スラグ)',
            'value'     => $q, //検索したい値
            'compare'   => 'LIKE',
        ),
        array(
            'key'       => '他のカスタムフィールドのキー(スラグ)',
            'value'     => $q,
            'compare'   => 'LIKE', //検索したい値
        ), //いくつでも増やせます
    ),
);

$search_result2 = new WP_Query($arg_metaquery);

‘relation’ => ‘OR’, にするといずれかのカスタムフィールドに文字列を含む投稿を取得します。
上記の二つを組み合わせることでタイトルや本文の検索結果と、カスタムフィールド値のすべてを組み合わせてどれかに含む検索結果を得ることができます。

$allresult = new WP_Query();
$allresult->posts = array_unique( array_merge( $search_result->posts, $search_result2->posts ), SORT_REGULAR );

while ($allresult->have_posts()) : $allresult->the_post(){
    $post_id = $post->ID; //取得した投稿のID
}

$allresult  で空っぽのWP_Queryを作り、array_mergeで二つの検索結果を連結し array_uniqueで重複を削除します。

$allresult->posts にこの結果の取得投稿リストが入りますので後は

while ($allresult->have_posts()) で一般的なワードプレスのループ処理を使用できます。
ご参考になりましたら幸いです。

WordPress ワードプレスの検索のカスタマイズのご依頼・ご相談はWPドクターまでお気軽にお送りください