お問い合わせ・無料相談
WEBのこと 2023.08.24

wordpressのサイト内検索にカスタムフィールドも含めたい!

WRITER
Hirabayashi Kazuaki コーダー
Hirabayashi Kazuaki

コーダー。WordPressでのオリジナルテーマ作成・カスタマイズが得意。

wordpressのサイト内検索にカスタムフィールドも含めたい!

こんにちは、かずです。

前回に引き続きwordpressのカスタマイズについてです。

今回はサイトに実装されているとちょっと便利なサイト内検索について。

実装も難しくないんですが、問題が!

それは、wordpressのサイト内検索はデフォルトではカスタムフィールドに入れたテキストは含まれません。

そこで再びご用意いただくものは「functions.php」

こちらに以下を追記しましょう。

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);

インデントはあえて入れてませんが普段はタブ2個派です。

ちょっと解説。
3行目の$post_arrayには検索に含めいたい投稿タイプを記述します。
post → 投稿
page → 固定ページ
hogehoge → カスタム投稿タイプ
といった具合です。

4〜6行目は、検索に含めたくないページを指定しています。
この記述例ですと、お問い合わせのサンクスページや確認画面といった具合です。

たくさんカスタムフィールドを使って更新しやすくしたのに表示されないなんて切ないので是非有効活用してください!

それでは。

JOURNALが気に入ったら「いいね」してね!

Contact

ブランディング・WEB制作・運用まで、まずは一度お話を聞かせてください。 初回のご相談は無料で承っています。

お電話

0120-622835

10:00〜18:00 / 土日祝休

メールフォーム

お問い合わせはこちら