ハナモゲラボ / 試行錯誤の実験人生

日々、PCや各種デバイス、楽器等に翻弄されながら電脳の森をさまよう男の日常と様々な実験をさらりと記しております。

WordPressでページ毎にサイドバーを切り替える方法

September 02 2013

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/

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

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

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

| Posted in Wordpress | Comments (0)

Post a Comment

※メールアドレス、URLは任意入力です。メールアドレスは入力しても公開されません。

« Jul 2017 August 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31