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