wp/wp-includes/ms-blogs.php
changeset 16 a86126ab1dd4
parent 9 177826044cd9
child 18 be944660c56a
--- a/wp/wp-includes/ms-blogs.php	Tue Oct 22 16:11:46 2019 +0200
+++ b/wp/wp-includes/ms-blogs.php	Tue Dec 15 13:49:49 2020 +0100
@@ -8,8 +8,8 @@
  * @since MU (3.0.0)
  */
 
-require_once( ABSPATH . WPINC . '/ms-site.php' );
-require_once( ABSPATH . WPINC . '/ms-network.php' );
+require_once ABSPATH . WPINC . '/ms-site.php';
+require_once ABSPATH . WPINC . '/ms-network.php';
 
 /**
  * Update the last_updated field for the current site.
@@ -31,11 +31,11 @@
 }
 
 /**
- * Get a full blog URL, given a blog id.
+ * Get a full blog URL, given a blog ID.
  *
  * @since MU (3.0.0)
  *
- * @param int $blog_id Blog ID
+ * @param int $blog_id Blog ID.
  * @return string Full URL of the blog if found. Empty string if not.
  */
 function get_blogaddress_by_id( $blog_id ) {
@@ -137,7 +137,7 @@
 			if ( false !== $blog ) {
 				return $blog;
 			}
-			if ( substr( $fields['domain'], 0, 4 ) == 'www.' ) {
+			if ( 'www.' === substr( $fields['domain'], 0, 4 ) ) {
 				$nowww = substr( $fields['domain'], 4 );
 				$blog  = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) AND path = %s ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'], $fields['path'] ) );
 			} else {
@@ -155,7 +155,7 @@
 			if ( false !== $blog ) {
 				return $blog;
 			}
-			if ( substr( $fields['domain'], 0, 4 ) == 'www.' ) {
+			if ( 'www.' === substr( $fields['domain'], 0, 4 ) ) {
 				$nowww = substr( $fields['domain'], 4 );
 				$blog  = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'] ) );
 			} else {
@@ -238,18 +238,27 @@
 		return $details;
 	}
 
-	switch_to_blog( $blog_id );
+	$switched_blog = false;
+
+	if ( get_current_blog_id() !== $blog_id ) {
+		switch_to_blog( $blog_id );
+		$switched_blog = true;
+	}
+
 	$details->blogname   = get_option( 'blogname' );
 	$details->siteurl    = get_option( 'siteurl' );
 	$details->post_count = get_option( 'post_count' );
 	$details->home       = get_option( 'home' );
-	restore_current_blog();
+
+	if ( $switched_blog ) {
+		restore_current_blog();
+	}
 
 	/**
 	 * Filters a blog's details.
 	 *
 	 * @since MU (3.0.0)
-	 * @deprecated 4.7.0 Use site_details
+	 * @deprecated 4.7.0 Use {@see 'site_details'} instead.
 	 *
 	 * @param object $details The blog details.
 	 */
@@ -280,13 +289,13 @@
 }
 
 /**
- * Update the details for a blog. Updates the blogs table for a given blog id.
+ * Update the details for a blog. Updates the blogs table for a given blog ID.
  *
  * @since MU (3.0.0)
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
- * @param int   $blog_id Blog ID
+ * @param int   $blog_id Blog ID.
  * @param array $details Array of details keyed by blogs table field names.
  * @return bool True if update succeeds, false otherwise.
  */
@@ -373,7 +382,7 @@
 }
 
 /**
- * Add a new option for a given blog id.
+ * Add a new option for a given blog ID.
  *
  * You do not need to serialize values. If the value needs to be serialized, then
  * it will be serialized before it is inserted into the database. Remember,
@@ -389,7 +398,7 @@
  * @param int    $id     A blog ID. Can be null to refer to the current blog.
  * @param string $option Name of option to add. Expected to not be SQL-escaped.
  * @param mixed  $value  Optional. Option value, can be anything. Expected to not be SQL-escaped.
- * @return bool False if option was not added and true if option was added.
+ * @return bool True if the option was added, false otherwise.
  */
 function add_blog_option( $id, $option, $value ) {
 	$id = (int) $id;
@@ -410,13 +419,13 @@
 }
 
 /**
- * Removes option by name for a given blog id. Prevents removal of protected WordPress options.
+ * Removes option by name for a given blog ID. Prevents removal of protected WordPress options.
  *
  * @since MU (3.0.0)
  *
  * @param int    $id     A blog ID. Can be null to refer to the current blog.
  * @param string $option Name of option to remove. Expected to not be SQL-escaped.
- * @return bool True, if option is successfully deleted. False on failure.
+ * @return bool True if the option was deleted, false otherwise.
  */
 function delete_blog_option( $id, $option ) {
 	$id = (int) $id;
@@ -441,11 +450,11 @@
  *
  * @since MU (3.0.0)
  *
- * @param int    $id         The blog id.
+ * @param int    $id         The blog ID.
  * @param string $option     The option key.
  * @param mixed  $value      The option value.
  * @param mixed  $deprecated Not used.
- * @return bool True on success, false on failure.
+ * @return bool True if the value was updated, false otherwise.
  */
 function update_blog_option( $id, $option, $value, $deprecated = null ) {
 	$id = (int) $id;
@@ -477,120 +486,57 @@
  * @see restore_current_blog()
  * @since MU (3.0.0)
  *
- * @global wpdb            $wpdb
+ * @global wpdb            $wpdb               WordPress database abstraction object.
  * @global int             $blog_id
  * @global array           $_wp_switched_stack
  * @global bool            $switched
  * @global string          $table_prefix
  * @global WP_Object_Cache $wp_object_cache
  *
- * @param int  $new_blog   The id of the blog you want to switch to. Default: current blog
- * @param bool $deprecated Deprecated argument
- * @return true Always returns True.
+ * @param int  $new_blog_id The ID of the blog to switch to. Default: current blog.
+ * @param bool $deprecated  Not used.
+ * @return true Always returns true.
  */
-function switch_to_blog( $new_blog, $deprecated = null ) {
+function switch_to_blog( $new_blog_id, $deprecated = null ) {
 	global $wpdb;
 
-	$blog_id = get_current_blog_id();
-	if ( empty( $new_blog ) ) {
-		$new_blog = $blog_id;
+	$prev_blog_id = get_current_blog_id();
+	if ( empty( $new_blog_id ) ) {
+		$new_blog_id = $prev_blog_id;
 	}
 
-	$GLOBALS['_wp_switched_stack'][] = $blog_id;
+	$GLOBALS['_wp_switched_stack'][] = $prev_blog_id;
 
 	/*
 	 * If we're switching to the same blog id that we're on,
 	 * set the right vars, do the associated actions, but skip
 	 * the extra unnecessary work
 	 */
-	if ( $new_blog == $blog_id ) {
+	if ( $new_blog_id == $prev_blog_id ) {
 		/**
 		 * Fires when the blog is switched.
 		 *
 		 * @since MU (3.0.0)
+		 * @since 5.4.0 The `$context` parameter was added.
 		 *
-		 * @param int $new_blog New blog ID.
-		 * @param int $new_blog Blog ID.
+		 * @param int    $new_blog_id  New blog ID.
+		 * @param int    $prev_blog_id Previous blog ID.
+		 * @param string $context      Additional context. Accepts 'switch' when called from switch_to_blog()
+		 *                             or 'restore' when called from restore_current_blog().
 		 */
-		do_action( 'switch_blog', $new_blog, $new_blog );
+		do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'switch' );
+
 		$GLOBALS['switched'] = true;
+
 		return true;
 	}
 
-	$wpdb->set_blog_id( $new_blog );
+	$wpdb->set_blog_id( $new_blog_id );
 	$GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();
-	$prev_blog_id            = $blog_id;
-	$GLOBALS['blog_id']      = $new_blog;
+	$GLOBALS['blog_id']      = $new_blog_id;
 
 	if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
-		wp_cache_switch_to_blog( $new_blog );
-	} else {
-		global $wp_object_cache;
-
-		if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) {
-			$global_groups = $wp_object_cache->global_groups;
-		} else {
-			$global_groups = false;
-		}
-		wp_cache_init();
-
-		if ( function_exists( 'wp_cache_add_global_groups' ) ) {
-			if ( is_array( $global_groups ) ) {
-				wp_cache_add_global_groups( $global_groups );
-			} else {
-				wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'blog_meta' ) );
-			}
-			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) );
-		}
-	}
-
-	/** This filter is documented in wp-includes/ms-blogs.php */
-	do_action( 'switch_blog', $new_blog, $prev_blog_id );
-	$GLOBALS['switched'] = true;
-
-	return true;
-}
-
-/**
- * Restore the current blog, after calling switch_to_blog()
- *
- * @see switch_to_blog()
- * @since MU (3.0.0)
- *
- * @global wpdb            $wpdb
- * @global array           $_wp_switched_stack
- * @global int             $blog_id
- * @global bool            $switched
- * @global string          $table_prefix
- * @global WP_Object_Cache $wp_object_cache
- *
- * @return bool True on success, false if we're already on the current blog
- */
-function restore_current_blog() {
-	global $wpdb;
-
-	if ( empty( $GLOBALS['_wp_switched_stack'] ) ) {
-		return false;
-	}
-
-	$blog    = array_pop( $GLOBALS['_wp_switched_stack'] );
-	$blog_id = get_current_blog_id();
-
-	if ( $blog_id == $blog ) {
-		/** This filter is documented in wp-includes/ms-blogs.php */
-		do_action( 'switch_blog', $blog, $blog );
-		// If we still have items in the switched stack, consider ourselves still 'switched'
-		$GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );
-		return true;
-	}
-
-	$wpdb->set_blog_id( $blog );
-	$prev_blog_id            = $blog_id;
-	$GLOBALS['blog_id']      = $blog;
-	$GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();
-
-	if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
-		wp_cache_switch_to_blog( $blog );
+		wp_cache_switch_to_blog( $new_blog_id );
 	} else {
 		global $wp_object_cache;
 
@@ -608,14 +554,86 @@
 			} else {
 				wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'blog_meta' ) );
 			}
+
 			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) );
 		}
 	}
 
 	/** This filter is documented in wp-includes/ms-blogs.php */
-	do_action( 'switch_blog', $blog, $prev_blog_id );
+	do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'switch' );
+
+	$GLOBALS['switched'] = true;
+
+	return true;
+}
+
+/**
+ * Restore the current blog, after calling switch_to_blog().
+ *
+ * @see switch_to_blog()
+ * @since MU (3.0.0)
+ *
+ * @global wpdb            $wpdb               WordPress database abstraction object.
+ * @global array           $_wp_switched_stack
+ * @global int             $blog_id
+ * @global bool            $switched
+ * @global string          $table_prefix
+ * @global WP_Object_Cache $wp_object_cache
+ *
+ * @return bool True on success, false if we're already on the current blog.
+ */
+function restore_current_blog() {
+	global $wpdb;
+
+	if ( empty( $GLOBALS['_wp_switched_stack'] ) ) {
+		return false;
+	}
+
+	$new_blog_id  = array_pop( $GLOBALS['_wp_switched_stack'] );
+	$prev_blog_id = get_current_blog_id();
+
+	if ( $new_blog_id == $prev_blog_id ) {
+		/** This filter is documented in wp-includes/ms-blogs.php */
+		do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'restore' );
 
-	// If we still have items in the switched stack, consider ourselves still 'switched'
+		// If we still have items in the switched stack, consider ourselves still 'switched'.
+		$GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );
+
+		return true;
+	}
+
+	$wpdb->set_blog_id( $new_blog_id );
+	$GLOBALS['blog_id']      = $new_blog_id;
+	$GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();
+
+	if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
+		wp_cache_switch_to_blog( $new_blog_id );
+	} else {
+		global $wp_object_cache;
+
+		if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) {
+			$global_groups = $wp_object_cache->global_groups;
+		} else {
+			$global_groups = false;
+		}
+
+		wp_cache_init();
+
+		if ( function_exists( 'wp_cache_add_global_groups' ) ) {
+			if ( is_array( $global_groups ) ) {
+				wp_cache_add_global_groups( $global_groups );
+			} else {
+				wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'blog_meta' ) );
+			}
+
+			wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) );
+		}
+	}
+
+	/** This filter is documented in wp-includes/ms-blogs.php */
+	do_action( 'switch_blog', $new_blog_id, $prev_blog_id, 'restore' );
+
+	// If we still have items in the switched stack, consider ourselves still 'switched'.
 	$GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );
 
 	return true;
@@ -660,8 +678,8 @@
  *
  * @since MU (3.0.0)
  *
- * @param int $id The blog id
- * @return string Whether the blog is archived or not
+ * @param int $id Blog ID.
+ * @return string Whether the blog is archived or not.
  */
 function is_archived( $id ) {
 	return get_blog_status( $id, 'archived' );
@@ -672,8 +690,8 @@
  *
  * @since MU (3.0.0)
  *
- * @param int    $id       The blog id
- * @param string $archived The new status
+ * @param int    $id       Blog ID.
+ * @param string $archived The new status.
  * @return string $archived
  */
 function update_archived( $id, $archived ) {
@@ -689,10 +707,10 @@
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
- * @param int    $blog_id BLog ID
- * @param string $pref    A field name
- * @param string $value   Value for $pref
- * @param null   $deprecated
+ * @param int    $blog_id    Blog ID.
+ * @param string $pref       Field name.
+ * @param string $value      Field value.
+ * @param null   $deprecated Not used.
  * @return string|false $value
  */
 function update_blog_status( $blog_id, $pref, $value, $deprecated = null ) {
@@ -702,7 +720,9 @@
 		_deprecated_argument( __FUNCTION__, '3.1.0' );
 	}
 
-	if ( ! in_array( $pref, array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' ) ) ) {
+	$allowed_field_names = array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' );
+
+	if ( ! in_array( $pref, $allowed_field_names, true ) ) {
 		return $value;
 	}
 
@@ -727,8 +747,8 @@
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
- * @param int    $id   The blog id
- * @param string $pref A field name
+ * @param int    $id   Blog ID.
+ * @param string $pref Field name.
  * @return bool|string|null $value
  */
 function get_blog_status( $id, $pref ) {
@@ -749,16 +769,17 @@
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
- * @param mixed $deprecated Not used
- * @param int   $start      The offset
- * @param int   $quantity   The maximum number of blogs to retrieve. Default is 40.
- * @return array The list of blogs
+ * @param mixed $deprecated Not used.
+ * @param int   $start      Optional. Number of blogs to offset the query. Used to build LIMIT clause.
+ *                          Can be used for pagination. Default 0.
+ * @param int   $quantity   Optional. The maximum number of blogs to retrieve. Default 40.
+ * @return array The list of blogs.
  */
 function get_last_updated( $deprecated = '', $start = 0, $quantity = 40 ) {
 	global $wpdb;
 
 	if ( ! empty( $deprecated ) ) {
-		_deprecated_argument( __FUNCTION__, 'MU' ); // never used
+		_deprecated_argument( __FUNCTION__, 'MU' ); // Never used.
 	}
 
 	return $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' AND last_updated != '0000-00-00 00:00:00' ORDER BY last_updated DESC limit %d, %d", get_current_network_id(), $start, $quantity ), ARRAY_A );
@@ -770,9 +791,9 @@
  *
  * @since 3.3.0
  *
- * @param string $new_status The new post status
- * @param string $old_status The old post status
- * @param object $post       Post object
+ * @param string  $new_status The new post status.
+ * @param string  $old_status The old post status.
+ * @param WP_Post $post       Post object.
  */
 function _update_blog_date_on_post_publish( $new_status, $old_status, $post ) {
 	$post_type_obj = get_post_type_object( $post->post_type );
@@ -780,7 +801,7 @@
 		return;
 	}
 
-	if ( 'publish' != $new_status && 'publish' != $old_status ) {
+	if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
 		return;
 	}
 
@@ -805,7 +826,7 @@
 		return;
 	}
 
-	if ( 'publish' != $post->post_status ) {
+	if ( 'publish' !== $post->post_status ) {
 		return;
 	}
 
@@ -854,3 +875,50 @@
 
 	update_posts_count();
 }
+
+/**
+ * Count number of sites grouped by site status.
+ *
+ * @since 5.3.0
+ *
+ * @param int $network_id Optional. The network to get counts for. Default is the current network ID.
+ * @return int[] {
+ *     Numbers of sites grouped by site status.
+ *
+ *     @type int $all      The total number of sites.
+ *     @type int $public   The number of public sites.
+ *     @type int $archived The number of archived sites.
+ *     @type int $mature   The number of mature sites.
+ *     @type int $spam     The number of spam sites.
+ *     @type int $deleted  The number of deleted sites.
+ * }
+ */
+function wp_count_sites( $network_id = null ) {
+	if ( empty( $network_id ) ) {
+		$network_id = get_current_network_id();
+	}
+
+	$counts = array();
+	$args   = array(
+		'network_id'    => $network_id,
+		'number'        => 1,
+		'fields'        => 'ids',
+		'no_found_rows' => false,
+	);
+
+	$q             = new WP_Site_Query( $args );
+	$counts['all'] = $q->found_sites;
+
+	$_args    = $args;
+	$statuses = array( 'public', 'archived', 'mature', 'spam', 'deleted' );
+
+	foreach ( $statuses as $status ) {
+		$_args            = $args;
+		$_args[ $status ] = 1;
+
+		$q                 = new WP_Site_Query( $_args );
+		$counts[ $status ] = $q->found_sites;
+	}
+
+	return $counts;
+}