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/

あるやん・・・・・しかもめっちゃ便利そうなのが・・・・

ま、まあ、お仕事には「プラグイン使わないで」って事もあるから・・・・

うん、あるから・・・・・・