テーマカスタマイズ

カスタム投稿タイプ別に検索結果ページを用意する

2018.05.21

分岐

通常の投稿とカタム投稿タイプの検索結果を分けたいとと言う要望があったので実装方法を考えてみました。普通に考えたら下記の2項を思いつきます。

  • 検索結果を条件分岐する
  • テンプレートを分ける

検索結果を条件分岐する

検索結果ページで条件分岐を行う場合はis_post_type_archiveを使うとうまくいきます。get_post_typeでは検索条件が一致しない場合うまく動作しなかったりします。

<?php if(is_post_type_archive('投稿タイプ')): ?>
//指定投稿タイプの処理
<?php else: ?>
//それ以外の処理
<?php endif; ?>

とりあえずこれでsearch.php内では検索結果の処理を分けることができます。

サイドバーなども分ける場合

検索結果ページだけではなくsidebar.php等でも出力処理を分ける必要がある場合はis_post_type_archiveだけではうまくいきませんので、下記のように記述します。

<?php if(get_post_type() === 'ポストタイプ名' || is_post_type_archive('ポストタイプ名')): ?>
//指定のポストタイプのサイドバーの処理
<?php else: ?>
//それ以外のサイドバーの処理
<?php endif; ?>

これでサイドバーでもうまく出力を分けることができるはずです。search.phpで読み込むテンプレをあらかじめ分けておくって方法もありますね。

テンプレートを分ける

デフォルトの状態ではsearch.phpを派生させることができませんが、functions.phpに下記コードを記述することで、search-投稿タイプ名.phpの投稿タイプ別派生ファイルを利用することができます。

<?php
add_filter('template_include','custom_search_template');
function custom_search_template($template){
  if ( is_search() ){
    $post_types = get_query_var('post_type');
    foreach ( (array) $post_types as $post_type )
       $templates[] = "search-{$post_type}.php";
       $templates[] = 'search.php';
       $template = get_query_template('search',$templates);
  }
  return $template;
}
?>

上記コードはフォーラムの記事から拝借してまいりました。レイアウトがガラリと変わってしまうほどの変更がある場合はテンプレートを分けた方が取り回しは良さそうです。

まとめ

今回は検索結果の出力を投稿タイプごとに分ける2つの方法を紹介しました。ちょっとした違いであれば条件分岐の方が便利でしょうし、大きく見せ方が変わる場合はテンプレートを分けた方が便利に取り回しできます。ケースバイケースでの使い分けですね!

WEBSITE DESIGN REQUEST

ホームページ制作依頼について

W・D・Sでホームページ制作をご希望の方はお気軽にご相談ください。
制作内容、ご予算、納期をお知らせいただくとスムーズです。

ホームページ制作を相談する