あのときコード

カスタムポスト検索で「タイトル」と「カスタムフィールド」のOR検索をする

wordpress 検索 タイトル カスタムポスト カスタムフィールド OR

pre_get_postsの設定

◆ 条件

WordPressのデフォルトである「s」パラメータは使わない

カスタムポスト:custom_post

検索文字列のパラメータ:text

カスタムフィールド:custom_field

add_action('pre_get_posts', 'query_pre_get_posts', 10, 1);

function query_pre_get_posts( $query ) {

    global $wpdb;

    //検索クエリのみ
    if ( is_admin() || !is_search() ) {
        return;
    }

    //検索文字取得
    $search_text = htmlspecialchars($_GET['text']);

    //クエリ設定
    $meta_query = $query->get('meta_query');
    if(!$meta_query || !is_array($meta_query)) {
        $meta_query = array();
    }
       
    $query_ary = array();

    $query_ary['relation'] = 'OR';

    //カスタムフィールドとしてタイトル検索を設定
    $query_ary[] = array(
        'key'	    => 'temp_title',
        'value'    => $search_text,
         'compare'    => 'like',
    );

    $query_ary[] = array(
        'key'	    => 'custom_field',
        'value'    => $search_text,
        'compare'    => 'like',
    );

    $meta_query[] = $query_ary;

    //ポストタイプ指定
    $query->set('post_type', array('custom_post'));

    $meta_query['relation'] = 'AND';

     $query->set('meta_query', $meta_query);
    
}

Where条件変更

pre_get_postsで設定した、タイトルのカスタムフィールド「temp_title」に関するクエリを書き換える。

add_filter('posts_where', 'query_posts_where');

function query_posts_where ($where) {

    //検索クエリのみ
    if ( is_admin() || !is_search() ) {
        return $where;
    }
    
    global $wpdb;

    //temp_titleに関するクエリを書き換え
    $pattern = "/(" . $wpdb->postmeta . "||mt[0-9]).meta_key\s=\s*\\'temp_title\\'\s*and\s*(" . $wpdb->postmeta . "||mt[0-9]).meta_value/i";
    $where = preg_replace($pattern, $wpdb->posts . ".post_title ", $where);

    return $where;
}