WordPress Version: 6.1
/**
* Gets one of a user's active blogs.
*
* Returns the user's primary blog, if they have one and
* it is active. If it's inactive, function returns another
* active blog of the user. If none are found, the user
* is added as a Subscriber to the Dashboard Blog and that blog
* is returned.
*
* @since MU (3.0.0)
*
* @param int $user_id The unique ID of the user
* @return WP_Site|void The blog object
*/
function get_active_blog_for_user($user_id)
{
$blogs = get_blogs_of_user($user_id);
if (empty($blogs)) {
return;
}
if (!is_multisite()) {
return $blogs[get_current_blog_id()];
}
$primary_blog = get_user_meta($user_id, 'primary_blog', true);
$first_blog = current($blogs);
if (false !== $primary_blog) {
if (!isset($blogs[$primary_blog])) {
update_user_meta($user_id, 'primary_blog', $first_blog->userblog_id);
$primary = get_site($first_blog->userblog_id);
} else {
$primary = get_site($primary_blog);
}
} else {
// TODO: Review this call to add_user_to_blog too - to get here the user must have a role on this blog?
$result = add_user_to_blog($first_blog->userblog_id, $user_id, 'subscriber');
if (!is_wp_error($result)) {
update_user_meta($user_id, 'primary_blog', $first_blog->userblog_id);
$primary = $first_blog;
}
}
if (!is_object($primary) || (1 == $primary->archived || 1 == $primary->spam || 1 == $primary->deleted)) {
$blogs = get_blogs_of_user($user_id, true);
// If a user's primary blog is shut down, check their other blogs.
$ret = false;
if (is_array($blogs) && count($blogs) > 0) {
foreach ((array) $blogs as $blog_id => $blog) {
if (get_current_network_id() != $blog->site_id) {
continue;
}
$details = get_site($blog_id);
if (is_object($details) && 0 == $details->archived && 0 == $details->spam && 0 == $details->deleted) {
$ret = $details;
if (get_user_meta($user_id, 'primary_blog', true) != $blog_id) {
update_user_meta($user_id, 'primary_blog', $blog_id);
}
if (!get_user_meta($user_id, 'source_domain', true)) {
update_user_meta($user_id, 'source_domain', $details->domain);
}
break;
}
}
} else {
return;
}
return $ret;
} else {
return $primary;
}
}