В WordPress кэширование помогает значительно ускорить загрузку страниц и снизить нагрузку на сервер. Однако при работе с динамическим контентом — например, с пользовательскими счетчиками, количеством просмотров, корзинами WooCommerce и т.п. — возникает необходимость создавать кэш, который можно обновлять автоматически или по определённым событиям. В этой статье мы разберем, как реализовать обновляемый кэш в WordPress на примере PHP-кода, а также рассмотрим полезные плагины и техники для эффективного управления кэшированием.
Почему стандартное кэширование не подходит для динамического контента
Стандартные плагины кэширования (WP Super Cache, W3 Total Cache, LiteSpeed Cache и др.) в основном кешируют HTML-страницы целиком или их части, что отлично подходит для статичных страниц. Но если на странице есть элементы, которые меняются для каждого пользователя или обновляются часто (например, счетчики, виджеты с результатами опросов, пользовательские данные), тогда статический кэш будет показывать устаревшую информацию.
Чтобы решить эту проблему, нужно использовать обновляемый кэш — механизм, который позволяет хранить кэшированные данные и обновлять их по событию или через заданный интервал времени.
Основные подходы к организации обновляемого кэша в WordPress
1. Использование Transients API для кэширования с истечением срока
WordPress предоставляет встроенный механизм кэширования временных данных — Transients API. С помощью него можно сохранять данные на определённое время, после чего они автоматически удаляются. Это удобно для динамического контента, который обновляется, например, раз в 10 минут.
Пример кода для сохранения и получения кэша с помощью транзиентов:
function wphow_get_dynamic_data() {
$cache_key = 'wphow_dynamic_data';
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached; // Возвращаем кэшированные данные
}
// Если кэш отсутствует, получаем новые данные
$data = wphow_fetch_expensive_data();
set_transient($cache_key, $data, 10 * MINUTE_IN_SECONDS); // кэшируем на 10 минут
return $data;
}
function wphow_fetch_expensive_data() {
// Здесь может быть запрос к API, сложные вычисления и т.п.
return 'Результат динамических данных '.date('H:i:s');
}Вызов wphow_get_dynamic_data() будет возвращать закэшированные данные в течение 10 минут, затем кэш обновится.
2. Очистка кэша по событию
Иногда необходимо обновлять кэш не по времени, а по событию — например, после публикации нового поста, обновления настроек или действия пользователя. Для этого нужно вручную удалять транзиенты из базы данных.
Пример удаления транзиента при сохранении записи:
add_action('save_post', 'wphow_clear_dynamic_cache');
function wphow_clear_dynamic_cache($post_id) {
if (wp_is_post_revision($post_id)) return;
delete_transient('wphow_dynamic_data');
}Таким образом, при каждом сохранении записи кэш будет сброшен и при следующем запросе данные заново вычислятся и сохранятся.
3. Использование объектного кэша WordPress
Object Cache позволяет сохранять данные в памяти (например, Redis, Memcached), что ускоряет работу по сравнению с базой данных. Многие хостинги поддерживают Redis, и WordPress можно настроить на использование этого кэша.
Для этого потребуется установить плагин, например, Redis Object Cache, и подключить Redis на сервере. После настройки функции set_transient() и get_transient() будут использовать объектный кэш, что повысит производительность.
Пример кэширования виджета с динамическим выводом
Рассмотрим, как создать виджет, который выводит количество просмотров поста с обновляемым кэшем.
class Wphow_Views_Widget extends WP_Widget {
public function __construct() {
parent::__construct('wphow_views_widget', 'WPHOW: Просмотры поста');
}
public function widget($args, $instance) {
echo $args['before_widget'];
$post_id = get_the_ID();
$cache_key = 'wphow_post_views_'. $post_id;
$views = get_transient($cache_key);
if ($views === false) {
$views = (int) get_post_meta($post_id, 'post_views_count', true);
set_transient($cache_key, $views, 5 * MINUTE_IN_SECONDS);
}
echo '<p>Количество просмотров: '. esc_html($views) .'</p>';
echo $args['after_widget'];
}
}
function wphow_register_views_widget() {
register_widget('Wphow_Views_Widget');
}
add_action('widgets_init', 'wphow_register_views_widget');В этом примере количество просмотров берется из мета-поля, кэшируется на 5 минут, что снижает количество обращений к базе. Если после обновления просмотров нужно сбросить кэш, можно добавить сброс транзиента при сохранении поста.
Полезные плагины для управления динамическим кэшом
Для более удобного контроля кэширования и интеграции с Redis или Memcached есть несколько полезных плагинов:
- Clearfy Pro — предлагает расширенные настройки оптимизации, включая управление кэшем и очистку ненужных данных. Подробнее: Clearfy Pro на WPSHOP.
- WP Redis — плагин для интеграции Redis Object Cache с WordPress.
- WP Rocket — премиум-плагин с поддержкой кэширования страниц и частичной очистки кэша по событиям.
Советы по оптимизации обновляемого кэша в WordPress
Чтобы кэш действительно ускорял сайт и не создавал проблем с устаревшими данными, следуйте рекомендациям:
- Выбирайте правильное время жизни кэша — слишком длинный срок вызовет показ старых данных, слишком короткий не даст выигрыша в производительности.
- Сбрасывайте кэш по событиям, если данные изменяются редко, но должны обновляться сразу.
- Используйте объектный кэш для хранения транзиентов, если сервер поддерживает Redis или Memcached.
- Тестируйте кеширование на разных страницах, чтобы убедиться, что динамический контент обновляется корректно.
Применение обновляемого кэша в WordPress требует баланса между скоростью загрузки и актуальностью данных. Используйте возможности Transients API вместе с грамотной очисткой по хукам, а для сложных проектов подключайте объектный кэш. Это позволит увеличить производительность сайта и улучшить опыт пользователей.