WordPressでブログではなくいわゆる普通のサイトを作ってる際に
階層が浅いサイトならグローバルナビゲーションだけで事足りるのだけれども
たとえば、階層が深くなった際にサブメニューをサイドバーに表示させたい、
という場面に出くわした場合、どうすりゃいいんだと頭を捻る。
例:バンドメンバー一覧→各メンバー詳細(サイドバーにはメンバー名表示)
最初に思いついたのは
- バンドメンバー一覧に連なるページ群は別のテンプレートを作成する。
これが一番簡単なのだけれども、
Wordpressの機能であるカスタムメニュー、そしてウィジェットを使いたい場合
sidebar.phpもその数だけ作らなきゃなんねえのか?とか
色んな事が頭に浮かんできて頭パーーーーーン!(懐)となりそうになった。
いやいや、そんな難しく考えんでも、とコーヒー飲んで落ち着いて整理する。
- WordPressの固定ページは親子関係を設定できる。
- 各ページにはスラッグが設定でき、それを呼び出すことが可能。
- という事は、sidebar.phpに条件分岐のスクリプトを書いて、ウィジェットをそこだけ呼び出せばいいんじゃね?
という結論に至りました。
まずはfunctions.phpにregister sidebar widget関数を書いてサイドバーを登録。
以下は複数のサイドバーを登録する際の例。
if (function_exists( 'register_sidebar' )) { register_sidebar( array ( 'name' => 'sample1' , 'before_widget' => '<div class="widget">' , 'after_widget' => '</div>' , 'before_title' => '<div class="title">' , 'after_title' => '</div>' )); register_sidebar( array ( 'name' => 'sample2' , 'before_widget' => '<div class="widget">' , 'after_widget' => '</div>' , 'before_title' => '<div class="title">' , 'after_title' => '</div>' )); register_sidebar( array ( 'name' => 'sample3' , 'before_widget' => '<div class="widget">' , 'after_widget' => '</div>' , 'before_title' => '<div class="title">' , 'after_title' => '</div>' )); } |
ここで設定できる項目は
- name・・・・・・・・ウィジェット設定画面で表示されるラベル
- id・・・・・・・・サイドバーに割り振られるid
- description・・・・・・・・サイドバーの説明(WP2.9以降)
- before_widget・・・・・・・・ウィジェットの前のテキスト
- after_widget・・・・・・・・ウィジェットの後のテキスト
- before_title・・・・・・・・タイトルの前のテキスト
- after_title・・・・・・・・タイトルの後のテキスト
テキストというのはもちろんHTMLも使用可能です。
h2で見出しをつけたりとか、ウィジェットをdivで囲んだりとか。
サイズ違いのサイドバーなんかを使う場合は便利ですね。
もちろん必要ないものは省略も可能です。最低、nameだけでも構いません。
そしてsidebar.phpに条件分岐を書けばOK。
以下は固定ページに設定されたスラッグ毎に表示させるサイドバーを変える例文。
<?php if (is_page( 'about-me' )): ?> <?php dynamic_sidebar( 'sample1' ); ?> <?php else (is_page( 'members' )): ?> <?php dynamic_sidebar( 'sample2' ); ?> <?php elseif (is_page( 'access' )): ?> <?php dynamic_sidebar( 'sample3' ); ?> <?php endif ; ?> |
ちなみに子ページのスラッグはデフォルトでは単独取得出来ないので
それが必要な場合にはfunctions.phpに以下を書いてあげる必要があります。
function is_subpage() { global $post ; if ( is_page() && $post ->post_parent ){ $parentID = $post ->post_parent; return $parentID ; } else { return false; }; }; |
・・・・・つーか、これプラグインあるんじゃねえの?って思って検索したら
ウィジェットを表示させる条件を直感的に操作できるDisplay widgetsプラグイン
http://foom.in/2012/05/plugin-display-widgets/
あるやん・・・・・しかもめっちゃ便利そうなのが・・・・
ま、まあ、お仕事には「プラグイン使わないで」って事もあるから・・・・
うん、あるから・・・・・・