マルチサイトブログ間での動的サイドバーの共有


8

Wordpress Multisiteの同じインストールで、あるブログから動的なサイドバーを取得して別のブログに印刷する方法を見つけようとしています。私が試してみました

switch_to_blog($blog_id);
dynamic_sidebar($sidebar_name);
restore_current_blog();

しかし、何も返されません。

サイドバーを取得するのにも疲れましたget_blog_option($blog_id, 'sidebar_widgets')が、配列を取得してサイドバーで使用されているウィジェットを特定することしかできませんでしたが、配列をサイドバーに処理する方法を見つけることができませんでした。

回答:


7

残念ながら、このswitch_to_blog()方法はこの目的では機能しません。switch_to_blog()実際には部分的なスイッチにすぎません$wpdb。データベースクエリに役立つ変更がいくつか加えられています。しかし、それはあなたが想像するような方法での完全な切り替えではありません。

特に、dynamic_sidebar()呼ばれるグローバルに依存し$wp_registered_sidebarsます。このグローバルはによって生成されregister_sidebar()、通常はfunctions.phpのようなテーマファイルから呼び出されます。ただし、functions.phpと残りのテーマ設定プロセスは、によって再実行されませんswitch_to_blog()。つまり、現在のブログでTwenty Elevenを実行している場合、起動時に独自のサイドバーが登録されます。使用してswitch_to_blog()二十テンを実行しているブログにはなりません設定するには二十テンを教えサイドバーを。(switched-blogのfunctions.phpを手動で読み込むことで)強制的に試すこともできますが、関数名の重複や読み込み順序などの問題により、これはほぼ間違いなく災害につながります。

少し異なる方法を試すこともできます。サイドバーが必要なブログで、サイドバーの内容を出力バッファーに出力する関数を作成し、それを画面に出力する前に、site_optionに隠しておきます。次に、ネットワーク上の任意のサイトからサイドバー(または少なくとも静的バージョン)を取得できます。完全に動的なサイドバーが絶対に必要な場合、これは機能しませんが、ほとんどの目的ではおそらく機能しません。

別の方法(より簡単かもしれません)は、mu-pluginsファイル内の関数などでサイドバーをレンダリングし、テーマで手動で関数を呼び出す(または一般的なサイドバーフックにフックする)方法です。WP_Widgetアーキテクチャーからコンテンツを抽象化するには多少の作業が必要かもしれませんが、一方で、それは当面の問題に対する真に動的な解決策となります。


他の2つの方法が素晴らしいアイデアのように聞こえるので、最初の方法を試すことをすでに考えていましたが、2番目の方法を少し具体化できますか?get_blog_option('1','sidebars_widgets');ウィジェットのリストを取得するためにを使用してこのようなことを試みていたと思いますが、データをサイドバーに処理する方法を見つけることができませんでした。
ティモシーウォリス

WPの実際のウィジェットインフラストラクチャを使用するよりも、問題が多くなると思います。代わりに、ウィジェットマークアップ/ PHPを別の関数に抽象化し、テンプレートファイルで直接呼び出す(または適切なアクションにフックする)。
ブーン渓谷

2

同じ問題にぶつかり、解決策を見つけ出しました。私がやっていることは次のとおりです:

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();
}

これが誰かを助けることを願っています。何か改善があれば、大歓迎です。


1

widgets_initの実行中に、両方のサイトでまったく同じサイドバー登録コードを実行していることを確認してください。これで$ wp_registered_sidebarsが読み込まれ、Booneが強調した問題が解決されます。これを自分で試したことはありません。


0

これは正しい方向にあなたを向けます。

Xtreme One-テーマフレームワーク-http://marketpress.com/product/xtreme/

ビデオをチェックしてください-http://vimeo.com/52479425

基本的な概念は、サイドバーをネットワークサイトに追加するとき、グローバルサイドバーとして割り当てることもできます。


興味深いことに、彼はどうやってやっているのだろう。おそらく、widget_update_callbackを変更して、そのグローバルかどうかをチェックして確認し、クエリを実行して現在のサイトのすべての子ブログに追加します。
ティモシーウォリス

-1

使っていglobal $switched;ますか?

global $switched;
switch_to_blog($blog_id);
dynamic_sidebar($sidebar_name);
restore_current_blog();

$switchedグローバルは内から呼び出されますswitch_to_blog()。グローバル名前空間で宣言する必要はありません。
ブーン渓谷、

知ってよかった。古いWPMUメソッドを使用しています。それでは、アクセスできないサイドバーだけですか?メニューはどうですか?
12

私はそれをテストする必要がありますが、メニューはswitch_to_blog()呼び出される前にテーマによって登録される必要がないため(登録データはデータベースに格納されます)、メニューがコンテキストで機能する可能性があると思います。
ブーン渓谷、

メニューが機能することを確認できます。使用した結果を確認してくださいis_active_sidebar($sidebar_name)
12
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.