WordPressでサイトを作成するとき、どんなサイトでも使うであろうWidget。
手軽に設置できて便利ですよね。
自作のTemplateでWidgetを使う場合、まず自作Theme内のfunctions.phpに
1 2 3 4 5 6 7 8 9 10 11 |
register_sidebar(array(<br /> 'name' => 'hoge-hoge-1',<br /> 'before_widget' => '<br /> <aside>',<br /> 'after_widget' => '</aside> <p>',<br /> 'before_title' => '<br /> <h2>',<br /> 'after_title' => '</h2> <p>',<br /> )); |
などと書き加え、Widget表示箇所の’name’とその前後のtagやタイトルのtagをしていしておきます。
そしてWidgetを表示させたい箇所、例えばsidebar.phpなどに
1 |
<?php dynamic_sidebar('hoge-hoge-1'); ?> |
と書き込んでおけば、「ダッシュボード > 外観 > ウィジェット」の右側に表示される「hoge-hoge-1」のセクションに、目的のWidgetをドラッグする事で使える様になります。
1 |
<?php dynamic_sidebar('hoge-hoge-1'); ?> |
は ‘hoge-hoge-1’ でWidgetを使っていない場合、functions.php内で設定した、Widgetの前後に表示されるtagも一緒に表示されなくなります。
これとは別に、Widgetが有効か(使っているか)を判定するtemplate tagに is_active_sidebar( ) があります。
‘hoge-hoge-1’ の有効判定をさせようと
1 2 3 |
<?php if(is_active_sidebar('hoge-hoge-1')) : echo 'true'; endif; ?> |
とやっても、何も表示されません。
1 |
<?php var_dump(is_active_sidebar('hoge-hoge-1')); ?> |
がbool(false)となるのです。
???と思い、「wp-includes/widgets.php」を見てみると、WordPress3.8なら975行目で
1 2 3 4 5 6 |
function is_active_sidebar( $index ) { $index = ( is_int($index) ) ? "sidebar-$index" : sanitize_title($index); $sidebars_widgets = wp_get_sidebars_widgets(); $is_active_sidebar = ! empty( $sidebars_widgets[$index] ); return $is_active_sidebar; } |
となっているのですが、wp_get_sidebars_widgets()で取り出した連想配列のkeyが「sidebar-整数」の型にしてやらないといけないんですね。
is_active_sidebar( $index )の$indexは「整数」か「sidebar-整数」しか使えず、「整数」の場合は前に「sidebar-」が加えられ、「sidebar-整数」の型に整形されて$indexに代入されます。
print_r(wp_get_sidebars_widgets())の結果が
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 |
Array ( [wp_inactive_widgets] => Array ( ) [sidebar-1] => Array ( [0] => calendar-3 ) [sidebar-2] => Array ( [0] => search-2 [1] => text-2 ) [sidebar-3] => Array ( [0] => archives-1 ) [sidebar-4] => Array ( [0] => links-2 [1] => search-3 [2] => recent-posts-2 [3] => archives-2 ) ) |
となり、keyは「sidbar-整数」の型になっていますから、is_active_sidebar(‘hoge-hoge-1’)と、functions.phpで設定した ‘name’ は使えないわけです。
「sidbar-1」「sidbar-2」「sidbar-3」の整数は、functions.phpのregister_sidebar()でWidgetを設定した時、上の方から順に番号が振られます(追加でWidgetを設定した場合は追加分が一番大きい数字になる)。
is_active_sidebar(‘hoge-hoge-1’)はfunctions.phpのregister_sidebar()で最初に設定したものなので、is_active_sidebar(‘sideber-1’)とし
1 2 3 |
<?php if(is_active_sidebar('sidebar-1')) : echo 'true'; endif; ?> |
とすると「true」と表示されました。
因に、dynamic_sidebar()は、「wp-includes/widgets.php」のWordPress3.8なら845行目に書かれています。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
function dynamic_sidebar($index = 1) { global $wp_registered_sidebars, $wp_registered_widgets; if ( is_int($index) ) { $index = "sidebar-$index"; } else { $index = sanitize_title($index); foreach ( (array) $wp_registered_sidebars as $key => $value ) { if ( sanitize_title($value['name']) == $index ) { $index = $key; break; } } } $sidebars_widgets = wp_get_sidebars_widgets(); if ( empty( $wp_registered_sidebars[ $index ] ) || empty( $sidebars_widgets[ $index ] ) || ! is_array( $sidebars_widgets[ $index ] ) ) { return false; } $sidebar = $wp_registered_sidebars[$index]; $did_one = false; foreach ( (array) $sidebars_widgets[$index] as $id ) { if ( !isset($wp_registered_widgets[$id]) ) continue; $params = array_merge( array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ), (array) $wp_registered_widgets[$id]['params'] ); // Substitute HTML id and class attributes into before_widget $classname_ = ''; foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) { if ( is_string($cn) ) $classname_ .= '_' . $cn; elseif ( is_object($cn) ) $classname_ .= '_' . get_class($cn); } $classname_ = ltrim($classname_, '_'); $params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_); $params = apply_filters( 'dynamic_sidebar_params', $params ); $callback = $wp_registered_widgets[$id]['callback']; do_action( 'dynamic_sidebar', $wp_registered_widgets[$id] ); if ( is_callable($callback) ) { call_user_func_array($callback, $params); $did_one = true; } } return $did_one; } |
となっています。
$wp_registered_sidebarsでWidgetの情報を連想配列として取得し、各値の ‘name’ をインデックスとして使っています。
$wp_registered_sidebarsをprint_r()で表示させてみると、
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
Array ( [sidebar-1] => Array ( [name] => hoge-hoge-1 [id] => sidebar-1 [description] => [class] => [before_widget] => <aside> [after_widget] => </aside> [before_title] => <h1> [after_title] => </h1> ) [sidebar-2] => Array ( [name] => hoge-hoge-2 [id] => sidebar-2 [description] => [class] => [before_widget] => <aside> [after_widget] => </aside> [before_title] => <h2> [after_title] => </h2> ) [sidebar-3] => Array ( [name] => hoge-hoge-2 [id] => sidebar-3 [description] => [class] => [before_widget] => <aside> [after_widget] => </aside> [before_title] => <h2> [after_title] => </h2> ) [sidebar-4] => Array ( [name] => other-page [id] => sidebar-4 [description] => [class] => [before_widget] => <aside> [after_widget] => </aside> [before_title] => <h2> [after_title] => </h2> ) ) |
となっています。
この違いがあるので、dynamic_sidebar()functions.phpのregister_sidebar()で設定した ‘name’ が使えるんですね。