it-swarm-eu.dev

Sdílení dynamických postranních panelů napříč vícestrannými blogy

Snažím se najít pryč, abych se vrátil k dynamickému postrannímu panelu z jednoho blogu a vytisknul jej na jiném blogu ve stejné instalaci aplikace Wordpress Multisite. zkusil jsem

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

Ale nic se nevrátí.

Také jsem unavený, abych se vrátil do sidebar přes get_blog_option($blog_id, 'sidebar_widgets'), ale byl jsem schopen jen znovuzískat pole identifikující, jaké widgety byly používány sidebarem, ale nemohl jsem se dozvědět, že by bylo možné zpracovat pole do postranního panelu.

8
Timothy Wallis

Metoda switch_to_blog() pro tento účel bohužel nebude fungovat. switch_to_blog() je opravdu jen částečný přepínač - dělá některé změny v $wpdb, které pomáhají s databázovými dotazy. Ale není to úplný přepínač tak, jak si představujete.

dynamic_sidebar() závisí zejména na globálním názvem $wp_registered_sidebars. Tento globální je naplněn register_sidebar(), který je obecně volán ze souboru motivu, jako je function.php. Funkce function.php a zbytek procesu nastavení tématu však není znovu spuštěn příkazem switch_to_blog(). To znamená, že pokud na aktuálním blogu používáte Twenty Eleven, zaregistruje si během spuštění vlastní postranní panely; pomocí switch_to_blog() do blogu s Twenty Ten bude not říct Twenty Ten nastavit jeho sidebars. Mohli byste to zkusit vynucovat (načtením manuálně přepnutých funkcí blogu v přepnutém blogu), ale to je téměř jisté, že to povede ke katastrofě, kvůli problémům s duplicemi názvů funkcí, pořadí načítání atd. Atd.

Můžete zkusit poněkud odlišný směr: Na blogu s postranním panelem, který chcete, vytvořte funkci, která vytiskne obsah postranního panelu do výstupní vyrovnávací paměti, a pak ji před tiskem na obrazovku skryjte v místě site_option. Potom můžete postranní panel (nebo jeho statickou verzi) chytit alespoň z libovolného webu v síti. Nebude to fungovat, pokud budete naprosto potřebovat naprosto dynamický postranní panel, ale pro většinu účelů pravděpodobně nebudete.

Další metodou (která může být jednodušší) je vykreslit postranní panel s funkcí v souboru mu-plugins nebo něco takového a pak funkci ručně zavolat do svých motivů (nebo ji zavěste na společný sidebar). To by mohlo trvat nějakou práci, aby se obsah z architektury WP_Widget odstranil, ale na druhou stranu by to bylo skutečně dynamické řešení problému.

7
Boone Gorges

Vstoupil do stejného problému a vynalezl řešení. Co dělám je následující:

1.) Kdykoliv se na postranním panelu blogu 1 změní něco, uložte pole těchto widgetů a jejich nastavení jako přechodný web, který je po 24 hodinách zastaralý.

2.) Na všechny dětské blogy, vložte nějaký kód do sidebar.php, který chytí tento sitewide přechod a zobrazí widgety.

Zní to docela snadno, ale bylo velmi těžké přijít na to… a stále není zdaleka dokonalý.

Pojďme kopat do nějakého kódu:

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

Toto patří do funkcí blogu 1 (function.php) (nebo lépe, plugin dohromady) a ukládá widgety do přechodného režimu na míru každých 24 hodin.

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

To také náleží do blogu 1 v function.php a obnovuje přechodné změny pokaždé, když jsou widgety aktualizovány.

A konečně pro ostatní blogy přejděte do 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();
}

Doufám, že to může někomu pomoci. Pokud má někdo nějaké zlepšení, budou velmi vítáni.

2
Christian Jung

Ujistěte se, že máte na obou stránkách během registrace widgetgets_init stejný registrační kód sidebars. To by mělo naplnit $ wp_registered_sidebars a vyřešit problém, který Boone zvýraznil. Nezkoušel jsem to sám.

1
kovshenin

Toto 'vás' nasměruje správným směrem.

Xtreme One - Rámec motivů - http://marketpress.com/product/xtreme/

Zkontrolujte video - http://vimeo.com/52479425

Základní koncept je, když přidáváte postranní panel k síti, můžete jej také přiřadit jako globální postranní panel.

0
shawn