$hashes Hex-хеши строк. * @param string $locale Целевой язык. * @return array{hits: array, misses: list} */ public function getMany( array $hashes, string $locale ): array { if ( array() === $hashes ) { return array( 'hits' => array(), 'misses' => array(), ); } $keys = array(); foreach ( $hashes as $hash ) { $keys[ $this->key( $hash, $locale ) ] = $hash; } $cached = wp_cache_get_multiple( array_keys( $keys ), self::GROUP ); $hits = array(); $misses = array(); foreach ( $keys as $key => $hash ) { $value = $cached[ $key ] ?? false; if ( false === $value ) { $misses[] = $hash; continue; } $hits[ $hash ] = self::MISS === $value ? null : $value; } return array( 'hits' => $hits, 'misses' => $misses, ); } /** * Записывает результаты выборки, включая отрицательные. * * @param array $found Найденное в БД. * @param list $requested Все запрошенные хеши. * @param string $locale Целевой язык. */ public function setMany( array $found, array $requested, string $locale ): void { foreach ( $requested as $hash ) { wp_cache_set( $this->key( $hash, $locale ), $found[ $hash ] ?? self::MISS, self::GROUP, self::TTL ); } } /** * Обесценивает весь кэш переводов и кэш страниц сторонних плагинов. * * Без второй части посетитель мог бы ещё долго видеть старую версию * страницы из чужого page cache (ТЗ 12.1) — наш кэш тут ни при чём, * раздающий готовый HTML плагин о нём не знает. */ public function flush(): void { $version = $this->currentVersion() + 1; update_option( self::versionOption(), $version, true ); $this->version = $version; PageCachePurger::purgeAll(); } /** * Ключ записи. * * @param string $hash Hex-хеш строки. * @param string $locale Целевой язык. */ private function key( string $hash, string $locale ): string { return $this->currentVersion() . ':' . $locale . ':' . $hash; } /** * Номер версии кэша. * * Публичный, потому что на него опираются и другие кэши плагина: версия * растёт при каждом сохранении перевода, и включение её в ключ избавляет * их от собственной инвалидации. */ public function version(): int { return $this->currentVersion(); } /** * Номер версии кэша. */ private function currentVersion(): int { if ( null === $this->version ) { $this->version = max( 1, (int) get_option( self::versionOption(), 1 ) ); } return $this->version; } }