Berbagi Sidebar Dinamis di Blog Multisite

8

Saya mencoba mencari cara untuk mengambil sidebar dinamis dari satu blog dan mencetaknya di blog lain di instalasi yang sama dari Wordpress Multisite. saya telah mencoba

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

Tapi tidak ada yang dikembalikan.

Saya juga lelah untuk membuka kembali bilah samping, get_blog_option($blog_id, 'sidebar_widgets')tetapi saya hanya dapat membuka kembali bilah mengidentifikasi widget apa yang digunakan oleh bilah sisi, tetapi saya tidak dapat menemukan cara memproses array menjadi bilah samping.

Timothy Wallis
sumber

Jawaban:

7

Sayangnya, switch_to_blog()metode ini tidak akan berfungsi untuk tujuan ini. switch_to_blog()sebenarnya hanya sebagian saklar - itu membuat beberapa modifikasi untuk $wpdbbantuan dengan permintaan basis data. Tapi itu bukan saklar lengkap dalam cara yang Anda bayangkan.

Secara khusus, dynamic_sidebar()tergantung pada panggilan global $wp_registered_sidebars. Global ini diisi oleh register_sidebar(), yang umumnya dipanggil dari file tema seperti functions.php. Tapi functions.php, dan sisa proses pengaturan tema, tidak dijalankan kembali oleh switch_to_blog(). Artinya: jika Anda menjalankan Twenty Eleven di blog saat ini, itu akan mendaftarkan sidebars sendiri selama startup; menggunakan switch_to_blog()untuk blog yang menjalankan Twenty Ten tidak akan memberitahu Twenty Ten untuk mengatur sidebars -nya . Anda dapat mencoba memaksanya (dengan memuat functions.php switched-blog secara manual) tetapi ini hampir pasti menyebabkan bencana, karena masalah dengan nama fungsi duplikat, urutan pemuatan, dll dll.

Anda dapat mencoba taktik yang agak berbeda: Di blog dengan bilah sisi yang Anda inginkan, bangun sebuah fungsi yang akan mencetak isi bilah sisi ke dalam buffer output, dan kemudian sebelum mencetaknya ke layar, simpan di situs_pilihan. Kemudian Anda dapat mengambil bilah samping (atau versi statis, setidaknya) dari situs mana pun di jaringan. Ini tidak akan berfungsi jika Anda benar-benar membutuhkan bilah sisi yang benar-benar dinamis, tetapi untuk sebagian besar tujuan Anda mungkin tidak.

Metode lain (yang mungkin lebih mudah) adalah merender sidebar dengan fungsi dalam file mu-plugins atau semacamnya, dan kemudian memanggil fungsi secara manual di tema Anda (atau mengaitkannya ke kait sidebar umum). Mungkin diperlukan beberapa pekerjaan untuk mengabstraksi konten dari WP_Widgetarsitektur, tetapi di sisi lain itu akan menjadi solusi yang benar-benar dinamis untuk masalah yang dihadapi.

Boone Gorges
sumber
Terima kasih dua metode lain itu kedengarannya seperti ide-ide hebat, saya sudah berpikir untuk mencoba yang pertama, tetapi bisakah Anda menyempurnakan Ide kedua sedikit. Saya pikir saya mencoba melakukan sesuatu seperti ini dengan menggunakan get_blog_option('1','sidebars_widgets');untuk mendapatkan daftar widget tetapi saya tidak dapat menemukan cara untuk memproses data menjadi sidebar.
Timothy Wallis
Saya pikir ini akan menjadi lebih banyak masalah daripada layak untuk tetap dengan infrastruktur widget WP yang sebenarnya. Alih-alih, abstraksi markup widget / PHP menjadi fungsi terpisah, yang kemudian akan Anda panggil langsung dalam file templat (atau kaitkan ke tindakan yang sesuai).
Boone Gorges
2

Berlari ke masalah yang sama dan menemukan solusi. Apa yang saya lakukan adalah sebagai berikut:

1.) Setiap kali ada sesuatu yang berubah di sidebar blog 1, simpan array widget tersebut dan pengaturannya sebagai transient seluruh dunia, yang akan kedaluwarsa setelah 24 jam.

2.) Pada semua blog anak-anak, masukkan beberapa kode ke sidebar.php yang mengambil transient seluruh tempat ini dan menampilkan widget.

Kedengarannya cukup mudah, tetapi sangat sulit untuk mencari tahu ... dan masih jauh dari sempurna.

Mari kita menggali beberapa Kode:

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');

Ini termasuk dalam functions.php blog 1 (atau lebih baik, plugin semuanya) dan menyimpan widget ke transient dipesan lebih dahulu setiap 24 jam.

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

Ini juga termasuk ke dalam fungsi blog 1. php dan memperbarui sementara setiap kali widget diperbarui.

Dan akhirnya untuk blog lain masuk ke 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();
}

Semoga ini bisa membantu seseorang. Jika seseorang memiliki perbaikan, mereka akan sangat disambut.

Christian Jung
sumber
1

Pastikan Anda memiliki kode registrasi sidebars yang sama persis berjalan di kedua situs selama widgets_init. Itu seharusnya mengisi $ wp_registered_sidebars dan menyelesaikan masalah yang disoroti Boone. Belum mencoba ini sendiri.

kovshenin
sumber
0

Ini 'mungkin' mengarahkan Anda ke arah yang benar.

Xtreme One - Kerangka Tema - http://marketpress.com/product/xtreme/

Periksa videonya - http://vimeo.com/52479425

Konsep dasarnya adalah ketika menambahkan sidebar ke situs jaringan, Anda juga dapat menetapkannya sebagai sidebar global.

shawn
sumber
Menarik, saya bertanya-tanya bagaimana dia melakukannya. Widget_update_callback mungkin dimodifikasi untuk memeriksa dan melihat apakah itu global dan kemudian menjalankan kueri untuk menambahkannya ke semua blog anak-anak dari situs saat ini.
Timothy Wallis
-1

Apakah Anda menggunakan global $switched;?

global $switched;
switch_to_blog($blog_id);
dynamic_sidebar($sidebar_name);
restore_current_blog();
berkembang
sumber
The $switchedglobal dipanggil dari dalam switch_to_blog(). Anda tidak perlu mendeklarasikannya di namespace global.
Boone Gorges
Senang mendengarnya. Saya menggunakan metode WPMU yang ketinggalan zaman. Jadi, apakah hanya sidebar yang tidak dapat Anda akses? Bagaimana dengan menu?
developdaly
Saya perlu mengujinya, tetapi saya menduga bahwa menu mungkin bekerja dalam switch_to_blog()konteks, karena mereka tidak perlu didaftarkan oleh tema sebelum dipanggil (data pendaftaran disimpan dalam database).
Boone Gorges
Saya dapat mengkonfirmasi bahwa menu berfungsi. Lihat apa hasil penggunaannya is_active_sidebar($sidebar_name).
developdaly