WordPressのデフォルトの検索機能では、タイトルや本文からキーワード検索が可能ですが、カスタマイズの自由度が低いことがデメリットです。本記事では、デフォルトの検索を無効化し、オリジナルの検索機能を実装する方法を紹介します。
WordPressのデフォルト検索を無効化する
まず、WordPressのデフォルトの検索機能を無効にします。pre_get_posts フックを使用し、検索クエリの ‘s’ パラメータを空にすることで、検索結果が返らなくなります。
functions.php に以下のコードを追加
// フロントエンドのデフォルト検索を無効化
function disable_default_search($query) {
if ($query->is_search() && !is_admin()) {
$query->set('s', '');
}
}
add_action('pre_get_posts', 'disable_default_search');
このコードを追加することで、管理画面以外の検索機能が無効になります。
カスタム検索フォームを作成
デフォルトの検索ではなく、カスタム検索フォームを作成します。カテゴリを選択できるようにし、検索結果を /custom-search/ に表示するように設定します。
<form method="get" action="<?php echo home_url('/custom-search/'); ?>">
<input type="text" name="s" placeholder="キーワードを入力">
<select name="category">
<option value="">カテゴリ選択</option>
<?php
$categories = get_categories(['hide_empty' => false]);
foreach ($categories as $category) {
echo '<option value="' . esc_attr($category->term_id) . '">' . esc_html($category->name) . '</option>';
}
?>
</select>
<button type="submit">検索</button>
</form>
カスタム検索結果ページを作成
検索結果を表示するためのカスタム検索ページ page-custom-search.php を作成します。
<?php
/*
Template Name: Custom Search
*/
get_header();
// 検索パラメータを取得
$search_query = isset($_GET['s']) ? sanitize_text_field($_GET['s']) : '';
$category = isset($_GET['category']) ? intval($_GET['category']) : '';
// 現在のページ番号を取得(固定ページでは'paged'ではなく'page'にフォールバックする)
$paged = get_query_var('paged') ? get_query_var('paged') : ( get_query_var('page') ? get_query_var('page') : 1 );
// カスタムクエリの設定
$args = [
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged,
's' => $search_query,
];
// カテゴリが指定されている場合
if (!empty($category)) {
$args['tax_query'] = [
[
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => $category,
],
];
}
$custom_query = new WP_Query($args);
if ($custom_query->have_posts()) :
while ($custom_query->have_posts()) : $custom_query->the_post(); ?>
<article>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<p><?php the_excerpt(); ?></p>
</article>
<?php endwhile;
// カスタムクエリでも確実に動作するpaginate_linksを使用
$pagination = paginate_links([
'total' => $custom_query->max_num_pages,
'current' => $paged,
]);
if ($pagination) {
echo '<nav class="pagination">' . $pagination . '</nav>';
}
else :
echo '<p>該当する記事が見つかりませんでした。</p>';
endif;
wp_reset_postdata();
get_footer();
?>
固定ページにテンプレートを割り当てる
page-custom-search.php は「Template Name: Custom Search」という選択式のページテンプレートです。これを使うには、WordPress管理画面で固定ページを作成し、テンプレートとして割り当てる必要があります。
- 管理画面で「固定ページ」>「新規追加」を開く
- パーマリンク(スラッグ)を
custom-searchに設定する - 「ページ属性」パネルの「テンプレート」欄で「Custom Search」を選択し、公開する
- 念のため「設定」>「パーマリンク」を開いて「変更を保存」をクリックし、リライトルールを更新する
固定ページを作成してテンプレートを割り当てれば、WordPress標準の固定ページルーティングだけで
/custom-search/が正しく表示されます。add_rewrite_rule('^custom-search/?$', 'index.php?pagename=custom-search', 'top')のような独自のリライトルールを別途追加する必要はありません(固定ページを作らずリライトルールだけを追加しても、対応する投稿データが無いため404になります)。オリジナルの検索機能を適用する
検索フォームの設置とカスタム検索の適用を行い、オリジナルの検索機能が動作することを確認します。
カスタム検索フォームを利用するため、以下のコードを適切なテンプレート(例えば header.php)に追加します。
<?php get_search_form(); ?>
これで、WordPressのオリジナル検索フォームが適用され、検索結果は /custom-search/ に表示されます。
関連記事
よくある質問(FAQ)
pre_get_postsフックでis_search()とis_main_query()を確認し、検索クエリのsパラメータを空にするか、posts_searchフィルターで検索条件のSQLを上書きします。または検索フォームのactionを独自URLに変更する方法もあります。posts_searchフィルターでデフォルトのSQL検索条件(本文・タイトル・コメント等)をタイトルのみに変更します。グローバルな変更はサイト全体に影響するため条件分岐を適切に設定します。posts_searchフィルターで十分なことが多いです。まとめ
- WordPressのデフォルト検索を無効化
- カスタム検索フォームを作成
- カスタム検索結果ページ (page-custom-search.php) を作成
- 固定ページを作成しテンプレートとして割り当てる
- カスタム検索フォームをテンプレートに設置
これにより、WordPressのデフォルトの検索を無効化し、キーワードとカテゴリを組み合わせたオリジナル検索機能を実装できます。カスタムクエリのページネーションにはpaginate_links()を使うことも忘れないようにしましょう。

