Condivisione di barre laterali dinamiche su blog multisito


8

Sto cercando di trovare una barra laterale dinamica da un blog e stamparla su un altro blog nella stessa installazione di Wordpress Multisite. Ho provato

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

Ma non viene restituito nulla.

Mi sono anche stancato di ripristinare la barra laterale, get_blog_option($blog_id, 'sidebar_widgets')ma sono stato in grado di recuperare un array solo per identificare quali widget sono stati utilizzati dalla barra laterale, ma non sono riuscito a trovare il percorso per elaborare l'array in una barra laterale.

Risposte:


7

Sfortunatamente, il switch_to_blog()metodo non funzionerà per questo scopo. switch_to_blog()è davvero solo uno switch parziale - apporta alcune modifiche a $wpdbtale aiuto con le query del database. Ma non è un passaggio completo nel modo che potresti immaginare.

In particolare, dynamic_sidebar()dipende dal globale chiamato $wp_registered_sidebars. Questo globale è popolato da register_sidebar(), che viene generalmente chiamato da un file di temi come Functions.php. Ma funziona.php, e il resto del processo di installazione del tema, non viene eseguito nuovamente switch_to_blog(). Vale a dire: se stai eseguendo Twenty Eleven sul blog attuale, registrerà le sue barre laterali durante l'avvio; utilizzando switch_to_blog()un blog che esegue Twenty Ten non dirà a Twenty Ten di impostare le sue barre laterali. Potresti provare a forzarlo (caricando manualmente le funzioni.php del cambio-blog) ma questo è quasi certo che porterà a un disastro, a causa di problemi con nomi di funzioni duplicate, ordine di caricamento, ecc. Ecc. Ecc.

Potresti provare una virata un po 'diversa: sul blog con la barra laterale che desideri, crea una funzione che stamperà il contenuto della barra laterale nel buffer di output, quindi prima di stamparlo sullo schermo, nascondilo in un'opzione site_option. Quindi puoi afferrare la barra laterale (o almeno una versione statica di essa) da qualsiasi sito della rete. Questo non funzionerà se hai assolutamente bisogno di una barra laterale totalmente dinamica, ma per la maggior parte probabilmente non lo fai.

Un altro metodo (che potrebbe essere più semplice) è rendere la barra laterale con una funzione in un file mu-plugins o qualcosa del genere, quindi chiamare manualmente la funzione nei temi (o collegarla a un gancio della barra laterale comune). Potrebbe volerci un po 'di lavoro per estrarre il contenuto WP_Widgetdall'architettura, ma d'altra parte sarebbe una soluzione veramente dinamica al problema in questione.


Grazie a quegli altri due metodi suona come grandi idee, stavo già pensando di provare il primo, ma potresti dare un po 'più forza alla seconda Idea. Penso che stavo cercando di fare qualcosa del genere utilizzando get_blog_option('1','sidebars_widgets');per ottenere un elenco di widget ma non sono riuscito a trovare comunque per elaborare i dati in una barra laterale.
Timothy Wallis,

Penso che ci saranno più problemi di quanti ne valga la pena attenersi all'attuale infrastruttura di widget di WP. Invece, astraggete il markup / PHP del widget in una funzione separata, che richiamerete direttamente in un file modello (o agganciate a un'azione appropriata).
Boone Gorges,

2

Ho riscontrato lo stesso problema e ho trovato una soluzione. Quello che sto facendo è il seguente:

1.) Ogni volta che qualcosa viene cambiato nella barra laterale del blog 1, salva una serie di quei widget e le loro impostazioni come transitori a livello di sito, che si superano dopo 24 ore.

2.) Su tutti i blog per bambini, inserisci un po 'di codice in sidebar.php che cattura questo transitorio su tutto il sito e visualizza i widget.

Sembra abbastanza facile, ma è stato molto difficile da capire ... ed è tutt'altro che perfetto.

Scaviamo in qualche codice:

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

Questo appartiene alle funzioni.php del blog 1 (o meglio, un plug-in del tutto) e salva i widget nel transitorio su misura ogni 24 ore.

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

Questo fa anche parte delle funzioni.php del blog 1 e rinnova il transitorio ogni volta che i widget vengono aggiornati.

E infine, per gli altri blog, vai su 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();
}

Spero che questo possa aiutare qualcuno. Se uno ha dei miglioramenti, saranno i benvenuti.


1

Assicurati di avere lo stesso codice di registrazione delle stesse barre laterali in esecuzione su entrambi i siti durante widgets_init. Ciò dovrebbe popolare $ wp_registered_sidebars e risolvere il problema evidenziato da Boone. Non ho provato questo da solo.


0

Questo 'potrebbe' indirizzarti nella giusta direzione.

Xtreme One - Theme Framework - http://marketpress.com/product/xtreme/

Guarda il video - http://vimeo.com/52479425

Il concetto di base è quando si aggiunge una barra laterale a un sito di rete, è anche possibile assegnarla come barra laterale globale.


Interessante, mi chiedo come lo stia facendo. Probabilmente modificato widget_update_callback per verificare e vedere se è globale e quindi eseguire una query per aggiungerla a tutti i blog secondari del sito corrente.
Timothy Wallis,

-1

Stai usando global $switched;?

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

Il $switchedglobale è chiamato dall'interno switch_to_blog(). Non è necessario dichiararlo nello spazio dei nomi globale.
Boone Gorges,

Buono a sapersi. Sto usando un metodo WPMU obsoleto. Quindi sono solo le barre laterali a cui non puoi accedere? E i menu?
Developdaly,

Avrei bisogno di provarlo, ma suppongo che i menu potrebbero funzionare in un switch_to_blog()contesto, perché non devono essere registrati dal tema prima di essere chiamati (i dati di registrazione sono memorizzati nel database).
Boone Gorges,

Posso confermare che i menu funzionano. Guarda qual è il risultato dell'utilizzo is_active_sidebar($sidebar_name).
Developdaly,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.