前回から引き続き、検索フォーム回りの改善。上図のように、検索キーワード無しの状態でカテゴリー&タグを選んだだけで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;
参考記事内で紹介されているのは上記のようなスクリプトですが、現状で当方の設置した検索フォームとその結果の表示の構成だと、序盤にある「検索キーワードがないとき」の条件分岐が不要です。なので、そこは省略させてもらい、下記のように必要部分のみに絞りました。
<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」を付加しています。
<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そのものをきちんと理解する必要があると思いました。というわけで、一旦タグ表記を付加するのは止め、検索キーワードの表示のみでこの場は置いておくとします。
【PHP入門】echoによる文字列出力の総まとめ(Samurai Blog)
PHPでの文字化けを今のところ100%回避している対処法(flatFlag)
【ワテの失敗】PHPの文字化けの原因が分からない【解決‼】(われこ われこ)
2019-11-09 > VPS&WordPress引っ越しメモ