UPDATE:2023.8.24
- CATEGORY
wordpressのサイト内検索にカスタムフィールドも含めたい!
こんにちは、かずです。前回に引き続きwordpressのカスタマイズについてです。
今回はサイトに実装されているとちょっと便利なサイト内検索について。
実装も難しくないんですが、問題が!
それは、wordpressのサイト内検索はデフォルトではカスタムフィールドに入れたテキストは含まれません。
そこで再びご用意いただくものは「functions.php」
こちらに以下を追記しましょう。
ちょっと解説。
3行目の$post_arrayには検索に含めいたい投稿タイプを記述します。
post → 投稿
page → 固定ページ
hogehoge → カスタム投稿タイプ
といった具合です。
4〜6行目は、検索に含めたくないページを指定しています。
この記述例ですと、お問い合わせのサンクスページや確認画面といった具合です。
たくさんカスタムフィールドを使って更新しやすくしたのに表示されないなんて切ないので是非有効活用してください!
それでは。
function filter_search($query){
if ($query->is_search() && $query->is_main_query() && !is_admin()) {
$post_array = array('post', 'page', 'hogehoge');
$contact_confirm = get_page_by_path('contact/confirm')->ID;
$contact_thanks = get_page_by_path('contact/thanks')->ID;
$not_in_array = array($contact_confirm, $contact_thanks);
$query->set('post_type', $post_array);
$query->set('post__not_in', $not_in_array);
}
}
add_filter('pre_get_posts', 'filter_search');
//検索
function custom_search($search, $wp_query){
global $wpdb;
if (!$wp_query->is_search) return $search;
if (!isset($wp_query->query_vars)) return $search;
$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
if (count($search_words) > 0) {
$search = '';
foreach ($search_words as $word) {
if (!empty($word)) {
$search_word = '%' . esc_sql($word) . '%';
$search .= " AND (
{$wpdb->posts}.post_title LIKE '{$search_word}'
OR {$wpdb->posts}.post_content LIKE '{$search_word}'
OR {$wpdb->posts}.ID IN (
SELECT distinct r.object_id
FROM {$wpdb->term_relationships} AS r
INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
WHERE t.name LIKE '{$search_word}'
OR t.slug LIKE '{$search_word}'
OR tt.description LIKE '{$search_word}'
)
OR {$wpdb->posts}.ID IN (
SELECT distinct post_id
FROM {$wpdb->postmeta}
WHERE meta_value LIKE '{$search_word}'
)
)";
}
}
}
return $search;
}
add_filter('posts_search', 'custom_search', 10, 2);