Ran dans le même problème et sorte de trouver une solution. Ce que je fais est le suivant:
1.) Chaque fois que quelque chose est modifié dans la barre latérale du blog 1, enregistrez un tableau de ces widgets et de leurs paramètres en tant que transitoire sur tout le site, qui est dépassé après 24 heures.
2.) Sur tous les blogs enfants, mettez du code dans sidebar.php qui saisit ce transitoire à l'échelle du site et affiche les widgets.
Cela semble assez facile, mais était très difficile à comprendre… et est encore loin d'être parfait.
Examinons un peu de code:
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');
Cela fait partie de functions.php du blog 1 (ou mieux, un plugin tous ensemble) et enregistre les widgets dans le transitoire sur mesure toutes les 24 heures.
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 );
Cela fait également partie du fichier functions.php du blog 1 et renouvelle le transitoire à chaque mise à jour des widgets.
Et enfin pour les autres blogs, allez dans 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();
}
J'espère que cela peut aider quelqu'un. Si l'on a des améliorations, elles seront les bienvenues.
get_blog_option('1','sidebars_widgets');
pour obtenir une liste de widgets mais je n'ai pas trouvé de toute façon de traiter les données dans une barre latérale.