+/**
+ * Retrieves a list of networks.
+ *
+ * @since 4.6.0
+ *
+ * @param string|array $args Optional. Array or string of arguments. See WP_Network_Query::parse_query()
+ * for information on accepted arguments. Default empty array.
+ * @return int|array List of networks or number of found networks if `$count` argument is true.
+ */
+function get_networks( $args = array() ) {
+ $query = new WP_Network_Query();
+
+ return $query->query( $args );
+}
+
+/**
+ * Retrieves network data given a network ID or network object.
+ *
+ * Network data will be cached and returned after being passed through a filter.
+ * If the provided network is empty, the current network global will be used.
+ *
+ * @since 4.6.0
+ *
+ * @global WP_Network $current_site
+ *
+ * @param WP_Network|int|null $network Optional. Network to retrieve. Default is the current network.
+ * @return WP_Network|null The network object or null if not found.
+ */
+function get_network( $network = null ) {
+ global $current_site;
+ if ( empty( $network ) && isset( $current_site ) ) {
+ $network = $current_site;
+ }
+
+ if ( $network instanceof WP_Network ) {
+ $_network = $network;
+ } elseif ( is_object( $network ) ) {
+ $_network = new WP_Network( $network );
+ } else {
+ $_network = WP_Network::get_instance( $network );
+ }
+
+ if ( ! $_network ) {
+ return null;
+ }
+
+ /**
+ * Fires after a network is retrieved.
+ *
+ * @since 4.6.0
+ *
+ * @param WP_Network $_network Network data.
+ */
+ $_network = apply_filters( 'get_network', $_network );
+
+ return $_network;
+}
+
+/**
+ * Removes a network from the object cache.
+ *
+ * @since 4.6.0
+ *
+ * @param int|array $ids Network ID or an array of network IDs to remove from cache.
+ */
+function clean_network_cache( $ids ) {
+ foreach ( (array) $ids as $id ) {
+ wp_cache_delete( $id, 'networks' );
+
+ /**
+ * Fires immediately after a network has been removed from the object cache.
+ *
+ * @since 4.6.0
+ *
+ * @param int $id Network ID.
+ */
+ do_action( 'clean_network_cache', $id );
+ }
+
+ wp_cache_set( 'last_changed', microtime(), 'networks' );
+}
+
+/**
+ * Updates the network cache of given networks.
+ *
+ * Will add the networks in $networks to the cache. If network ID already exists
+ * in the network cache then it will not be updated. The network is added to the
+ * cache using the network group with the key using the ID of the networks.
+ *
+ * @since 4.6.0
+ *
+ * @param array $networks Array of network row objects.
+ */
+function update_network_cache( $networks ) {
+ foreach ( (array) $networks as $network ) {
+ wp_cache_add( $network->id, $network, 'networks' );
+ }
+}
+
+/**
+ * Adds any networks from the given IDs to the cache that do not already exist in cache.
+ *
+ * @since 4.6.0
+ * @access private
+ *
+ * @see update_network_cache()
+ * @global wpdb $wpdb WordPress database abstraction object.
+ *
+ * @param array $network_ids Array of network IDs.
+ */
+function _prime_network_caches( $network_ids ) {
+ global $wpdb;
+
+ $non_cached_ids = _get_non_cached_ids( $network_ids, 'networks' );
+ if ( !empty( $non_cached_ids ) ) {
+ $fresh_networks = $wpdb->get_results( sprintf( "SELECT $wpdb->site.* FROM $wpdb->site WHERE id IN (%s)", join( ",", array_map( 'intval', $non_cached_ids ) ) ) );
+
+ update_network_cache( $fresh_networks );
+ }
+}
+
+/**
+ * Handler for updating the blog date when a post is published or an already published post is changed.
+ *
+ * @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
+ */
+function _update_blog_date_on_post_publish( $new_status, $old_status, $post ) {
+ $post_type_obj = get_post_type_object( $post->post_type );
+ if ( ! $post_type_obj || ! $post_type_obj->public ) {
+ return;
+ }
+
+ if ( 'publish' != $new_status && 'publish' != $old_status ) {
+ return;
+ }
+
+ // Post was freshly published, published post was saved, or published post was unpublished.
+
+ wpmu_update_blogs_date();
+}
+
+/**
+ * Handler for updating the blog date when a published post is deleted.
+ *
+ * @since 3.4.0
+ *
+ * @param int $post_id Post ID
+ */
+function _update_blog_date_on_post_delete( $post_id ) {
+ $post = get_post( $post_id );
+
+ $post_type_obj = get_post_type_object( $post->post_type );
+ if ( ! $post_type_obj || ! $post_type_obj->public ) {
+ return;
+ }
+
+ if ( 'publish' != $post->post_status ) {
+ return;
+ }
+
+ wpmu_update_blogs_date();
+}
+
+/**
+ * Handler for updating the blog posts count date when a post is deleted.
+ *
+ * @since 4.0.0
+ *
+ * @param int $post_id Post ID.
+ */
+function _update_posts_count_on_delete( $post_id ) {
+ $post = get_post( $post_id );
+
+ if ( ! $post || 'publish' !== $post->post_status ) {
+ return;
+ }
+
+ update_posts_count();
+}
+
+/**
+ * Handler for updating the blog posts count date when a post status changes.
+ *
+ * @since 4.0.0
+ *
+ * @param string $new_status The status the post is changing to.
+ * @param string $old_status The status the post is changing from.
+ */
+function _update_posts_count_on_transition_post_status( $new_status, $old_status ) {
+ if ( $new_status === $old_status ) {
+ return;
+ }
+
+ if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
+ return;
+ }
+
+ update_posts_count();
+}