将同一文本小部件实例的副本添加到多个侧边栏

时间:2012-11-23 作者:Shane

注意:这不是关于如何创建一个小部件的多个实例的常见问题。我有一个文本小部件,用来显示“营业时间”。此文本需要放在多个侧栏中,并且可能经常更改,以至于在多个地方更改它会很麻烦。有没有办法在多个侧边栏上使用相同的文本小部件实例?

任何使用令牌或其他类型指针的替代方案也将是一个解决方案。

2 个回复
最合适的回答,由SO网友:brasofilo 整理而成

一种可能的解决方案是在文本小部件中启用短代码。

add_filter( \'widget_text\', \'do_shortcode\', 11 );
然后把同样的shortcode (即:“[business_hours])中,并且所有这些控件都将显示相同的内容。

甚至可以添加一些Conditionals Tags 在短代码定义中,根据显示的上下文显示不同的内容。

SO网友:Ahmad M

我搜索了一个可能有助于实现这一目标的钩子或过滤器,但没有找到任何钩子或过滤器。然而,有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.phpsidebar-right.php 文件:

dynamic_sidebar(\'Sidebar Right\');

ad_duplicate_widget(\'text-5\', \'Sidebar Right\');
这将在中创建小部件的副本Sidebar Right 边栏和对原始小部件的任何编辑都将应用于这两个小部件。

结束

相关推荐