Liste aller Blogs in WordPress Multisite

WordPress Multisite ist seit der Zusammenlegung von MU und Single ab Version 3.0 populärer geworden. Nicht nur die Verwaltung meherer Sites, sondern auch in diversen Szenarios findet Multisite seinen Einsatz. Als ein Beispiel sei die Mehrsprachigkeits-Lösung genannt.

In diesem Umfeld werden des öfteren die Inhalte oder Daten aus allen Blogs gebraucht, wozu man ggf. alle Blogs kennen muss. Bemüht man eine Suche um eine Lösung zu finden, dann erscheinen sehr oft div. SQL Selects, die auch in vielen Lösungen verbaut wurden und daher zum Nachahmen aufrufen. Da ich aktuell in einem Projekt wieder damit zu tun hatte und ein Select nicht die erste Wahl sein sollte, wenn es Core Functionen gibt, hier ein kurzes Snippet, was alle Blogs im Network zurück gibt.


// Get all blogs of WordPress Multisite
$blogs = get_blog_list( 0, 'all' );

Das Auswerten ist dann schnell getan, da die ID der Blogs im zurückgegebenen Array steckt und darüber alle weiteren Daten geholt werden können, ein Beispiel soll es verdeutlichen.


foreach( (array) $blogs as $blog ) {
    
    $stylesheet = get_blog_option( $blog['blog_id'], 'stylesheet' );
    $blogname   = get_blog_details( $blog['blog_id'] )->blogname;

}

Natürlich hat diese Lösung einen Haken. Die Funktione wurde mit WordPress 3.0 abgekündigt, womit man sie aktuell noch nutzen kann, aber irgendwann ist sie im Core weg. Sie wurde aus Gründen der Performance deaktiviert, da sie mit sehr großen Netzwerken (> 1000 Blogs) Probleme macht. Alternativ ist also die Funktion bereit zu stellen. Daher im folgenden die Funktion, die ich abhängig ablege. Ich werde die Funktion mit Transients erweitern, so dass mit WP Core Mitteln performanter ist. Dazu bitte in den Code auf Github schauen. Dort wird er gepflegt. Ihr seit herzlich eingeladen, den Code zu verbessern, zu ergänzen - die Fork-Funktion kann gern genutzt werden.


 if ( ! function_exists( 'get_blog_list' ) ) {
	
	/**
	 * 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.
	 * 
	 * @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
	 * @return  Array    Returns an array of arrays each representing a blog hosted on this WPMU install. 
	 *                   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.
	 */
	function get_blog_list( $start = 0, $num = 10 ) {
	
		global $wpdb;
		$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 DESC
			", $wpdb->siteid ), 
		ARRAY_A );
		
		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='post'" 
			);
		}
		unset( $blogs );
		$blogs = $blog_list;
		
		if ( false == is_array( $blogs ) )
			return array();
		
		if ( $num == 'all' )
			return array_slice( $blogs, $start, count( $blogs ) );
		else
			return array_slice( $blogs, $start, $num );
	}
	
} // end if fct exist

Eventuell hilft dieser kleine Hinweis dem einen oder anderen bei seinem Projekten.

Comments are closed.