it-swarm.com.de

Freigeben dynamischer Seitenleisten in Blogs mit mehreren Standorten

Ich versuche herauszufinden, wie Sie eine dynamische Seitenleiste aus einem Blog abrufen und in derselben Installation von Wordpress Multisite in einem anderen Blog drucken können. Ich habe versucht

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

Es wird aber nichts zurückgegeben.

Ich war auch müde, die Sidebar über get_blog_option($blog_id, 'sidebar_widgets') abzurufen, aber ich konnte nur ein Array abrufen, das angibt, welche Widgets von der Sidebar verwendet wurden, aber ich konnte nicht herausfinden, wie das Array in eine Sidebar umgewandelt werden kann.

8
Timothy Wallis

Leider funktioniert die Methode switch_to_blog() für diesen Zweck nicht. switch_to_blog() ist eigentlich nur ein Teilschalter - es werden einige Änderungen an $wpdb vorgenommen, die bei Datenbankabfragen hilfreich sind. Aber es ist kein vollständiger Wechsel, wie Sie es sich vorstellen können.

Insbesondere hängt dynamic_sidebar() von der globalen Bezeichnung $wp_registered_sidebars ab. Dieses Global wird von register_sidebar() gefüllt, das im Allgemeinen aus einer Themendatei wie functions.php aufgerufen wird. Aber functions.php und der Rest des Theme-Setup-Prozesses werden von switch_to_blog() nicht erneut ausgeführt. Das heißt: Wenn Sie im aktuellen Blog Twenty Eleven ausführen, werden beim Start eigene Seitenleisten registriert. Wenn Sie switch_to_blog() für ein Blog mit Twenty Ten verwenden, wird not Twenty Ten angewiesen, its sidebars einzurichten. Sie könnten versuchen, es zu erzwingen (indem Sie die functions.php des Switched-Blogs manuell laden), aber dies führt mit ziemlicher Sicherheit zu einer Katastrophe, aufgrund von Problemen mit doppelten Funktionsnamen, Ladereihenfolge usw. usw. usw.

Möglicherweise versuchen Sie es mit einem etwas anderen Ansatz: Erstellen Sie in dem Blog mit der gewünschten Seitenleiste eine Funktion, die den Inhalt der Seitenleiste in den Ausgabepuffer druckt, und speichern Sie ihn in einer site_option, bevor Sie ihn auf dem Bildschirm drucken. Dann können Sie die Seitenleiste (oder zumindest eine statische Version davon) von jedem Standort im Netzwerk herunterladen. Dies funktioniert nicht, wenn Sie unbedingt eine vollständig dynamische Seitenleiste benötigen, aber für die meisten Zwecke wahrscheinlich nicht.

Eine andere (möglicherweise einfachere) Methode besteht darin, die Seitenleiste mit einer Funktion in einer mu-plugins-Datei oder ähnlichem zu rendern und die Funktion dann manuell in Ihren Designs aufzurufen (oder sie an einen gemeinsamen Seitenleisten-Hook anzuhängen). Es könnte einige Arbeit erfordern, um den Inhalt aus der WP_Widget-Architektur zu extrahieren, aber andererseits wäre es eine wirklich dynamische Lösung für das vorliegende Problem.

7
Boone Gorges

Stieß auf das gleiche Problem und fand eine Lösung. Was ich tue, ist das folgende:

1.) Wenn sich in der Seitenleiste von Blog 1 etwas ändert, speichern Sie eine Reihe dieser Widgets und deren Einstellungen als vorübergehende Website, die nach 24 Stunden veraltet ist.

2.) Fügen Sie in allen untergeordneten Blogs Code in sidebar.php ein, der diese vorübergehende Site erfasst und die Widgets anzeigt.

Klingt ziemlich einfach, war aber sehr schwer herauszufinden ... und ist immer noch alles andere als perfekt.

Lassen Sie uns in einen Code graben:

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

Dies gehört in die Datei functions.php von Blog 1 (oder besser gesagt, ein Plugin insgesamt) und speichert die Widgets alle 24 Stunden in der maßgeschneiderten Transiente.

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

Dies gehört auch in die functions.php von Blog 1 und erneuert den Übergang jedes Mal, wenn die Widgets aktualisiert werden.

Und zum Schluss für die anderen Blogs in 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();
}

Hoffe, das kann jemandem helfen. Wenn jemand Verbesserungen hat, sind sie sehr willkommen.

2
Christian Jung

Stellen Sie sicher, dass auf beiden Sites während widgets_init genau derselbe Seitenleisten-Registrierungscode ausgeführt wird. Das sollte $ wp_registered_sidebars füllen und das von Boone hervorgehobene Problem lösen. Habe ich nicht selbst ausprobiert.

1
kovshenin

Dies könnte Sie in die richtige Richtung lenken.

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

Überprüfen Sie das Video - http://vimeo.com/52479425

Das Grundkonzept besteht darin, dass Sie einer Netzwerksite eine Seitenleiste hinzufügen und diese auch als globale Seitenleiste zuweisen können.

0
shawn