問題
Wordpressのサイト内検索を構築するには?
解決策
フォームと、検索結果ページのテンプレートファイル「search.php」を作成する。
サイト内検索フォーム
まず、Wordpressのサイト内検索フォームの作成を行います。
記述例は以下になります。
<form role="search" method="get" class="searchform" action="自サイトのトップページ">
<input type="text" name="s" class="s" placeholder="サイト内検索" value="<?php if(!empty($_GET['s'])): echo $_GET['s']; endif; ?>" />
<input type="image" class="searchsubmit" src="<?php echo $module_path ;?>images/common/anchor-search.png" alt="検索" width="30" height="30" />
</form>
- 「method=”get” action=”自サイトのトップページ”」に設定したフォームを用意し、検索入力フィールドのname属性に「s」を指定します。
サイト内検索結果ページ
そしてサイト内検索結果ページの作成を行います。
テンプレートファイル「search.php」を作成し、その中に記述していきます。
検索結果の情報を取得
検索結果の情報を事前に変数に格納しておきます。
global $wp_query;
$total_results = $wp_query->found_posts;
$search_query = get_search_query();
found_posts | 「$wp_query->found_posts」で、記事の総数を取得します。 |
---|---|
get_search_query() | サイト内検索を行ったときのクエリ文字列を取得します。 |
サイト内検索の検索キーワード「$_GET[‘s’]」を元に処理を振り分ける。
以下のパターンに応じて処理を振り分けます。
- 検索条件が入力されていない場合
- 検索条件に該当する記事がない場合
- 検索条件に該当する記事がある場合
<?php if (isset($_GET['s']) && empty($_GET['s'])) :?>
<p>検索条件が入力されていません。</p>
<?php elseif($total_results == 0 ): ?>
<p>「<?php echo $search_query; ?>」 に一致する情報は見つかりませんでした。</p>
<?php
else:
// 検索条件に該当する記事がある場合の処理
endif;
?>
検索条件に該当する記事を出力する。
ループ処理のパラメータ設定で「’s’ => $s,」を設定し、出力処理を行います。
<?php
$s = $_GET['s'];
$args = array(
'posts_per_page' => -1,
's' => $s,
'paged' => $paged
);
$my_query = new WP_Query($args);
if($my_query->have_posts()):
?>
<h3>「<?php echo $search_query; ?>」の検索結果<span>(<?php echo $my_query->found_posts; ?>件)</span></h3>
<?php
while ( $my_query->have_posts() ) : $my_query->the_post();
// ループ内処理(ここに検索ワードに該当する記事が順に出力されます)
?>
...
<?php
endwhile;
endif;
wp_reset_postdata();
記述例
実際にサイト内検索結果ページの記述例は以下になります。
テンプレートファイル「search.php」
<?php
global $wp_query;
$total_results = $wp_query->found_posts;
$search_query = get_search_query();
?>
<section class="section">
<?php if (isset($_GET['s']) && empty($_GET['s'])) :?>
<p>検索条件が入力されていません。</p>
<?php elseif($total_results == 0 ): ?>
<p>「<?php echo $search_query; ?>」 に一致する情報は見つかりませんでした。</p>
<?php
else:
$s = $_GET['s'];
$args = array(
'posts_per_page' => -1,
's' => $s,
'paged' => $paged
);
$my_query = new WP_Query($args);
if($my_query->have_posts()):
?>
<h3>「<?php echo $search_query; ?>」の検索結果<span>(<?php echo $my_query->found_posts; ?>件)</span></h3>
<?php
while ( $my_query->have_posts() ) : $my_query->the_post();
// ループ内処理(ここに検索ワードに該当する記事が順に出力されます)
?>
...
<?php
endwhile;
endif;
wp_reset_postdata();
endif;
?>
</section>
参照
以下のサイトが、より詳しく解説してくれています。
【WordPress サイト内検索機能の実装方法 – by Takumi Hirashima】
https://hirashimatakumi.com/blog/3109.html
【関数リファレンス/WP Query – WordPress Codex 日本語版】
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query
コメント