Intereting Posts
Дублированный сайт WordPress STILL, связанный со старым сайтом Каков наилучший способ обработки css для нескольких макетов заголовков / нескольких пользовательских файлов header.php? Как я могу получить сообщения от 9/13/11 по сегодняшний день с SQL? Налоговый термин как cpt slug в permalink – перенаправление не работает на дочернем cpt post Как отобразить список результатов Просмотр главной страницы в режиме предварительного просмотра Вывод случайного (пользовательского) размера изображения Превращение разбитых URL-адресов в условия поиска? Добавление настраиваемого типа сообщения в цикл Изменить порядок сортировки при использовании 'orderby' => 'type' Какая разница между current_page_item и текущим меню? Невозможно применить тему к установке сетевого сайта WordPress Какова цель файла paged.php? Добавьте пользовательский почтовый ящик в пользовательский заголовок сообщения Как предотвратить загрузку изображений с несколькими размерами

Очистка кэшированных данных плагина, если используется кеш внешнего объекта

Я создал плагин, который кэширует некоторые из данных, которые он использует – в основном результаты поиска Salesforce REST API, и истекает их с интервалами (по умолчанию каждые 24 часа).

Плагин вызывает эти методы для управления кэшированием:

/** * Check to see if this API call exists in the cache * if it does, return the transient for that key * * @param string $url The API call we'd like to make. * @param array $args The arguents of the API call. * @return get_transient $cachekey */ public function cache_get( $url, $args ) { if ( is_array( $args ) ) { $args[] = $url; array_multisort( $args ); } else { $args .= $url; } $prefix = esc_sql( $this->transient_prefix() ); $cachekey = $prefix . md5( wp_json_encode( $args ) ); return get_transient( $cachekey ); } /** * Create a cache entry for the current result, with the url and args as the key * * @param string $url The API query URL. * @param array $args The arguments passed on the API query. * @param array $data The data received. * @param string $cache_expiration How long to keep the cache result around for. * @return Bool whether or not the value was set * @link https://developer.wordpress.org/reference/functions/set_transient/ */ public function cache_set( $url, $args, $data, $cache_expiration = '' ) { if ( is_array( $args ) ) { $args[] = $url; array_multisort( $args ); } else { $args .= $url; } $prefix = esc_sql( $this->transient_prefix() ); $cachekey = $prefix . md5( wp_json_encode( $args ) ); // Cache_expiration is how long it should be stored in the cache. // If we didn't give a custom one, use the default. if ( '' === $cache_expiration ) { $cache_expiration = $this->options['cache_expiration']; } return set_transient( $cachekey, $data, $cache_expiration ); } /** * Get the cache transient prefix for this plugin and return it * * @return The transient prefix */ private function transient_prefix() { $transient_prefix = 'sfwp'; return $transient_prefix; } /** * If there is a WordPress setting for how long to keep this specific cache, return it and set the object property * Otherwise, return seconds in 24 hours * * @param string $option_key The cache item to keep around. * @param int $expire The default time after which to expire the cache. * @return The cache expiration saved in the database. */ public function cache_expiration( $option_key, $expire ) { $cache_expiration = get_option( $option_key, $expire ); return $cache_expiration; } 

Я хотел бы предоставить пользователям способ очистки этого кеша вручную, хотя в случае изменения конфигурации их объектов Salesforce и не хочу ждать автоматического истечения срока действия. Я хотел бы избежать очистки кеша всего сайта в этом событии (это мое понимание того, что wp_cache_flush() ).

Я только что добавил $transient_prefix в вышеприведенных методах, поскольку я понимаю, что это будет легко, если сайт просто использует API Transients. Но если они используют кеш объектов, я из моей лиги.

Я создал метод cache_purge например:

 /** * Create a cache entry for the current result, with the url and args as the key * * @param string $subset If we only want to purge WordPress data, Salesforce data, options, etc. * @return Bool whether or not the purge was successful */ public function cache_purge( $subset = '' ) { $prefix = esc_sql( $this->transient_prefix() ); // cache is stored somewhere other than the options table if ( wp_using_ext_object_cache() ) { } else { // cache is stored in the options table. this is pretty easy. $options = $this->wpdb->options; $t = esc_sql( '_transient_timeout_' . $prefix . '%' ); $sql = $wpdb ->prepare( "SELECT option_name FROM $options WHERE option_name LIKE '%s'", $t ); $transients = $this->wpdb->get_col( $sql ); foreach ( $transients as $transient ) { // Strip away the WordPress prefix in order to arrive at the transient key. $key = str_replace( '_transient_timeout_', '', $transient ); // Now that we have the key, use WordPress core to the delete the transient. delete_transient( $key ); } } } 

Я понимаю, что это позволит мне проверить наличие любого внешнего кэша объектов (который, я думаю, будет охватывать плагины кэширования, а также Varnish / memcache / etc.), И если их нет, очистите API переходных процессов.

До сих пор я исправляю? Если да, то что я могу сделать, чтобы очистить одни и те же данные от кеша объектов?

Solutions Collecting From Web of "Очистка кэшированных данных плагина, если используется кеш внешнего объекта"

Мы отмечаем, что API Transients использует API-интерфейс Object Cache , когда мы используем object-cache.php drop-in object-cache.php .

Например, если wp_using_ext_object_cache() возвращает true , тогда

 get_transient( $transient ) -> wp_cache_get( $transient, 'transient' ) set_transient( $transient, $value, $expiration ) -> wp_cache_set( $transient, $value, 'transient', $expiration ) delete_transient( $transient ) -> wp_cache_delete( $transient, 'transient' ) 

где группа является transient .

API-интерфейс Object Cache API не поддерживает wp_cache_delete_group() для удаления кеша группой и в настоящее время имеет wontfix в билете # 4476 .

Приведенная здесь причина заключалась в том, что не все постоянные решения кэширования поддерживают его. Но есть несколько способов, описанных в билете, которые зависят от решения кэша.

В качестве примера реализация реализаций постоянного wp_cache_delete_group() WP Redis поддерживает wp_cache_delete_group() , но не реализацию кэша объектов Memcached .

Если мы используем переходные процессы в нашем плагине с постоянным кэшем объектов, то следует отметить, что если мы использовали:

 if( function_exists( 'wp_cache_delete_group' ) ) { wp_cache_delete_group( 'transient' ); } 

то похоже, что мы сбросим все переходные процессы, а не только те, которые установлены в нашем собственном плагине.

Если ключи кеша известны заранее, мы можем удалить их с помощью:

 wp_cache_delete( $cachekey, $cachegroup ); 

где $cachegroup является 'transient' если мы использовали переходные процессы.