Chạy vào cùng một vấn đề và tìm ra giải pháp. Những gì tôi đang làm là như sau:
1.) Bất cứ khi nào một cái gì đó được thay đổi trên thanh bên của blog 1, hãy lưu một mảng các vật dụng đó và các cài đặt của chúng dưới dạng tạm thời, sẽ hết hạn sau 24 giờ.
2.) Trên tất cả các blog con, hãy đặt một số mã vào sidebar.php để lấy trạng thái tạm thời này và hiển thị các widget.
Nghe có vẻ khá dễ, nhưng rất khó để tìm ra được và vẫn chưa hoàn hảo.
Hãy đi sâu vào một số Mã:
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');
Điều này thuộc về các chức năng của blog 1 (hoặc tốt hơn là một plugin hoàn toàn) và lưu các widget vào tạm thời sau mỗi 24 giờ.
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 );
Điều này cũng thuộc về hàm.php của blog 1 và gia hạn tạm thời mỗi khi các widget được cập nhật.
Và cuối cùng cho các blog khác thả vào 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();
}
Hy vọng, điều này có thể giúp ai đó ra ngoài. Nếu ai có bất kỳ cải tiến nào, họ sẽ rất hoan nghênh.
get_blog_option('1','sidebars_widgets');
để có được một danh sách các widget nhưng dù sao tôi cũng không thể tìm thấy để xử lý dữ liệu thành một thanh bên.