get_blogs_of_user( int $user_id, bool $all = false ): object[]

Gets the sites a user belongs to.

Parameters

$user_idintrequired
User ID
$allbooloptional
Whether to retrieve all sites, or only sites that are not marked as deleted, archived, or spam.

Default:false

Return

object[] A list of the user’s sites. An empty array if the user doesn’t exist or belongs to no sites.

Source

function get_blogs_of_user( $user_id, $all = false ) {
	global $wpdb;

	$user_id = (int) $user_id;

	// Logged out users can't have sites.
	if ( empty( $user_id ) ) {
		return array();
	}

	/**
	 * Filters the list of a user's sites before it is populated.
	 *
	 * Returning a non-null value from the filter will effectively short circuit
	 * get_blogs_of_user(), returning that value instead.
	 *
	 * @since 4.6.0
	 *
	 * @param null|object[] $sites   An array of site objects of which the user is a member.
	 * @param int           $user_id User ID.
	 * @param bool          $all     Whether the returned array should contain all sites, including
	 *                               those marked 'deleted', 'archived', or 'spam'. Default false.
	 */
	$sites = apply_filters( 'pre_get_blogs_of_user', null, $user_id, $all );

	if ( null !== $sites ) {
		return $sites;
	}

	$keys = get_user_meta( $user_id );
	if ( empty( $keys ) ) {
		return array();
	}

	if ( ! is_multisite() ) {
		$site_id                        = get_current_blog_id();
		$sites                          = array( $site_id => new stdClass() );
		$sites[ $site_id ]->userblog_id = $site_id;
		$sites[ $site_id ]->blogname    = get_option( 'blogname' );
		$sites[ $site_id ]->domain      = '';
		$sites[ $site_id ]->path        = '';
		$sites[ $site_id ]->site_id     = 1;
		$sites[ $site_id ]->siteurl     = get_option( 'siteurl' );
		$sites[ $site_id ]->archived    = 0;
		$sites[ $site_id ]->spam        = 0;
		$sites[ $site_id ]->deleted     = 0;
		return $sites;
	}

	$site_ids = array();

	if ( isset( $keys[ $wpdb->base_prefix . 'capabilities' ] ) && defined( 'MULTISITE' ) ) {
		$site_ids[] = 1;
		unset( $keys[ $wpdb->base_prefix . 'capabilities' ] );
	}

	$keys = array_keys( $keys );

	foreach ( $keys as $key ) {
		if ( ! str_ends_with( $key, 'capabilities' ) ) {
			continue;
		}
		if ( $wpdb->base_prefix && ! str_starts_with( $key, $wpdb->base_prefix ) ) {
			continue;
		}
		$site_id = str_replace( array( $wpdb->base_prefix, '_capabilities' ), '', $key );
		if ( ! is_numeric( $site_id ) ) {
			continue;
		}

		$site_ids[] = (int) $site_id;
	}

	$sites = array();

	if ( ! empty( $site_ids ) ) {
		$args = array(
			'number'   => '',
			'site__in' => $site_ids,
		);
		if ( ! $all ) {
			$args['archived'] = 0;
			$args['spam']     = 0;
			$args['deleted']  = 0;
		}

		$_sites = get_sites( $args );

		foreach ( $_sites as $site ) {
			$sites[ $site->id ] = (object) array(
				'userblog_id' => $site->id,
				'blogname'    => $site->blogname,
				'domain'      => $site->domain,
				'path'        => $site->path,
				'site_id'     => $site->network_id,
				'siteurl'     => $site->siteurl,
				'archived'    => $site->archived,
				'mature'      => $site->mature,
				'spam'        => $site->spam,
				'deleted'     => $site->deleted,
			);
		}
	}

	/**
	 * Filters the list of sites a user belongs to.
	 *
	 * @since MU (3.0.0)
	 *
	 * @param object[] $sites   An array of site objects belonging to the user.
	 * @param int      $user_id User ID.
	 * @param bool     $all     Whether the returned sites array should contain all sites, including
	 *                          those marked 'deleted', 'archived', or 'spam'. Default false.
	 */
	return apply_filters( 'get_blogs_of_user', $sites, $user_id, $all );
}

Hooks

apply_filters( ‘get_blogs_of_user’, object[] $sites, int $user_id, bool $all )

Filters the list of sites a user belongs to.

apply_filters( ‘pre_get_blogs_of_user’, null|object[] $sites, int $user_id, bool $all )

Filters the list of a user’s sites before it is populated.

Changelog

VersionDescription
4.7.0Converted to use get_sites().
3.0.0Introduced.

User Contributed Notes

  1. Skip to note 2 content
    $sites   = get_blogs_of_user( $user_id );
    var_export( $sites );

    Output:

    array (
      15 => 
      (object) array(
         'userblog_id' => 15,
         'blogname' => 'sub-site-A',
         'domain' => 'primarysite.test',
         'path' => '/site-a/',
         'site_id' => 1,
         'siteurl' => 'http://primarysite.test/site-a',
         'archived' => '0',
         'mature' => '0',
         'spam' => '0',
         'deleted' => '0',
      ),
      26 => 
      (object) array(
         'userblog_id' => 26,
         'blogname' => 'sub-site-B',
         'domain' => 'primarysite.test',
         'path' => '/site-b/',
         'site_id' => 1,
         'siteurl' => 'http://primarysite.test/site-b',
         'archived' => '0',
         'mature' => '0',
         'spam' => '0',
         'deleted' => '0',
      ),
    )

You must log in before being able to contribute a note or feedback.