WordPressのカスタムフィールドを検索する

WordPressの検索機能をカスタマイズしてみました。

検索プラグインがいくつかあるのですが、「fe-advanced-search」は、アドバンスカスタムフィールドプラグインに対応しておらず、なんだかんだといって、自作することにしました。

 

WordPressカスタムフィールドを検索させるのにちょっとハマったりしましたので基本的なところからメモを残していきたいと思います。

 

カスタムフィールドを検索できるようにするための下準備

まずは、wp_postsだけがSQLの対象となっているのでJOINでpostmetaを結合する関数を追加します。

function posts_join_custom_fields( $join, $query ) {
    if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) {
        global $wpdb;
        $join ="INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)";
    }
    return $join;
}
add_filter( 'posts_join', 'posts_join_custom_fields', 10, 2 );

※管理画面以外、接続するようにしています。INNERで結合しているのでpostmetaに値があることが前提です。利用するカスタム投稿等によっては、上記の記述だと問題があると思いますので、どの画面で対象にするのか条件分を記述したほうが良いです。

 

 

次にカスタムフィールド(テキスト)を検索対象にしてみます。

「$search」の最初に「AND」でWHEREの追加をします。

その後、「meta_key=カスタムフィールド」、「meta_value=検索値」で絞り込んでいます。

function custom_search($orig_search, $query) {
    if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) {
        global $wpdb;

        $search =' AND ';
        $search .="($wpdb->postmeta.meta_value  LIKE '%日本橋%' and $wpdb->postmeta.meta_key = 'カスタムフィールド名')";
        return $search;
    }
    return $orig_search;
}
add_filter('posts_search','custom_search', 10, 2);

 

このあたりを基本系としてあとは、発展していった内容を記述していけばよいかと思います。