web-dev-qa-db-fra.com

Comment lister tous les sites du réseau sur une seule page

Puis-je lister tous les blogs de mon réseau sur une seule page?

5
Demilio

oui, petite source pour un modèle.

<ul class='postlist no-mp'>

<?php 
/**
 * Old version, change on 07/23/2013
 *
$blogs = $wpdb->get_results( 
    "SELECT blog_id,path FROM {$wpdb->blogs} 
    WHERE blog_id != {$wpdb->blogid} 
    AND site_id = '{$wpdb->siteid}' 
    AND spam = '0' 
    AND deleted = '0' 
    AND archived = '0' 
    order by blog_id", ARRAY_A
); 
 */

// get all blogs
$blogs = get_blog_list( 0, 'all' );

if ( 0 < count( $blogs ) ) :
    foreach( $blogs as $blog ) : 
        switch_to_blog( $blog[ 'blog_id' ] );

        if ( get_theme_mod( 'show_in_home', 'on' ) !== 'on' ) {
            continue;
        }

        $description  = get_bloginfo( 'description' );
        $blog_details = get_blog_details( $blog[ 'blog_id' ] );
        ?>
        <li class="no-mp">

            <h2 class="no-mp blog_title">
                <a href="<?php echo $blog_details->path ?>">
                    <?php echo  $blog_details->blogname; ?>
                </a>
            </h2>

            <div class="blog_description">
                <?php echo $description; ?>
            </div>

            <?php 
            query_posts( 'showposts=5' );
            if ( have_posts() ) :
                while( have_posts() ) :
                    the_post();
                    ?>
                    <div class="blog_post">
                        <div class="post_title">
                            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                        </div>
                        <div class="post_excerpt">
                            <?php the_excerpt(); ?>
                        </div>
                    </div>
                <?php endwhile; ?>
            <?php endif; 
            restore_current_blog();
            ?>
        </li>
<?php endforeach;
endif; ?>
</ul>
7
bueltge

Ceci imprimera une liste non ordonnée de tous les sites publics d’un réseau multisite:

// $bcount = get_blog_count();
global $wpdb;
$blogs = $wpdb->get_results("SELECT * FROM $wpdb->blogs WHERE spam = '0' AND deleted = '0' and archived = '0' and public='1'");
if(!empty($blogs)){
    ?><ul class="menu"><?php
    foreach($blogs as $blog){
        $details = get_blog_details($blog->blog_id);
        if($details != false){
            $addr = $details->siteurl;
            $name = $details->blogname;
            if(!(($blog->blog_id == 1)&&($show_main != 1))){
                ?>
                <li class="menu-item<?php if($counter == get_current_blog_id()){ echo ' current-menu-item';}?>">
                    <a href="<?php echo $addr; ?>"><?php echo $name;?></a>
                </li>
                <?php
            }
        }
    }
    ?></ul><?php
}
4
Tom J Nowell

Depuis WordPress 4.6.0, je vous propose un moyen plus moderne de "lister" (ou plus):

<?php $sites_q = new \WP_Site_Query( [
    'site__not_in' => get_main_site_for_network(),
] );
$sites_for_network = $sites_q->get_sites();
if ( ! empty( $sites_for_network ) ) {
    $original_site_id = get_current_blog_id();
    foreach ( $sites_for_network as $site ) {
         /** @var $site \WP_Site */
         switch_to_blog( $site->blog_id );
         // Do stuff with the site
    }
    switch_to_blog( $original_site_id );
}
0
Maxime Culea

Ceci est une solution écrite basée sur Tom J Nowell idée et réponse. Il imprime la liste triée de tous les sites dans l'installation Wordpress Multisite, sous forme de ligne simple (séparée par un tuyau).

Pour que cette solution fonctionne, modifiez le thème sélectionné et sélectionnez shortcodes.php dans la barre latérale droite. Vers la fin de ce fichier, avant la première occurrence de l'appel add_shortcode, ajoutez la fonction suivante:

function theme_list_all_network_sites()
{
    global $wpdb;

    $result = '';
    $sites = array();
    $blogs = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE spam = '0' AND deleted = '0' and archived = '0' and public='1'"));

    if(!empty($blogs))
    {
        foreach($blogs as $blog)
        {
            $details = get_blog_details($blog->blog_id);

            if($details != false)
            {
                $url = $details->siteurl;
                $name = $details->blogname;

                if(!(($blog->blog_id == 1) && ($show_main != 1)))
                {
                    $sites[$name] = $url;
                }
            }
        }

        ksort($sites);

        $count = count($sites);
        $current = 1;

        foreach($sites as $name=>$url)
        {
            $result.= '<a href="'.$url.'">'.$name.'</a>';
            $result.= ($current == $count) ? "\n" : ' | ';

            ++$current;
        }
    }

    return $result;
}

Ensuite, faites défiler jusqu'à la fin du fichier et après la dernière occurrence de add_shortcode, ajoutez:

add_shortcode('network_list', 'theme_list_all_network_sites');

Cliquez sur Update File pour enregistrer vos modifications.

Maintenant, chaque fois que quelqu'un utilise [network_list] shortcode pour dans un élément post, page ou theme, une liste de sites réseau sera imprimée à la place de ce shortcode.

0
trejder