連載第159回
2019年11月9日
検索機能に不具合アリ:検索フォーム再リフォームその2

 

前回から引き続き、検索フォーム回りの改善。上図のように、検索キーワード無しの状態でカテゴリー&タグを選んだだけでenterキーを押しても、ちゃんとヘッダー画像を表示させるようにしましたが、<h1>のタイトルが空欄のままでイマイチな気がしないでもありません。というわけで、ヘッダーのタイトル表記部分に条件分岐を設けて、それなりの文字列を出力させたいと思いました。

そこで下記のサイトを参考にします。とても勉強になりました(特にNx Worldさんの記事)。

外部サイト参考記事
WordPress:検索キーワードが空(未入力)で検索された場合の表示を変更する方法(Nx World)
テンプレートタグ/the search query(WordPress日本語サイト)
関数リファレンス/get search query(WordPress日本語サイト)
ワードプレスでカテゴリー・タグを取得・出力する(オリジナルTシャツを1枚から作成 神戸Tシャツ製作所)
投稿に付けたタグを配列形式で取得する(THE WORDPRESS PRESS)


if ( empty( get_search_query() ) ) :
// 検索キーワードがないとき
echo '検索キーワードが未入力です。';
else :
// 検索キーワードがあるとき
if ( have_posts() ) :
// 該当するエントリーがあるとき
while ( have_posts() ) : the_post();
get_template_part( 'template-parts/content' );
endwhile;
else :
// 該当するエントリーがないとき
echo '検索キーワードに該当するエントリーはありません。';
endif;
endif;

参考記事内で紹介されているのは上記のようなスクリプトですが、現状で当方の設置した検索フォームとその結果の表示の構成だと、序盤にある「検索キーワードがないとき」の条件分岐が不要です。なので、そこは省略させてもらい、下記のように必要部分のみに絞りました。

検索時の条件分岐(category.phpの場合)

<section id="code_name">
<h1>
<?php  // 検索結果分岐
  if ( have_posts() ) :
    // 該当するエントリーがあるとき
    echo the_category(','); 
  else :
    // 該当するエントリーがないとき
    echo 'カテゴリー内に該当記事無し';
endif; ?>
<a href="<?php echo home_url(); ?>"> ▲</a></h1>
</section>

上記コードを「category.php」に設置した場合の検索結果(キーワード無し、カテゴリー&タグのみ指定アリ)は下図のようになります。カテゴリー「MODO」、タグ「AirMac」の検索キーワード無しだと、該当記事が無い状態で「category.php」を使って表示されます。

では、検索キーワード無しだけれど、カテゴリーとタグを指定して、該当記事があった場合はどうなるのかと言えば…。

上図のようにちゃんと、カテゴリーIDを抽出した状態で、意図通りのヘッダー画像を用いた結果が表示されます。これはsearch.phpではなく、「index.php」を使っているハズです(search.phpの方には条件分岐を使っているheader.php
を使用せず、search専用のヘッダー画像を指定しているから)。…これが不思議なのですよねえ(結果良ければそれで良しなのですが)。

search.phpでタグ表示が文字化けを起す不具合

興味が湧いて、どのカテゴリーで検索したかはヘッダー画像で自分は分かるので、どの「タグ」で検索したのかタイトルに付記させることは出来ないかと思って、色々と試行錯誤してみました。半日かけた結果、下記のように「search.php」の方でコードを書き換えてみました。結果表示にsearch.phpが使われる条件は、必ず検索キーワードを含むという事なので、$wordに値を代入し、それをエコーして、さらにsearchform.php内でタグ抽出に使っている変数「$tag」を付加しています。

検索時の条件分岐(search.phpの場合)

<section id="code_name">
<h1>
<?php 	  // 検索結果分岐
  if ( have_posts() ) :
    // 該当するエントリーがあるとき
    $word = get_search_query();
   	echo $word.' <span style="font-size:36px"> '.$tag.'</span>';
  else :
    // 該当するエントリーがないとき
    $word = get_search_query();
    echo $word.' <span style="font-size:36px">該当記事無し '.$tag.'</span>';
endif; ?>
<a href="<?php echo home_url(); ?>"> ▲</a></h1>
</section>

上記コードを「search.php」に設置した場合の検索結果(キーワード無し、カテゴリー&タグのみ指定アリ)は下図のようになります。

カテゴリーを「VPS引っ越しメモ」、タグを「Mac互換機」、検索キーワードを「CPU」とした場合は、意図通りに結果が返ってきてラッキー!と思ったのですが…しかし!

上図のように「カテゴリーを特に指定していない場合」で検索すると、結果表示のタイトルのタグに含まれる日本語が文字化けを起す!という、自分意外はどうでもいいレアケース発症(上図の場合だと、Mac互換機の「互換機」の部分が文字化けしています)。こんな状況を経験している他人のレポートなどググっても出てくるはずもなく、この状況に対処するには付け焼き刃的なコード継ぎはぎで満足するのではなく、自分自身がPHPそのものをきちんと理解する必要があると思いました。というわけで、一旦タグ表記を付加するのは止め、検索キーワードの表示のみでこの場は置いておくとします。