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']) : '';
// カスタムクエリの設定
$args = [
'post_type' => 'post',
'posts_per_page' => 10,
'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;
the_posts_pagination();
else :
echo '<p>該当する記事が見つかりませんでした。</p>';
endif;
wp_reset_postdata();
get_footer();
?>
/custom-search/ で検索結果を表示できるようにする
/custom-search/ を検索結果ページとして利用するために、リライトルールを追加します。
functions.php に以下のコードを追加
function custom_search_rewrite_rule() {
add_rewrite_rule('^custom-search/?$', 'index.php?pagename=custom-search', 'top');
}
add_action('init', 'custom_search_rewrite_rule');
設定を反映する手順
- 管理画面で「設定」→「パーマリンク」を開く
- 「変更を保存」をクリック これで /custom-search/ のURLで page-custom-search.php が適用されるようになります。
オリジナルの検索機能を適用する
検索フォームの設置とカスタム検索の適用を行い、オリジナルの検索機能が動作することを確認します。
カスタム検索フォームを利用するため、以下のコードを適切なテンプレート(例えば header.php)に追加します。
<?php get_search_form(); ?>
これで、WordPressのオリジナル検索フォームが適用され、検索結果は /custom-search/ に表示されます。
まとめ
- WordPressのデフォルト検索を無効化
- カスタム検索フォームを作成
- カスタム検索結果ページ (page-custom-search.php) を作成
- リライトルールを追加してURLを整理
- カスタム検索フォームをテンプレートに設置
これにより、WordPressのデフォルトの検索を無効化し、キーワードとカテゴリを組み合わせたオリジナル検索機能を実装できます。