web-dev-qa-db-fra.com

Partage de barres latérales dynamiques sur des blogs multisites

J'essaie de trouver plus loin pour récupérer une barre latérale dynamique d'un blog et l'imprimer sur un autre blog dans la même installation de Wordpress Multisite. j'ai essayé

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

Mais rien n'est retourné.

Je me suis aussi fatigué de réintégrer la barre latérale via get_blog_option($blog_id, 'sidebar_widgets'), mais je n’ai pu retranscrire un tableau que d’identifier les widgets utilisés par la barre latérale, mais je n’ai pas trouvé de solution pour transformer le tableau en barre latérale.

8
Timothy Wallis

Malheureusement, la méthode switch_to_blog() ne fonctionnera pas à cette fin. switch_to_blog() n'est en réalité qu'un commutateur partiel - il apporte quelques modifications à $wpdb qui facilitent les requêtes de base de données. Mais ce n’est pas un changement complet de la façon dont vous pourriez l’imaginer.

En particulier, dynamic_sidebar() dépend du nom global appelé $wp_registered_sidebars. Ce global est peuplé par register_sidebar(), généralement appelé à partir d'un fichier de thème tel que functions.php. Mais functions.php et le reste du processus de configuration du thème ne sont pas réexécutés par switch_to_blog(). Autrement dit, si vous utilisez Twenty Eleven sur le blog actuel, il enregistrera ses propres barres latérales lors du démarrage. utiliser switch_to_blog() sur un blog exécutant Twenty Ten sera not dit à Twenty Ten de configurer its sidebars. Vous pouvez essayer de le forcer (en chargeant manuellement le fichier functions.php du switch-blog), mais cela risque presque toujours de provoquer un désastre, en raison de problèmes de noms de fonctions en double, d'ordre de chargement, etc., etc.

Vous pouvez essayer une approche un peu différente: sur le blog avec la barre latérale que vous souhaitez, créez une fonction qui imprimera le contenu de la barre latérale dans le tampon de sortie, puis, avant de l’imprimer à l’écran, stockez-le dans une option site_option. Vous pouvez ensuite récupérer la barre latérale (ou au moins une version statique de celle-ci) sur n’importe quel site du réseau. Cela ne fonctionnera pas si vous avez absolument besoin de une barre latérale totalement dynamique, mais dans la plupart des cas, ce n'est probablement pas le cas.

Une autre méthode (qui peut être plus simple) consiste à rendre la barre latérale avec une fonction dans un fichier mu-plugins ou quelque chose du genre, puis à appeler la fonction manuellement dans vos thèmes (ou à l’accrocher à un crochet commun de la barre latérale). Il faudrait peut-être un certain travail pour extraire le contenu de l’architecture WP_Widget, mais ce serait en revanche une solution véritablement dynamique au problème à résoudre.

7
Boone Gorges

Couru dans le même problème et genre de trouvé une solution. Ce que je fais est le suivant:

1.) Chaque fois que quelque chose est modifié dans la barre latérale du blog 1, enregistrez un tableau de ces widgets et de leurs paramètres en tant que transitoire à l'échelle du site, qui expire après 24 heures.

2.) Sur tous les blogs pour enfants, mettez du code dans sidebar.php qui saisit ce transitoire dans tout le site et affiche les widgets.

Cela semble assez facile, mais c'était très difficile à comprendre… et est encore loin d'être parfait.

Fouillons dans du code:

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

Cela appartient au fichier functions.php du blog 1 (ou mieux, à un plugin complet) et enregistre les widgets dans le transitoire sur mesure toutes les 24 heures.

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

Cela appartient également au fichier functions.php du blog 1 et renouvelle le transitoire chaque fois que les widgets sont mis à jour.

Et enfin, pour les autres blogs, entrez dans 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();
}

Espérons que cela peut aider quelqu'un. Si quelqu'un apporte des améliorations, ils seront les bienvenus.

2
Christian Jung

Assurez-vous que le même code d'enregistrement des barres latérales est en cours d'exécution sur les deux sites au cours de widgets_init. Cela devrait peupler $ wp_registered_sidebars et résoudre le problème mis en évidence par Boone. Je n'ai pas essayé cela moi-même.

1
kovshenin

Cela pourrait vous orienter dans la bonne direction.

Xtreme One - Thème Framework - http://marketpress.com/product/xtreme/

Regardez la vidéo - http://vimeo.com/52479425

Le concept de base est lorsque vous ajoutez une barre latérale à un site réseau, vous pouvez également l'affecter à une barre latérale globale.

0
shawn