wordpress デフォルトの検索機能の検索範囲を広げる。
wordpressのデフォルトの検索機能が、タイトルと本文の記事からしか検索をしてくれないのですが、
実際は、カテゴリとタグに色々と設定をしてて、その文言も検索してくれないと、困る事の方が多いです。
なので、実際にその作業が必要な事があったので、その忘記録。
fuction.phpに記述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
//サイト内検索 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 = $wpdb->escape("%{$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 p.post_id FROM {$wpdb->postmeta} AS p WHERE p.meta_value LIKE '{$search_word}' ) ) "; } } } return $search; } add_filter('posts_search','custom_search', 10, 2); |
ちなみに、上記の作業にプラス。
searchform.phpの書き換えも必要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php /************************************************************************ * Search Form *************************************************************************/ ?> <div class="widget search-widget"> <form method="get" class="searchform" action="<?php echo esc_url( home_url('/') ); ?>"> <input type="text" placeholder="キーワード" name="s" class="searchfield" value="" /> <input type="submit" value=" " alt="検索" title=" " class="searchsubmit"> </form> </div> |
あとは検索フォームの見た目を、cssで整えます。