Публикация в группе: Плагин WP-Recall - Личный кабинет на WordPress

Категории группы: Полезное

В 14-ой версии в плагин WP-Recall был введен свой функционал кеширования.

Данный функционал включается в настройках плагина, после чего вкладки личного кабинета, поддерживающие данный функционал начинают сохранять свой контент в файл кеша, автоматически обновляя его через указанный в настройках временной интервал.

Следует знать, что данное кеширование является объектным, т.е. кешируется не вся страница, а только указанный участок кода. Для каждого объекта кеширования создается свой кеш-файл.

Использование по-умолчанию

Разработчикам дополнений к плагину для поддержки функционала кеширования при формировании вкладки личного кабинета через функцию rcl_tab() следует указывать дополнительную опцию 'cache' в значении true, например:

add_action('init','rcl_add_followers_tab');
function rcl_add_followers_tab(){
    rcl_tab('followers','rcl_followers_tab',__('Followers','wp-recall'),array('cache'=>true));
}

Для кеширования вывода контента, формируемого через сторонние шорткоды от других плагинов или самого шаблона становится возможным использовать отдельный шорткод кеширования [ rcl-cache ], в котором через необязательные атрибуты можно указывать:

  • time - время кеширования
  • key - уникальный ключ кеширования
  • only_guest - кеширование только для неавторизованных посетителей сайта

Например:

//тут размещаем кешируемый контент,
//формируемый через другие шорткоды

Следует знать, что использование шорткода кеширования бессмысленно в php-коде, так как, в этом случае, php-код размещенный внутри шорткода все равно будет отрабатывать.

Также следует учитывать, что контент формируемый шорткодом userlist автоматически кешируется при включении функционала кеширования от плагина и его дополнительное кеширование не требуется.

Кастомное кеширование

Рассмотрим порядок использования функционала кеширования плагина внутри php-кода.

Общий принцип:

  1. Перед кешируемым кодом проверяем наличие кеша и его актуальность
  2. Если кеш актуален и не требует обновления, то возвращаем его до работы кешируемого кода
  3. Если кеш-файл отсутствует или устарел, то отрабатывает кешируемый код и возвращает результат работы в переменную
  4. Отдаем результат работы кешируемого кода, сформированную переменную в кеш, создаем или обновляем файл кеширования
  5. Возвращаем результат работы кешируемого кода

Приступим к практическому применению:

//определяем объект кеширования
$rcl_cache = new Rcl_Cache();

//проверяем следует ли использовать кеширование 
if($rcl_cache->is_cache){

	//указываем уникальный ключ для кеш-файла
	$string = 'my-unique-key';
	
	//получаем данные кеш-файла по указанному ключу
	$file = $rcl_cache->get_file($string);
	
	//проверяем актуальность кеш-файла
	if(!$file->need_update){
	
		//возвращаем содержимое кеш-файла
		return $rcl_cache->get_cache();

	}

}

//Допустим, что кешируемый контент - вывод списка публикаций типа 'post'
$posts = get_posts();

//формируем контент списка публикаций
$content = '<ul>';
foreach($posts as $post){
	$content .= '<li><a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'</a></li>';
}
$content .= '</ul>';

//проверяем используется ли кеш
if($rcl_cache->is_cache){
	//создаем или обновляем кеш-файл с сформированным контентом
	$rcl_cache->update_cache($content);
}

//возвращаем контент
return $content;

Это основы использования функционала кеширования.

В указанном выше примере время кеширования и категория пользователей для кого контент будет кешироваться будет определяться из общих настроек плагина. В случае, если нам необходимо указать свое время кеширования, то следует передать значение времени в секундах первым аргументом при инициализации класса Rcl_Cache:

$rcl_cache = new Rcl_Cache(86400);

Если же нам необходимо кешировать данный контент только для гостей, независимо от общих настроек кеширования, то передаем вторым параметром значение true:

$rcl_cache = new Rcl_Cache(86400,true);

Принудительное обновление кеша

В приведенном примере кеш будет формироваться и обновляться согласно настроек или переданных параметров, но иногда требуется принудительно обновить созданный кеш-файл, например, по определенному событию.

Рассмотрим порядок принудительного обновления кеш-файла по событию.

В нашем случае, будет уместно обновлять кеш-файл списка публикаций при публикации новой записи типа 'post'. Для этого нам потребуется знать уникальный ключ, который мы указали в примере выше для кеш-файла и по которому мы будем в дальнейшем обращаться именно к этому кеш-файлу.

Обратимся к имеющемуся кеш-файлу по ключу и удалим его при публикации новой записи на сайте, для этого используем хук 'wp_insert_post', кеш-файл будет автоматически создан заново при следующем формировании списка публикаций уже с актуальным содержимым:

add_action('wp_insert_post','rcl_update_cache_posts_list',10,3);
function rcl_update_cache_posts_list($post_ID, $post, $update){
	//Если идет обновление записи или запись не типа 'post' возвращаем false
	if($update||$post->post_type!='post') return false;
	
	//удаляем кеш-файл по переданному ключу
	rcl_delete_file_cache('my-unique-key');
}

Таким образом, при каждой публикации новой записи типа 'post' указанный кеш-файл будет обновляться принудительно, без необходимости ожидать его обновление по указанному временному интервалу.

В заключении

Хотелось бы дать несколько рекомендаций по использованию данного функционала на сайте.

  • Не стоит использовать описанный функционал кеширования от плагина WP-Recall совместно со сторонним кешированием, это может привести к непредсказуемому результату.
  • Помните, что использование функционала кеширования на сайте с малой посещаемостью может привести к неоправданным расходам ресурсов сервера на создание кеш-файлов, а не наоборот.
  • Не рекомендуется использовать на одной странице большое количество объектов кеширования, если есть возможность, то их лучше объединять в более крупные объекты.
  • При создании объекта кеширования его ключ должен быть уникальным, иначе вы будете получать из кеша не тот контент, что ожидали.

Данный функционал был добавлен относительно недавно и сейчас носит скорее экспериментальный характер, будем рады если поделитесь своими наблюдениями и замечаниями при использовании данного функционала.

4

Автор публикации

не в сети 8 часов

Андрей CS

12K
рассматриваю задания
Комментарии: 2744Публикации: 481Регистрация: 30-11--0001Продаж/Покупок: 0/0