在多站点博客之间共享动态侧边栏

时间:2012-04-05 作者:Timothy Wallis

我正在尝试从一个博客中检索动态侧栏,并在Wordpress Multisite的同一安装中将其打印到另一个博客上。我试过了

switch_to_blog($blog_id);
dynamic_sidebar($sidebar_name);
restore_current_blog();
但什么都没有返回。

我也厌倦了通过侧边栏检索get_blog_option($blog_id, \'sidebar_widgets\') 但我只能检索一个数组来识别侧栏使用了哪些小部件,但我无法找到将数组处理成侧栏的方法。

5 个回复
最合适的回答,由SO网友:Boone Gorges 整理而成

不幸的是switch_to_blog() 方法无法实现此目的。switch_to_blog() 实际上只是部分切换-它对$wpdb 这有助于数据库查询。但这并不是你想象中的完全转变。

特别是,dynamic_sidebar() 取决于调用的全局$wp_registered_sidebars. 此全局变量由填充register_sidebar(), 它通常是从类似于主题文件的函数中调用的。php。但是功能。php和主题设置过程的其余部分不会由重新运行switch_to_blog(). 这就是说:如果你在当前博客上运行的是211,那么它将在启动期间注册自己的侧栏;使用switch_to_blog() 对于运行“二十个十”的博客,不会告诉“二十个十”设置其侧栏。您可以尝试强制它(通过手动加载切换博客的functions.php),但这几乎肯定会导致灾难,因为存在重复的函数名、加载顺序等问题。

您可能会尝试另一种方法:在带有所需侧边栏的博客上,构建一个函数,将侧边栏的内容打印到输出缓冲区中,然后在将其打印到屏幕之前,将其存储在site\\u选项中。然后,您可以从网络上的任何站点获取侧栏(或者至少是静态版本的侧栏)。如果您绝对需要一个完全动态的侧边栏,这将不起作用,但对于大多数情况,您可能不需要。

另一种方法(可能更简单)是在mu插件文件或类似文件中使用函数呈现侧栏,然后在主题中手动调用该函数(或将其挂接到公共侧栏挂钩)。从中提取内容可能需要一些工作WP_Widget 架构,但另一方面,它将是解决当前问题的真正动态解决方案。

SO网友:Christian Jung

遇到了同样的问题并找到了解决方案。我正在做的是:

1)每当博客1的侧边栏上发生更改时,将这些小部件的数组及其设置保存为站点范围的瞬态,该瞬态在24小时后过期。

2)在所有子博客上,在提要栏中输入一些代码。获取此站点范围瞬态并显示小部件的php。

听起来很简单,但很难理解……而且还远远不够完美。

让我们深入了解一些代码:

function antwortzeit_cache_widgets() {
    if ( false === ( $widgets = get_site_transient( \'antwortzeit_widgets\' ) ) ) {
        global $wp_registered_sidebars, $wp_registered_widgets;

        foreach ( (array) $wp_registered_sidebars as $key => $value ) {
            if ( sanitize_title($value[\'name\']) == sanitize_title(\'Breite Spalte\') ) {
                $index = $key;
                break;
            }
        }

        $sidebars_widgets = wp_get_sidebars_widgets();
        if ( empty( $sidebars_widgets ) )
            return false;

        if ( empty($wp_registered_sidebars[$index]) || !array_key_exists($index, $sidebars_widgets) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) )
            return false;

        $sidebar = $wp_registered_sidebars[$index];
        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 );

            $widgets[] = array(
                \'callback\'  => $wp_registered_widgets[$id][\'callback\'],
                \'base\'      => $wp_registered_widgets[$id][\'callback\'][0]->id_base,
                \'id\'        => $wp_registered_widgets[$id][\'callback\'][0]->id,
                \'params\'    => $params,
            );
        }
        set_site_transient( \'antwortzeit_widgets\', $widgets, 60 * 60 * 24 );
    }
}
add_action( \'init\', \'antwortzeit_cache_widgets\');
这属于blog 1的功能。php(或者更好的,一个插件)并每24小时将小部件保存到定制的瞬态中。

function antwortzeit_widgetbruecke( $instance, $new_instance ) {
    delete_site_transient(\'antwortzeit_widgets\');
    antwortzeit_cache_widgets();
    return $instance;
}
add_filter( \'widget_update_callback\', \'antwortzeit_widgetbruecke\', 10, 2 );
这也属于blog 1的功能。php并在每次更新小部件时更新瞬态。

最后,对于其他博客,请进入侧边栏。php:

global $blog_id;

if($blog_id !== 1) {
switch_to_blog(1);
    $widgets = get_site_transient( \'antwortzeit_widgets\' );
    if($widgets) :
        foreach($widgets as $widget) :
        if ( is_callable($widget[\'callback\']) ) {
            call_user_func_array($widget[\'callback\'], $widget[\'params\']);
        }
        endforeach; 
    endif;
restore_current_blog();
}
希望这能帮到别人。如果有任何改进,将非常受欢迎。

SO网友:kovshenin

确保在widgets\\u init期间,两个站点上运行的侧栏注册代码完全相同。这将填充$wp\\u registered\\u侧栏,并解决Boone强调的问题。我自己也没试过。

SO网友:shawn

这“可能”为您指明了正确的方向。

Xtreme One-主题框架-http://marketpress.com/product/xtreme/

查看视频-http://vimeo.com/52479425

基本概念是,在向网络站点添加侧栏时,还可以将其指定为全局侧栏。

SO网友:developdaly

Are you using global $switched;?

global $switched;
switch_to_blog($blog_id);
dynamic_sidebar($sidebar_name);
restore_current_blog();
结束

相关推荐

WordPress MultiSite中的批量主题设置

我有一个有500多个子网站的多网站。我想在所有500多个网站上安装相同的主题。大多数都需要配置,如选择侧栏(左/右)、选择主菜单等。是否有任何插件可用于此工作?奥坎有人能给我一些建议吗?谢谢