遇到了同样的问题并找到了解决方案。我正在做的是:
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();
}
希望这能帮到别人。如果有任何改进,将非常受欢迎。