同じ問題にぶつかり、解決策を見つけ出しました。私がやっていることは次のとおりです:
1.)ブログ1のサイドバーで何かが変更された場合は常に、それらのウィジェットとその設定の配列をサイト全体の一時的なものとして保存します。これは24時間後に期限切れになります。
2.)すべての子ブログで、このサイト全体のトランジェントを取得してウィジェットを表示するコードをsidebar.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');
これはブログ1のfunctions.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 );
これはブログ1のfunctions.phpにも属し、ウィジェットが更新されるたびに一時を更新します。
そして最後に、他のブログについては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();
}
これが誰かを助けることを願っています。何か改善があれば、大歓迎です。
get_blog_option('1','sidebars_widgets');
ウィジェットのリストを取得するためにを使用してこのようなことを試みていたと思いますが、データをサイドバーに処理する方法を見つけることができませんでした。