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/
あるやん・・・・・しかもめっちゃ便利そうなのが・・・・
ま、まあ、お仕事には「プラグイン使わないで」って事もあるから・・・・
うん、あるから・・・・・・