質問: マルチサイトブログ間での動的サイドバーの共有 私はwordpress multisiteの同じインストールで、あるブログから動的なサイドバーを回収して別のブログに印刷する方法を見つけようとしています。私が試してみましたswitch_to_blog($blog_id); dynamic_sidebar($sidebar_name); restore_current_blog(); しかし、何も返されません。サイドバーをget_blog_option($blog_id, 'sidebar_widgets')経由で再検索するのも面倒ですが、サイドバーで使用されているウィジェットを特定するためにアレイを再試行することしかできませんでしたが、アレイをサイドバーに処理する方法を見つけることができませんでした。
回答: 同じ問題に突き当たり、解決策を見つけました。私がやっているのは次のとおりです。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'); これはblog 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 ); これはblog 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(); } うまくいけば、これは誰かを助けることができます。何か改善があったら、それらは大歓迎です。