検索フォームのテンプレートファイルを作成(searchform.php)
まずは「キーワード入力欄」と「検索ボタン」を作成します。
これらは複数の箇所で使用することが多いので、「header.php」や「footer.php」のような共通パーツとして作成するのが良いでしょう。
ファイル名を「searchform.php」としてテンプレートファイルを作成したら、コードの中身は以下のようにします。
<form method="get" action="<?php echo esc_url(home_url('/')); ?>">
<input type="text" name="s" id="s" placeholder="キーワードを入力" />
<button type="submit">検索する</button>
</form>
あとは設置したい箇所に以下を描くだけです!
<?php get_search_form(); ?>
検索結果ページのテンプレートファイルを作成(search.php)
ファイル名を「search.php」としてテンプレートファイルを作成します。
以下のコードを記述しましょう。
<?php get_header(); ?>
<main>
<?php if (isset($_GET['s']) && empty($_GET['s'])) { ?>
<p>検索キーワードが入力されていません。</p>
<?php } else { ?>
<h1>
<?php the_search_query(); ?>の検索結果 : <?php echo $wp_query->found_posts; ?>件
</h1>
<ul>
<?php if(have_posts()): ?>
<?php while(have_posts()): the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<h2><?php the_title(); ?></h2>
</a>
<?php endwhile; ?>
<?php else : ?>
<p>一致する記事がありませんでした。</p>
<?php endif; ?>
</li>
<?php
the_posts_pagination( array(
'mid_size' => 1,
'prev_text' => '',
'next_text' => ''
) );
?>
<?php } ?>
</ul>
</main>
<?php get_footer(); ?>
functions.phpに必要な設定を記述
検索条件が未入力時には検索結果は表示しない
デフォルトではキーワードが未入力で検索すると全件表示されてしまいます。
以下を記述するとテンプレート側(seach.php)で記述しておいた、入力がなかったときの処理をしてくれます。
// 検索条件が未入力時にsearch.phpにリダイレクトする
function set_redirect_template(){
if (isset($_GET['s']) && empty($_GET['s'])) {
include(TEMPLATEPATH . '/search.php');
exit;
}
}
add_action('template_redirect', 'set_redirect_template');
検索対象のページタイプを指定
検索対象のページタイプはデフォルトだと「通常の投稿」や「カスタム投稿」「固定ページ」など全てになります。
しかし検索対象になるのは固定ページは対象外にしたい場合が多くあると思います。
その場合は以下を追加してください。
// 検索条件のページタイプを指定する(通常投稿とカスタム投稿)
function SearchFilter( $query ) {
if ( $query -> is_search ) {
$query -> set( 'post_type', array('post','news') );
}
return $query;
}
add_filter( 'pre_get_posts', 'SearchFilter' );
※array()の中にはすべてのカスタム投稿のスラッグを入れてください。入れない場合、検索対象から除外されます。