検索フォームを設置する

記事本文/テキストウィジェットにショートコードを挿入

ショートコードで記事本文やテキストウィジェットに検索フォームを設置できます。

(例:フォームID=2の検索フォームを表示する場合)

[feas-search-form id=2]

検索フォームを複数作成している場合、id属性にフォームIDを与えることで表示する検索フォームを指定できます。id属性を省略した場合はフォームID=0の検索フォームが表示されます。

検索条件に該当する件数を表示するには下記のように記述します。

(例:フォームID=2の該当件数を表示する場合)

[feas-search-count id=2]

検索フォーム同様、id属性を指定できます。

検索結果ページで、検索条件を表示するには下記のように記述します。

[feas-search-query]

このショートコードには3つの属性をオプションとして渡すことができます。

  1. sep 検索条件の区切り文字(デフォルトは半角カンマ「,」)
  2. before 各キーワードの前に挿入される文字(デフォルトは<span>)
  3. after 各キーワードの後に挿入される文字(デフォルトは</span>)

(例:半角カンマ区切り、各キーワードにkeywordというclassを付与)

[feas-search-query sep=' ' before='<span class="keyword">' after='</span>']

テンプレートにPHPの関数で設置する方法

ショートコードの他に、FEAS独自のPHPの関数をテーマのテンプレートに設置する方法でも検索フォームを表示できます。この方法だとテーマの機能に制限されず、サイト内のどこにでも検索フォームを設置できます。

検索フォームを表示

検索フォームを表示したいテンプレートの任意の場所に下記のように記述します。

(例:フォームID=2の検索フォームを表示する場合)

<?php feas_search_form( 2 ); ?>

検索フォームを複数作成した場合、引数にフォームIDを与えることで表示する検索フォームを指定できます。引数を省略した場合はフォームID=0の検索フォームが表示されます。

記事ループの中に設置すると、記事の数分だけ検索フォームが表示されてしまいますのでご注意ください。記事ループの外部に設置してください。

検索条件を検索結果一覧ページに表示

検索結果一覧ページに、検索に用いた条件(カテゴリ、キーワード等)を列記するには下記のように記述します。

<?php feas_search_query(); ?>

ショートコードと同様に、引数を与えることでオプションを指定できます。

  1. output 画面出力(デフォルトはtrue)
    • falseにすると画面出力せずに各キーワードを配列で取得できます。その後PHPでループ処理して加工できます。
    • 内部的には search_result_array() 関数に渡されます。
  2. separator 検索条件の区切り文字(デフォルトは半角カンマ「,」)
  3. before 各キーワードの前に挿入される文字(デフォルトは<span>)
  4. after 各キーワードの後に挿入される文字(デフォルトは</span>)

該当件数を表示

検索条件に該当する件数を表示するには下記のように記述します。

(例:フォームID=2の該当件数を表示する場合)

<?php feas_search_count( 2 ); ?>

2つ目の引数にfalseを指定すると、画面出力せずに値をreturnし、その後PHPで処理できます。

記述例

上記の関数を用いた記述例は以下のとおりです。

front-page.phpなど検索フォームを表示するテンプレートに設置
<?php if ( function_exists( 'feas_search_form' ) ) { ?>
  <div class="feas-search-form">
    <?php feas_search_form(); ?>
  </div>
<?php } ?>

<div class="feas-search-count">
  現在の登録件数:<?php feas_search_count(); ?> 件
</div>
search.phpなど検索結果を表示するテンプレートの上部に設置
<h2>「<?php feas_search_query(); ?>」の検索結果 <?php feas_search_count(); ?> 件</h2>

検索条件を配列で返す

search_result()の代わりにsearch_result_array()を使うと、検索条件をカンマ区切りで画面出力する代わりに配列で取得できますので、ループで回しながら各キーワードにclassを付与するなど、独自のデザインがしやすくなります。

$query = search_result_array( 'all' );
if ( $query ) {
  $ret = '';
  foreach ( $query as $q ) {
    if ( ! empty ( $ret ) )
      $ret .= ' ';
    $ret .=  '&lt;span clas="query"&gt;' . esc_html( $q ) . '&lt;/span&gt;';
  }
  echo $ret;
}

検索結果を表示する

検索条件にヒットした記事一覧を正常に表示させるためには、使用するテーマフォルダ内に search.php というテンプレートが存在している必要があります。たいていの既存テーマには含まれていますが、もしない場合は archive.php などの記事一覧表示用のテンプレートを複製して search.php に名称変更してご使用ください。そのsearch.php内の記事を表示するループ部分(if(have_posts()から始まりendifで終わるセクション)で、該当記事が表示されます。

WordPressは検索が実行され is_search が true になると、まずテーマ内の search.php というテンプレートを探して検索結果を表示しようとします。FEASのどの検索フォームから検索が実行された場合でも検索結果は search.php を通ります。もし search.php が存在しない場合は、下記の優先順位で別のテンプレートがフォールバックとして使用されます(WordPressのテンプレート階層のルール)。

search.php > index.php

検索結果のテンプレートを検索フォームごとに切り替える

サイト内のそれぞれのカテゴリ/コーナー毎に別々の検索フォームを設置した場合、検索結果を表示するテンプレートも分けたい場合があります。その場合は search.php を必要なパターン分だけ複製し、さらに元の search.php の中身を下記のように書き換えて分岐専用のテンプレートにします。

<?php
// フォームID=0から検索された場合
if ( '0' === $_GET['fe_form_no'] ) {
  //search-form0.phpを読み込む
  get_template_part( 'search', 'form0' );
}
// フォームID=1から検索された場合
elseif ( '1' === $_GET['fe_form_no'] ) {
  //search-form1.phpを読み込む
  get_template_part( 'search', 'form1' );
}
// それ以外(WordPress標準の検索窓など)
else {
  //archive.phpを読み込む
  get_template_part( 'archive' );
}
?>

検索を実行すると必ずこの search.php を通りますが、その際にどの検索フォームから検索が実行されたかはURLに含まれる fe_form_no というパラメータで判別できるため、この値を使って振り分けるテンプレートを条件分岐できます。

あらかじめ複製しておいた searh.php のコピーを名称変更し、それぞれの検索フォームごとに表示内容やデザインをカスタマイズしてください。

コード記述例の search-form0.php 等のファイル名は自由に変えて下さい。