Hierarchical Page Listing of all Pages in a Multisite Network

I would like to create a page template that does a listing of all pages across all blogs within a multisite network and list those pages starting with the blog name of the site and then list out the pages within that site. So far so good.

This post got me 99% of the way there: How to list all network sites on one page

Read More

The last part I need help with is sorting the output by blogname. I tried sorting by path, but that didn’t seem to work.

Here’s what I have so far:

$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
          $args = array(
            'depth'        => 4,
            'child_of'     => '',
            'title_li'     => '',
            'echo'         => 1,
            'sort_column'  => 'menu_order, post_title',
            'post_type'    => 'page',
            'post_status'  => 'publish'
          );
        ?>
        <?php wp_list_pages( $args ); ?>
    </li>
<?php endforeach;
endif; ?>
</ul>

Related posts

1 comment

  1. This can work using the following get_blog_list, originally by Frank Bueltge, and modified to also return each blog name and description. Attention to the use of get_current_blog_id() and switch_to_blog().

    /**
     * Returns an array of arrays containing information about each public blog 
     * hosted on this WPMU install.
     * 
     * Only blogs marked as public and flagged as safe (mature flag off) are returned.
     *
     * @author Frank Bueltge
     * 
     * @param   Integer  The first blog to return in the array.
     * @param   Integer  The number of blogs to return in the array (thus the size of the array).
     *                   Setting this to string 'all' returns all blogs from $start
     * @param   Boolean  Get also Postcount for each blog, default is False for a better performance
     * @param   Integer  Time until expiration in seconds, default 86400s (1day)
     * @return  Array    Returns an array of arrays each representing a blog. 
     *                   Details are represented in the following format:
     *                       blog_id   (integer) ID of blog detailed.
     *                       domain    (string)  Domain used to access this blog.
     *                       path      (string)  Path used to access this blog.
     *                       postcount (integer) The number of posts in this blog.
     *                       name      (string) Blog name.
     *                       desc      (string) Blog description.
     */
    function b5f_get_blog_list( $start = 0, $num = 10, $details = FALSE, $expires = 86400 ) {
    
        // get blog list from cache
        $blogs = get_site_transient( 'multisite_blog_list' );
    
        // For debugging purpose
        if ( defined( 'WP_DEBUG' ) && WP_DEBUG )
            $blogs = FALSE;
    
        if ( FALSE === $blogs ) {
    
            global $wpdb;
    
            // add limit for select
            if ( 'all' === $num )
                $limit = '';
            else
                $limit = "LIMIT $start, $num";
    
            $blogs = $wpdb->get_results(
                $wpdb->prepare( "
                    SELECT blog_id, domain, path 
                    FROM $wpdb->blogs
                    WHERE site_id = %d 
                    AND public = '1' 
                    AND archived = '0' 
                    AND mature = '0' 
                    AND spam = '0' 
                    AND deleted = '0' 
                    ORDER BY registered ASC
                    $limit
                ", $wpdb->siteid ), 
            ARRAY_A );
    
            // Set the Transient cache
            set_site_transient( 'multisite_blog_list', $blogs, $expires );
        }
    
        // only if usable, set via var
        if ( TRUE === $details ) {
    
            $blog_list = get_site_transient( 'multisite_blog_list_details' );
    
            // For debugging purpose
            if ( defined( 'WP_DEBUG' ) && WP_DEBUG )
                $blog_list = FALSE;
    
            if ( FALSE === $blog_list ) {
    
                global $wpdb;
                $current_blog_id = get_current_blog_id();
                foreach ( (array) $blogs as $details ) {
                    $blog_list[ $details['blog_id'] ] = $details;
                    $blog_list[ $details['blog_id'] ]['postcount'] = $wpdb->get_var( "
                        SELECT COUNT(ID) 
                        FROM " . $wpdb->get_blog_prefix( $details['blog_id'] ). "posts 
                        WHERE post_status='publish' 
                        AND post_type='page'" 
                    );
                    switch_to_blog( $details['blog_id'] );
                    $blog_list[ $details['blog_id'] ]['name'] = get_blog_details()->blogname;
                    $blog_list[ $details['blog_id'] ]['desc'] = get_bloginfo( 'description' );
                }
                switch_to_blog( $current_blog_id );
                // Set the Transient cache
                set_site_transient( 'multisite_blog_list_details', $blog_list, $expires );
            }
            unset( $blogs );
            $blogs = $blog_list;
        }
    
        if ( FALSE === is_array( $blogs ) )
            return array();
    
        return $blogs;
    }
    

    Call the function and use a sorting function. A simple example:

    $blogs = b5f_get_blog_list( 0, 'all', true );
    uasort( $blogs, function( $a, $b ) {
        return strcasecmp( $a['name'], $b['name'] );
    });
    $current_blog_id = get_current_blog_id();
    foreach( $blogs as $blog ) :
        switch_to_blog( $blog[ 'blog_id' ] );
        echo $blog['name'] . ' - ' . $blog['domain'] . ' - ' . $blog['desc'];
    endforeach;
    switch_to_blog( $current_blog_id );
    

Comments are closed.