尽管Wordpress 2.2的Widget和Automattic的Sidebar Widget插件兼容,但是却存在一个不大不小的bug:
在调用register_sidebar注册超过一个Sidebar的时候,如果同时指定了Sidebar的名称,那么最终只能注册成功一个
Sidebar,例如按照Automattic的API应该可以使用register_sidebar (2, array (‘name’ => ‘aaa %d’))注册依次为aaa 1,aaa 2的sidebar,而在wordpress中的结果则是只有一个名为aaa的sidebar,看看代码(WORDPRESS DIR/wp-include/widgets.php)
function register_sidebars($number
= 1, $args = array()) {
$number = (int) $number;
if ( is_string($args) )
parse_str($args, $args);
$i = 1;
while ( $i < = $number ) {
$_args = $args;
if ( $number > 1 ) {
$_args['name'] = isset($args['name']) ? $args['name'] : sprintf(__
('Sidebar %d'), $i);
} else {
$_args['name'] = isset($args['name']) ? $args['name'] : __('Sidebar');
}
$_args['id'] = isset($args['id']) ? $args['id'] : "sidebar-$i";
register_sidebar($_args);
++$i;
}
}
嗯。。。相信已经有同学看出来了,在注册多于一个sidebar时,sidebar的名字是
isset($args[’name’]) ? $args[’name’] : sprintf(__(’Sidebar %d’), $i);
就是说如果指定了名字则已指定的名字为准,没有指定名称时才会按数字递增,那么修改就很容易了(其实照抄Automattic Sidebar Widget的就可以了,嘿嘿)
function register_sidebars($number = 1, $args = array()) {
$number = (int) $number;
if ( is_string($args) )
parse_str($args, $args);
$name = $args['name'] ? $args['name'] : __('Sidebar');
$i = 1;
while ( $i < = $number ) {
if ( isset($args['name']) && $number > 1 ) {
if ( !strstr($name, '%d') )
$name = "$name %d";
$args['name'] = sprintf($name, $i);
}
register_sidebar($args);
++$i;
}
}
ok,收工
[...] 修正 Wordpress 2.2 Widget 的 bug,wp2.2自带的widget存在着一个不大不小的bug: 在调用register_sidebar注册超过一个Sidebar的时候,如果同时指定了Sidebar的名称,那么最终只能注册成功一个 [...]