Bin auf das gleiche Problem gestoßen und habe eine Lösung gefunden. Was ich tue, ist das Folgende:
1.) Wenn in der Seitenleiste von Blog 1 etwas geändert wird, speichern Sie ein Array dieser Widgets und ihrer Einstellungen als vorübergehenden Übergang, der nach 24 Stunden veraltet ist.
2.) Fügen Sie in allen untergeordneten Blogs Code in sidebar.php ein, der diesen standortweiten Übergang erfasst und die Widgets anzeigt.
Klingt ziemlich einfach, war aber sehr schwer herauszufinden… und ist immer noch alles andere als perfekt.
Lassen Sie uns einen Code untersuchen:
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');
Dies gehört in die functions.php von Blog 1 (oder besser ein Plugin insgesamt) und speichert die Widgets alle 24 Stunden in dem maßgeschneiderten Transienten.
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 );
Dies gehört auch in die Datei functions.php von Blog 1 und erneuert den Übergang jedes Mal, wenn die Widgets aktualisiert werden.
Und schließlich für die anderen Blogs in sidebar.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();
}
Hoffe, das kann jemandem helfen. Wenn man Verbesserungen hat, sind sie sehr willkommen.
get_blog_option('1','sidebars_widgets');
ich eine Liste von Widgets abgerufen habe, aber ich konnte sowieso keine finden, um die Daten in einer Seitenleiste zu verarbeiten.