カスタムポスト検索で「タイトル」と「カスタムフィールド」の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; }