当サイトは地味にフリーアイコンコンテンツがありまして、そのコンテンツにいつか検索機能を追加したいと思っておりました。
そして先日、ついに検索を実装しました!ってほど大層なことはやっておりませんがその時の備忘録です。
複数の投稿タイプでそれぞれに検索を使う
検索窓を投稿タイプごと、複数設置するのは、そんなに手間はかかりません。hiddenにポストタイプの情報を持たせればOKです。指定したポストタイプのみ検索できます。
<form name="search_form" method="get" action="<?php echo home_url(); ?>"> <input type="hidden" name="post_type" value="ポストタイプ名"> <input type="text" name="s" value="<?php the_search_query(); ?>">
カスタム投稿タイプならhome_urlに直接指定してもOK。
<form name="search_form" method="get" action="<?php echo home_url('/ポストタイプ名/'); ?>"> <input type="text" name="s" value="<?php the_search_query(); ?>">
検索条件が一致しない場合の条件分岐
search.phpはシングル系、アーカイブ系のテンプレートと違い、デフォルトでは派生バージョンの作成ができないので、表示はsearch.phpで条件分岐を行うことにしました。
<?php if(get_post_type() === 'ポストタイプ'): ?> //処理 <?php elseif(get_post_type() === 'ポストタイプ2'): ?> //処理 <?php endif; ?>
通常であれば上記のようにポストタイプで条件分岐すれば、別テンプレートにしなくても、投稿タイプごとユニークに情報を扱えます。未入力、検索条件に一致する場合はこれで問題なかったのですが、検索条件に一致しない場合はこれでは無理でした。
条件が一致しない場合でも使える条件分岐
is_search以外で条件が一致しない場合でも何か分岐できないか探っていたらis_post_type_archive
で判定できていたので、それを利用して分岐することにします。
サイドバーの条件分岐
サイドバーをポストタイプ毎に変えるのはよくあることだとおもいますので、サドバーの分岐。
<?php if(get_post_type() === 'ポストタイプ名' || is_post_type_archive('ポストタイプ名')): ?> //指定のポストタイプのサイドバーの処理 <?php else: ?> //それ以外のサイドバーの処理 <?php endif; ?>
sarch.phpの条件分岐
search.phpはis_post_type_archive
のみで分岐できました。
<?php if(is_post_type_archive('ポストタイプ名')): ?> //指定のポストタイプの処理 <?php else: ?> //それ以外の処理 <?php endif; ?>
これでカスタム投稿タイプごとの目的は達成できました。
未入力、条件に一致しない場合の処理
検索には「条件に一致した処理」「条件に一致しなかった処理」「未入力の処理」があります。
条件に一致した処理と条件に一致しなかった処理
通常投稿の「投稿がある時」と「ない時」の処理と基本は同じです。
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> //ループの処理 <?php endwhile; ?> <?php else: //検索に一致しなかった時 ?> 	<p><q><?php the_search_query(); ?></q>に一致する情報は見つかりませんでした。</p> <?php endif; ?>
未入力の処理
空白で検索された時の処理です。通常はアーカイブが全て出力されますが、せっかくなので空白時の処理もやってみました。
<?php if (get_search_query() == ''): ?> 	からっぽじゃん <?php else: ?> <?php the_search_query(); ?>で検索した結果 <?php endif; ?>
なんかそれっぽい!!でも、よくよく考えると未入力の時の処理はjsで検索できなくするのがスマートですよね。ってなわけで、当サイトに検索機能を実装した備忘録でした。