我搜索了一个可能有助于实现这一目标的钩子或过滤器,但没有找到任何钩子或过滤器。然而,有dynamic_sidebar
但它将在每个小部件显示后激发,使其无法实际使用。所以我编写了这个助手函数,它模仿Wordpress在侧栏中输出小部件的方式,在调用dynamic_sidebar()
您想在主题中显示小部件副本的位置:
/*
* Duplicate Widget in Dynamic Sidebar.
*
* Make a copy of selected widget and display it in a selected sidebar, help make
* edits to multiple identical widgets easier.
*
* @param string $widget_id Required, the ID of the widget to duplicate.
* @param int|string $sidebar_index Optional, default is 1. Name or ID of dynamic sidebar.
* @param string $copy Optional, default to the order the function was called, custom html id
* for the widget element.
*/
function ad_duplicate_widget($widget_id, $sidebar_index = 1, $copy = \'\') {
global $wp_registered_widgets, $wp_registered_sidebars;
static $i = 0;
$i++;
if ($copy == \'\')
$copy = $i;
//$sidebars_widgets = wp_get_sidebars_widgets();
if (is_int($sidebar_index)) {
$sidebar_index = "sidebar-$sidebar_index";
} else {
$sidebar_index = sanitize_title($sidebar_index);
foreach ($wp_registered_sidebars as $key => $value) {
if ( sanitize_title($value[\'name\']) == $sidebar_index ) {
$sidebar_index = $key;
break;
}
}
}
$sidebar = $wp_registered_sidebars[$sidebar_index];
$widget = $wp_registered_widgets[$widget_id];
$def_params = array(
\'widget_id\' => $widget_id,
\'widget_name\' => $widget[\'name\']
);
$params = array_merge(array(array_merge($sidebar, $def_params)), $widget[\'params\']);
$classname = $widget[\'classname\'];
$classname_ = \'\';
if ( is_string($classname) )
$classname_ .= \'_\' . $classname;
elseif ( is_object($classname) )
$classname_ .= \'_\' . get_class($classname);
$new_id = $widget_id . \'-\' . $copy;
$params[0][\'before_widget\'] = sprintf($params[0][\'before_widget\'], $new_id, $classname_);
$callback = $widget[\'callback\'];
if ( is_callable($callback) ) {
call_user_func_array($callback, $params);
}
}
用法将此函数放入
functions.php
文件,然后调用
ad_duplicate_widget($widget_id, $sidebar_index, $copy)
就在
dynamic_sidebar()
您要复制小部件的位置。
$widget_id
是小部件元素的html id属性。
$sidebar_index
可以是侧栏(数字)的索引,也可以是侧栏名称(字符串)。
$copy
是附加到小部件id的自定义html id。
示例
如果您有一个id为的文本小部件
\'text-5\'
它显示在博客的主侧栏中,您希望在中显示它
Sidebar Right
提要栏,在
dynamic_sidebar(\'Sidebar Right\')
呼叫,可能来自
sidebar.php
或
sidebar-right.php
文件:
dynamic_sidebar(\'Sidebar Right\');
ad_duplicate_widget(\'text-5\', \'Sidebar Right\');
这将在中创建小部件的副本
Sidebar Right
边栏和对原始小部件的任何编辑都将应用于这两个小部件。