ワードプレスで特定のカスタムポストタイプに限定し、特定のカスタムフィールドのみを対象にして検索する方法をご紹介します。

ワードプレスの検索に割り込んで、検索条件を変えます

※下記のコードはテーマのFunctions.phpに追加すると動作します。

コードの例は下記のようになります。

function mySearchFilter($query) {
    
    if ($query->is_search && ! is_admin()) { //0
     
        $query->set('post_type', array('検索を限定したいカスタム投稿タイプのスラグ')); //1
        
        if(isset($_GET['s'])){
            $keyword=esc_html($_GET['s']); 
        }
        
        if(! empty($keyword)){
            $query->set('s', '');//2
            
            $meta_query_args = array(
                'relation' => 'OR', //3
                array(
                    'key' => '検索対象にしたいカスタムフィールドのスラグ1', //4
                    'value' => $keyword,
                    'compare' => 'LIKE' //5
                ),
                array(
                    'key' => '検索対象にしたいカスタムフィールドのスラグ2',
                    'value' => $keyword,
                    'compare' => 'LIKE'
                ),
                
            );
            $query->set('meta_query', $meta_query_args); //6
        }
        
    };
    return $query;
};

add_filter('pre_get_posts','mySearchFilter');

コードの解説

ワードプレスの検索に割り込むにはadd_filter(‘pre_get_posts’, 関数を使います。このフィルタを使う事により、ワードプレスが検索を実行する直前に割り込んで検索する条件を書き換えることが可能です。

0 if ($query->is_search && ! is_admin()) { この条件はワードプレスが検索を実行し、かつ管理画面でない場合にのみ以下の処理を行うという意味になります。

1 $query->set(‘post_type’, で’検索を限定したいカスタム投稿タイプのスラグ’ の部分に指定された投稿タイプに検索を限定します。

2 $query->set(‘s’, ”);今回のコードではカスタムフィールドのみを検索対象にしたいため、ワードプレスがタイトルやコンテンツを検索するクエリを空にして全部のカスタム投稿が引っかかるようにします。

※全部ひっかけたうえでその後に続くメタクエリで検索を限定する形になります。

3 ’relation’ => ‘OR’,  OR検索で、複数のカスタムフィールドのどこかにキーワードがある場合の検索結果を返します。

4 ’検索対象にしたいカスタムフィールドのスラグ1’、’検索対象にしたいカスタムフィールドのスラグ2’ に検索対象にしたいカスタムフィールドを指定します。この検索条件に含めるカスタムフィールドはいくつでも増やすこと可能です。

5 ’LIKE’このLIKEはMysqlで言えば %LIKE%と同じ意味になります。指定したカスタムフィールドにキーワードを含む場合(部分一致)に検索にヒットするようになります。

ご参考になりましたら幸いです。

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