Multisite: Introduce WP_Network_Query.

Provides a consistent way to query `$wpdb->site` for `WP_Network` objects based on domain, path, network ID, and (main) site ID.

Introduces and uses update_network_cache() and _prime_network_caches() to maintain a cached list of WP_Network objects for use in multiple queries.

Props flixos90.
See #32504.


git-svn-id: https://develop.svn.wordpress.org/trunk@37894 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Jeremy Felt
2016-06-28 21:26:48 +00:00
parent 7de7b36b9f
commit d277dd8ef1
4 changed files with 991 additions and 0 deletions

View File

@@ -1114,6 +1114,69 @@ function get_network( &$network = null ) {
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.
*