From b34767750ba5e1e3dc67942d4f42bf0def3e28aa Mon Sep 17 00:00:00 2001 From: Robin Martijn Date: Sat, 24 Feb 2024 09:47:25 +0100 Subject: [PATCH] feat: add filter to cache methods (#2878) Add `timber/cache/transient_key` filter to allow filtering the transient key. --------- Co-authored-by: Nicolas Lemoine --- src/Loader.php | 38 +++++++++++++++++++++++++++++++++++++ tests/test-timber-cache.php | 15 +++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/Loader.php b/src/Loader.php index adeeda76a..5c956add5 100644 --- a/src/Loader.php +++ b/src/Loader.php @@ -668,6 +668,25 @@ public function get_cache($key, $group = self::CACHEGROUP, $cache_mode = self::C $value = false; $trans_key = \substr($group . '_' . $key, 0, self::TRANS_KEY_LEN); + /** + * Filters the transient key used for caching. + * + * @api + * @since 2.1.0 + * @example + * ``` + * add_filter( 'timber/cache/transient_key', function( $trans_key, $key, $group, $cache_mode ) { + * return $trans_key . '_my_suffix'; + * }, 10, 4 ); + * ``` + * + * @param string $trans_key The transient key. + * @param string $key The cache key. + * @param string $group The cache group. + * @param string $cache_mode The cache mode. + */ + $trans_key = apply_filters('timber/cache/transient_key', $trans_key, $key, $group, $cache_mode); + if (self::CACHE_TRANSIENT === $cache_mode) { $value = \get_transient($trans_key); } elseif (self::CACHE_SITE_TRANSIENT === $cache_mode) { @@ -696,6 +715,25 @@ public function set_cache($key, $value, $group = self::CACHEGROUP, $expires = 0, $cache_mode = $this->_get_cache_mode($cache_mode); $trans_key = \substr($group . '_' . $key, 0, self::TRANS_KEY_LEN); + /** + * Filters the transient key used for caching. + * + * @api + * @since 2.1.0 + * @example + * ``` + * add_filter( 'timber/cache/transient_key', function( $trans_key, $key, $group, $cache_mode ) { + * return $trans_key . '_my_suffix'; + * }, 10, 4 ); + * ``` + * + * @param string $trans_key The transient key. + * @param string $key The cache key. + * @param string $group The cache group. + * @param string $cache_mode The cache mode. + */ + $trans_key = apply_filters('timber/cache/transient_key', $trans_key, $key, $group, $cache_mode); + if (self::CACHE_TRANSIENT === $cache_mode) { \set_transient($trans_key, $value, $expires); } elseif (self::CACHE_SITE_TRANSIENT === $cache_mode) { diff --git a/tests/test-timber-cache.php b/tests/test-timber-cache.php index 70c2cef7b..40a28bb14 100644 --- a/tests/test-timber-cache.php +++ b/tests/test-timber-cache.php @@ -543,6 +543,21 @@ public function testTimberLoaderCacheTransientsButKeepOtherTransients() $this->assertSame(2, $wpdb->num_rows); $this->assertEquals('foo', get_transient('random_600')); } + + public function testCacheTransientKeyFilter() + { + $filter = function ($key) { + return 'my_custom_key'; + }; + add_filter('timber/cache/transient_key', $filter); + + $loader = new Timber\Loader(); + $loader->set_cache('test', 'foobar', \Timber\Loader::CACHE_TRANSIENT); + + remove_filter('timber/cache/transient_key', $filter); + + $this->assertEquals('foobar', get_transient('my_custom_key')); + } } class MyFakeThing implements TimberKeyGeneratorInterface