【WordPress】管理画面以外でデフォルトの検索を無効にし、オリジナルの検索機能を実装する方法

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

設定を反映する手順

  1. 管理画面で「設定」→「パーマリンク」を開く
  2. 「変更を保存」をクリック これで /custom-search/ のURLで page-custom-search.php が適用されるようになります。

オリジナルの検索機能を適用する

検索フォームの設置とカスタム検索の適用を行い、オリジナルの検索機能が動作することを確認します。

カスタム検索フォームを利用するため、以下のコードを適切なテンプレート(例えば header.php)に追加します。

<?php get_search_form(); ?>

これで、WordPressのオリジナル検索フォームが適用され、検索結果は /custom-search/ に表示されます。

まとめ

  1. WordPressのデフォルト検索を無効化
  2. カスタム検索フォームを作成
  3. カスタム検索結果ページ (page-custom-search.php) を作成
  4. リライトルールを追加してURLを整理
  5. カスタム検索フォームをテンプレートに設置

これにより、WordPressのデフォルトの検索を無効化し、キーワードとカテゴリを組み合わせたオリジナル検索機能を実装できます。