WordPressサイトのテーマを自ら作成・編集したり作成案件を受注する際には様々なカスタマイズが求められます。カテゴリーごとに別々のサイドバーを表示したいこともあるでしょう。この記事ではその投稿の属するカテゴリーを参照し、ページごとに異なるサイドバーを出力する方法をご紹介します。
この記事では予め用意した複数のサイドバーをページごとに出し分ける方法を解説します。
サイドバー用ファイルの作成方法については下記の記事をご参照下さい。
WordPressでページによってサイドバーを出し分ける方法
目次
- 任意のサイドバーを読み込む方法
- 投稿の属するカテゴリーによってサイドバーを変更する
- カテゴリーアーカイブごとにサイドバーを変更する
- 個別のページごとにサイドバーを切り替える
- 特定のページのみサイドバーを非表示にする
任意のサイドバーを読み込む方法
</div><!-- #content --> </div><!-- #primary --> <?php get_sidebar(); ?> <?php get_footer(); ?>
WordPressでは上記のようにget_sidebar関数によってsidebar.phpというファイルを読み込み、その内容を出力することでサイドバーを表示しています。
例えばsidebar-test.phpというファイルを読み込みたい場合は
</div><!-- #content --> </div><!-- #primary --> <?php get_sidebar('test'); ?> <?php get_footer(); ?>
と表記するだけでOKです。
トップページ、カテゴリーページ、個別投稿ページなど、テンプレートが分かれているページごとにサイドバーを出し分けるだけなら上記のようにテンプレートに書かれているget_sidebar関数をちょろっといじればいいだけです。
しかしカテゴリーごとにサイドバーを出し分けたい場合などはPHPの条件分岐処理を使うなど簡単ながらプログラムコードを書き込む必要があります。
投稿の属するカテゴリーによってサイドバーを変更する
個別投稿ページに表示するサイドバーをその投稿の属するカテゴリーによって出し分ける方法です。
</main><!-- #main --> </div><!-- #primary --> <?php get_sidebar(); ?> </div> <!-- .wrap --> <?php get_footer();
出力するサイドバーは個別投稿ページのものなので今回いじるファイルはsingle.phpです。デフォルトテーマのTwentySeventeenでは上記の記述となっている部分を下記のように変更します。
</main><!-- #main --> </div><!-- #primary --> <?php if(in_category('category1')) : // If分岐開始、記事の属するカテゴリーがcategory1なら get_sidebar('category1'); // sidebar-category1.phpを出力 elseif(in_category('category2')) : // 記事の属するカテゴリーがcategory2なら get_sidebar('category2'); // sidebar-category2.phpを出力 elseif(in_category('category3')) : // 記事の属するカテゴリーがcategory3なら get_sidebar('category3'); // sidebar-category3.phpを出力 endif ?> // If分岐終了 </div> <!-- .wrap --> <?php get_footer();
WordPressのテンプレートタグであるin_categoryを使い、現在表示されている投稿に指定したカテゴリーが割り当てられているかどうかを調べ、trueの場合にはその後の出力処理を行わせています。
簡単に言えば記事の属するカテゴリーがcategory1ならsidebar-category1.phpを、記事の属するカテゴリーがcategory2ならsidebar-category2.phpを表示させています。
カテゴリーアーカイブごとにサイドバーを変更する
</main><!-- #main --> </div><!-- #primary --> <?php get_sidebar(); ?> </div> <!-- .wrap --> <?php get_footer();
こちらはカテゴリーページに表示するサイドバーをカテゴリーごとに変更する方法です。archive.phpを編集します。
</main><!-- #main --> </div><!-- #primary --> <?php if(is_category('category1')) : // If分岐開始、表示されているページがカテゴリーアーカイブ「category1」なら get_sidebar('category1'); // sidebar-category1.phpを出力 elseif(is_category('category2')) : // 表示されているページがカテゴリーアーカイブ「category2」なら get_sidebar('category2'); // sidebar-category2.phpを出力 elseif(is_category('category3')) : // 表示されているページがカテゴリーアーカイブ「category3」なら get_sidebar('category3'); // sidebar-category3.phpを出力 endif ?> // If分岐終了 </div> <!-- .wrap --> <?php get_footer();
ほぼ同じですが今回はin_categoryではなくis_categoryを使います。こちらは指定したカテゴリーアーカイブが表示されているかどうかをチェックするテンプレートタグです。
個別のページごとにサイドバーを切り替える
特定のページだけサイドバーを変更する方法です。ページごとに指定しなければならないため何十記事にも適用するのには向きませんが、お問い合わせページやサイト説明ページなどの数ページだけ変更したい場合に有用です。
</main><!-- #main --> </div><!-- #primary --> <?php if(is_page('contact')) : // If分岐開始、表示されているのが固定ページ「contact」なら get_sidebar('contact'); // sidebar-contact.phpを出力 elseif(is_single('test')) : // 表示されているページが「test」というタイトルまたはスラッグの投稿なら get_sidebar('test'); // sidebar-test.phpを出力 endif ?> // If分岐終了 </div> <!-- .wrap --> <?php get_footer();
固定ページを対象とする場合はis_page、個別投稿ページを対象とする場合はis_singleを使います。
特定のページのみサイドバーを非表示にする
</main><!-- #main --> </div><!-- #primary --> <?php if(!is_page('contact')) : // If分岐開始、表示されているのが固定ページ「contact」"ではない"なら get_sidebar(); // sidebar.phpを出力 endif ?> // If分岐終了 </div> <!-- .wrap --> <?php get_footer();
特定のページだけサイドバーを表示させたくない場合は上記のように ! をis_pageやis_singleの前に記述します。
この ! はPHPにおける論理否定演算子(NOT)です。
人間的にわかりやすい文章で言えば『特定のページのみサイドバーを非表示』としたいわけですが、これをプログラムで実現するために『特定のページ以外ではサイドバーを表示』と記述しています。
こんにちは。こちらの記事を参考にさせていただきました。
1点、最新のPHPのバージョンではget_sidebar(category1); をget_sidebar(‘category1’); とシングルクォーテーションで囲わないとエラーになるのですね。
恐らくご存知のことと思います。
記事のリライトをしていなかっただけと思いますが、プログラマーではない私にとってはこの点だけでエラーメッセージが出まくりで手こずりました。
なんとかサイドバーの使い分けができそうです。
ありがとうございました。
コメントありがとうございます。
ご指摘の通り記事が古いままとなっておりましたので該当箇所を修正させて頂きました。
使い分けがうまくいったようで何よりです。
こちらこそありがとうございます。