WordPressでページやカテゴリごとにサイドバーを切り替えるには
「ページごとにサイドバーの表示内容を切り替えたい」
これは西沢直木のIT講座にもよく持ち込まれる相談です。
その解決策はテーマによって異なります。BizVektorのように何種類かサイドバーを設定できるテーマではメニュー操作だけで実現できます。以下のページも参考にしてください。
BizVektorと違ってサイドバーが1種類のみのシンプルなテーマでは、サイドバーを表示している部分のPHPスクリプトを自力で編集する必要があります。
特定のページ専用のウィジェットを作成できる「Jetpackのウィジェット表示管理」
投稿と固定ページで別々のサイドバーを表示する
ここでは、「簡単にできそうなら自力でサイドバーの切り替えにチャレンジしたい」と思っている方のために、サイドバー表示の仕組みから、ページごとにサイドバーを切り替えるためのコードの例まで紹介していきます。
この記事の内容
画面にサイドバーが表示される仕組み
WordPressでサイドバーを表示する命令は、テンプレートに記述されています。たとえば、Twenty Twelveでは、page.php(固定ページ)やsingle.php(投稿)の中に次のように記述されています。
</div><!-- #content --> </div><!-- #primary --> <?php get_sidebar(); ?> <?php get_footer(); ?>
このget_sidebar関数によってsidebar.phpというファイルが読み込まれます。つまり、sidebar.phpに記述されたサイドバーの内容が表示されます。
sidebar.phpにはサイドバーに表示したい内容を自由に入力できますが、インストール直後のsidebar.phpには「ウィジェット」メニューで設定したウィジェットを表示するための命令が記述されているのが一般的です。
特定のページでサイドバーを非表示にする
ページごとにサイドバーを切り替えたい場合は、get_sidebar関数に対して条件を付加する方法があります。
たとえば、問い合わせページではサイドバーを非表示にしたい場合、get_sidebarの行をif … endifのif文で囲み「!is_page('contact')」(スラッグがcontactの固定ページ以外は)という条件を記述します。
※先頭の「!」を忘れないようにしてください。これは、「以外は」として機能します。
<?php if(!is_page('contact')) : ?> <?php get_sidebar(); ?> <?php endif ?>
ページごとにサイドバーを切り替える
単に非表示にするだけではなく、問い合わせページのサイドバーに画像を表示するなど、簡易的に切り替えたい場合は、次のようにif … else … endifという構文の中に、表示したい内容を記述します。
<?php if(is_page('contact')) : ?> <img src="http:// … xxxxx.gif" /> <?php else : ?> <?php get_sidebar(); ?> <?php endif ?>
if(is_page('contact'))が、問い合わせページのときに表示される内容、else以降が、それ以外のページ(通常の固定ページ)で表示される内容です。
サイドバーをテンプレートファイルから読み込む
これでも問題ありませんが、サイドバーをカスタマイズする場合に、毎回page.phpを直接修正するのはベストの方法とは言えません。
そこで、サイドバーの内容をsidebar-contact.phpなどというテンプレートファイルに記述しておいてpage.phpで読み込ませる方法も紹介します。
手順は次のようになります。
- テンプレートのsidebar.phpをコピーしてsidebar-contact.phpとして保存する
ファイル名の「contact」は任意の名前で大丈夫ですが、次のステップで編集するpage.phpと連動します。 - sidebar-contact.phpを編集する(サイドバーに表示したい内容に変更する)
sidebar-contact.phpの内容は自由ですが、ここでは次のように記述します。...略... これは問い合わせページのサイドバーのテストです。 <img src="http:// … xxxxx.gif" />
- page.phpを編集する
page.phpを編集してget_sidebar関数で読み込むサイドバー用のテンプレートファイルを指定します。これにより、スラッグがcontactのページではサイドバーにsidebar-contact.phpが読み込まれるようになります。<?php if(is_page('contact')) : ?> <?php get_sidebar('contact'); ?> <?php else : ?> <?php get_sidebar(); ?> <?php endif ?>
カテゴリごとにサイドバーを切り替える
投稿カテゴリごとに別々のサイドバーを表示したい場合、投稿ページ用のテンプレートを編集します。
Twenty Twelveでは、投稿用のテンプレートsingle.phpにも上記で紹介したget_sidebarが記述されているので、if文で「カテゴリごとに」を表現すれば実現できます。
たとえば、「千駄木」(sendagi)、「谷中」(yanaka)というカテゴリごとに別々のサイドバーテンプレートを読み込ませるコードは次のようになります。
<?php if(in_category('sendagi')) : ?> <?php get_sidebar('sendagi'); ?> <?php elseif(in_category('yanaka')) : ?> <?php get_sidebar('yanaka'); ?> <?php else : ?> <?php get_sidebar(); ?> <?php endif ?> <?php get_footer(); ?>
in_category関数は、その投稿が指定カテゴリかどうかを調べる関数で、in_category('カテゴリ名')のように記述します。if文と組み合わせることで、カテゴリAの場合はサイドバーA、カテゴリBの場合はサイドバーBのようにサイドバーを切り替えることができます。
※ここで使ったのがis_categoryではなくin_categoryということに注意してください。is_categoryは後で紹介します。
PHPスクリプトの開始、終了タグが多くなって見づらく感じる場合は、次のように開始、終了を1つにまとめることもできます。
<?php if(in_category('sendagi')) : get_sidebar('sendagi'); elseif(in_category('yanaka')) : get_sidebar('yanaka'); else : get_sidebar(); endif ?>
これにより、カテゴリに応じたサイドバーが表示されるようになります。
get_sidebar('xxxxx') → sidebar-xxxxx.phpというテンプレートを読み込む
(例:get_sidebar('yanaka') → sidebar-yanaka.phpを読み込む)
カテゴリアーカイブでサイドバーを切り替える
少しまぎらわしいのですが、投稿が特定のカテゴリかどうか調べるにはin_categoryを使いますが、カテゴリアーカイブではis_categoryを使います。つまり、カテゴリアーカイブでカテゴリごとにサイドバーを切り替えるには、テンプレート(category.php)に次のように記述します。
<?php if(is_category('sendagi')) : get_sidebar('sendagi'); elseif(is_category('yanaka')) : get_sidebar('yanaka'); else : get_sidebar(); endif ?>