diff --git a/src/wp-includes/cache-compat.php b/src/wp-includes/cache-compat.php index d25017f2a1..3f3df630e9 100644 --- a/src/wp-includes/cache-compat.php +++ b/src/wp-includes/cache-compat.php @@ -35,3 +35,86 @@ if ( ! function_exists( 'wp_cache_get_multiple' ) ) : return $values; } endif; + +if ( ! function_exists( 'wp_cache_delete_multiple' ) ) : + /** + * Delete multiple values from the cache in one call. + * + * Compat function to mimic wp_cache_delete_multiple(). + * + * @ignore + * @since 6.0.0 + * + * @see wp_cache_delete_multiple() + * + * @param array $keys Array of keys under which the cache to deleted. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return array Array of return values. + */ + function wp_cache_delete_multiple( array $keys, $group = '' ) { + $values = array(); + + foreach ( $keys as $key ) { + $values[ $key ] = wp_cache_delete( $key, $group ); + } + + return $values; + } +endif; + + +if ( ! function_exists( 'wp_cache_add_multiple' ) ) : + /** + * Add multiple values to the cache in one call, if the cache keys doesn't already exist. + * + * Compat function to mimic wp_cache_add_multiple(). + * + * @ignore + * @since 6.0.0 + * + * @see wp_cache_add_multiple() + * + * @param array $data Array of key and value to be added. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. Default 0 (no expiration). + * @return array Array of return values. + */ + function wp_cache_add_multiple( array $data, $group = '', $expire = 0 ) { + $values = array(); + + foreach ( $data as $key => $value ) { + $values[ $key ] = wp_cache_add( $key, $value, $group, $expire ); + } + + return $values; + } +endif; + +if ( ! function_exists( 'wp_cache_set_multiple' ) ) : + /** + * Set multiple values to the cache in one call. + * + * Differs from wp_cache_add_multiple() in that it will always write data. + * + * Compat function to mimic wp_cache_set_multiple(). + * + * @ignore + * @since 6.0.0 + * + * @see wp_cache_set_multiple() + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. Default 0 (no expiration). + * @return array Array of return values. + */ + function wp_cache_set_multiple( array $data, $group = '', $expire = 0 ) { + $values = array(); + + foreach ( $data as $key => $value ) { + $values[ $key ] = wp_cache_set( $key, $value, $group, $expire ); + } + + return $values; + } +endif; diff --git a/src/wp-includes/cache.php b/src/wp-includes/cache.php index 7fa44ca9db..b9ffe96219 100644 --- a/src/wp-includes/cache.php +++ b/src/wp-includes/cache.php @@ -145,6 +145,65 @@ function wp_cache_get_multiple( $keys, $group = '', $force = false ) { return $wp_object_cache->get_multiple( $keys, $group, $force ); } + +/** + * Delete multiple values from the cache in one call. + * + * @since 6.0.0 + * + * @see WP_Object_Cache::delete_multiple() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param array $keys Array of keys under which the cache to deleted. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return array Array of return values organized into groups. + */ +function wp_cache_delete_multiple( array $keys, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->delete_multiple( $keys, $group ); +} + +/** + * Add multiple values to the cache in one call. + * + * @since 6.0.0 + * + * @see WP_Object_Cache::add_multiple() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return array Array of return values. + */ +function wp_cache_add_multiple( array $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->add_multiple( $data, $group, $expire ); +} + +/** + * Set multiple values to the cache in one call. + * + * @since 6.0.0 + * + * @see WP_Object_Cache::set_multiple() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return array Array of return values. + */ +function wp_cache_set_multiple( array $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->set_multiple( $data, $group, $expire ); +} + /** * Increment numeric cache item's value * diff --git a/src/wp-includes/class-wp-object-cache.php b/src/wp-includes/class-wp-object-cache.php index 37c474c3c5..920ec5e4da 100644 --- a/src/wp-includes/class-wp-object-cache.php +++ b/src/wp-includes/class-wp-object-cache.php @@ -323,6 +323,65 @@ class WP_Object_Cache { return $values; } + /** + * Delete multiple values from the cache in one call. + * + * @since 6.0.0 + * + * @param array $keys Array of keys to be deleted. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return array Array of return values. + */ + public function delete_multiple( array $keys, $group = '' ) { + $values = array(); + + foreach ( $keys as $key ) { + $values[ $key ] = $this->delete( $key, $group ); + } + + return $values; + } + + /** + * Add multiple values to the cache in one call. + * + * @since 6.0.0 + * + * @param array $data Array of key and value to be added. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. Default 0 (no expiration). + * @return array Array of return values. + */ + public function add_multiple( array $data, $group = '', $expire = 0 ) { + $values = array(); + + foreach ( $data as $key => $value ) { + $values[ $key ] = $this->add( $key, $value, $group, $expire ); + } + + return $values; + } + + /** + * Set multiple values to the cache in one call. + * + * @since 6.0.0 + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. Default 0 (no expiration). + * @return array Array of return values. + */ + public function set_multiple( array $data, $group = '', $expire = 0 ) { + $values = array(); + + foreach ( $data as $key => $value ) { + $values[ $key ] = $this->set( $key, $value, $group, $expire ); + } + + return $values; + } + /** * Increments numeric cache item's value. * diff --git a/tests/phpunit/tests/cache.php b/tests/phpunit/tests/cache.php index 26f1264242..957c87df79 100644 --- a/tests/phpunit/tests/cache.php +++ b/tests/phpunit/tests/cache.php @@ -349,4 +349,74 @@ class Tests_Cache extends WP_UnitTestCase { $this->assertSame( $expected, $found ); } + + /** + * @ticket 54574 + */ + public function test_wp_cache_add_multiple() { + $found = wp_cache_add_multiple( + array( + 'foo1' => 'bar', + 'foo2' => 'bar', + 'foo3' => 'bar', + ), + 'group1' + ); + + $expected = array( + 'foo1' => true, + 'foo2' => true, + 'foo3' => true, + ); + + $this->assertSame( $expected, $found ); + } + + /** + * @ticket 54574 + */ + public function test_wp_cache_set_multiple() { + wp_cache_set( 'foo1', 'bar', 'group1' ); + wp_cache_set( 'foo2', 'bar', 'group1' ); + wp_cache_set( 'foo3', 'bar', 'group2' ); + + $found = wp_cache_set_multiple( + array( + 'foo1' => 'bar', + 'foo2' => 'bar', + 'foo3' => 'bar', + ), + 'group1' + ); + + $expected = array( + 'foo1' => true, + 'foo2' => true, + 'foo3' => true, + ); + + $this->assertSame( $expected, $found ); + } + + /** + * @ticket 54574 + */ + public function test_wp_cache_delete_multiple() { + wp_cache_set( 'foo1', 'bar', 'group1' ); + wp_cache_set( 'foo2', 'bar', 'group1' ); + wp_cache_set( 'foo3', 'bar', 'group2' ); + + $found = wp_cache_delete_multiple( + array( 'foo1', 'foo2', 'foo3' ), + 'group1' + ); + + $expected = array( + 'foo1' => true, + 'foo2' => true, + 'foo3' => false, + ); + + $this->assertSame( $expected, $found ); + } } diff --git a/tests/phpunit/tests/pluggable.php b/tests/phpunit/tests/pluggable.php index 0138ab371e..af60d7d360 100644 --- a/tests/phpunit/tests/pluggable.php +++ b/tests/phpunit/tests/pluggable.php @@ -295,6 +295,20 @@ class Tests_Pluggable extends WP_UnitTestCase { 'group' => '', 'force' => false, ), + 'wp_cache_set_multiple' => array( + 'data', + 'group' => '', + 'expire' => 0, + ), + 'wp_cache_add_multiple' => array( + 'data', + 'group' => '', + 'expire' => 0, + ), + 'wp_cache_delete_multiple' => array( + 'keys', + 'group' => '', + ), 'wp_cache_incr' => array( 'key', 'offset' => 1,