Что такое кэширование и почему оно важно для скорости WordPress
Кэширование — это процесс сохранения копий страниц или данных, чтобы при повторных запросах сервер не генерировал их заново, а отдавал уже готовый результат. В WordPress кэширование помогает значительно снизить нагрузку на сервер и ускорить загрузку страниц для посетителей.
Без кэша каждый запрос к сайту требует выполнения PHP-кода и запросов к базе данных, что замедляет отклик и увеличивает время загрузки. Правильно настроенный кэш позволяет показывать пользователю статичные версии страниц, что особенно важно при большом трафике.
Существуют разные типы кэша: кэш страниц, кэш объектов, кэш запросов к базе данных и кэш браузера. В этой статье мы подробно разберём, как вручную создать простой и эффективный кэш страниц, а также рассмотрим полезные плагины для расширенного кэширования.
Создание простого кэша страниц в WordPress своими руками
Принцип работы простого файлового кэша
Идея простого кэша — сохранить сгенерированную HTML-страницу в файл на сервере при первом запросе, а при следующих запросах отдавать этот файл, не выполняя PHP и не обращаясь к базе данных. Такой подход значительно ускоряет загрузку и снижает нагрузку.
Реализация кэша сводится к проверке, существует ли уже кэш-файл для текущего URL, и если да — выводить его содержимое. Если нет — генерировать страницу, сохранять в кэш и отдавать.
Пример простого кэширования в functions.php
Добавьте следующий код в functions.php вашей темы или в отдельный плагин:
function wpspeed_start_cache() {
if(!is_user_logged_in()) { // Не кэшируем для админов
$cache_dir = WP_CONTENT_DIR . '/cache/wpspeed/';
if(!file_exists($cache_dir)) {
mkdir($cache_dir, 0755, true);
}
$cache_file = $cache_dir . md5($_SERVER['REQUEST_URI']) . '.html';
if(file_exists($cache_file) && (filemtime($cache_file) + 3600) > time()) {
// Кэш существует и не устарел - отдаем содержимое
echo file_get_contents($cache_file);
exit;
} else {
// Начинаем буферизацию вывода
ob_start();
}
}
}
add_action('template_redirect', 'wpspeed_start_cache', 0);
function wpspeed_end_cache() {
if(!is_user_logged_in() && ob_get_length()) {
$cache_dir = WP_CONTENT_DIR . '/cache/wpspeed/';
$cache_file = $cache_dir . md5($_SERVER['REQUEST_URI']) . '.html';
$content = ob_get_contents();
file_put_contents($cache_file, $content);
ob_end_flush();
}
}
add_action('shutdown', 'wpspeed_end_cache');Этот код создаёт папку wp-content/cache/wpspeed/ и сохраняет кэшированные HTML-файлы с именами, основанными на URL. Кэш обновляется каждый час (3600 секунд). Такой простой кэш отлично подходит для сайтов с преимущественно статическим контентом.
Расширенные способы кэширования в WordPress
Объектный кэш и его преимущества
Объектный кэш хранит результаты запросов к базе данных в памяти (например, в Redis или Memcached), чтобы при повторных запросах не обращаться к БД. Это особенно эффективно для динамичных сайтов с частыми запросами к базе.
Для реализации объектного кэша в WordPress можно использовать готовые плагины, которые интегрируются с внешними кэш-серверами. Это гораздо эффективнее простого файлового кэша для крупных проектов.
Рекомендуемые плагины для кэширования
- WP Super Cache — популярный бесплатный плагин для кэширования страниц с простыми настройками.
- W3 Total Cache — мощный плагин с поддержкой кэширования страниц, объектов, базы данных и CDN.
- LiteSpeed Cache — плагин, оптимизированный для серверов LiteSpeed, с функциями кэширования и оптимизации.
- Redis Object Cache — интегрирует WordPress с Redis для объектного кэша.
Выбор плагина зависит от вашего хостинга и специфики сайта. Если у вас есть доступ к Redis или Memcached, обязательно используйте объектный кэш для повышения производительности.
Советы по оптимизации и отладке собственного кэша
Как избежать проблем с кэшированием динамического контента
При использовании кэширования важно не кэшировать страницы с персонализированным контентом, например, личные кабинеты, корзины, страницы с формами. В нашем примере мы исключили кэширование для авторизованных пользователей.
Если в шаблонах есть блоки, которые должны обновляться динамически (например, счётчик товаров в корзине), можно реализовать AJAX-запросы для их обновления после загрузки страницы из кэша.
Как очистить кэш вручную и автоматически
В простом файловом кэше можно добавить функцию для очистки всех кэшированных файлов, например, через админку или при обновлении записи. Вот пример функции очистки:
function wpspeed_clear_cache() {
$cache_dir = WP_CONTENT_DIR . '/cache/wpspeed/';
if(is_dir($cache_dir)) {
$files = glob($cache_dir . '*.html');
foreach($files as $file) {
unlink($file);
}
}
}Эту функцию можно вызывать вручную или по событию, например, при обновлении записи в WordPress через хук save_post.
Автоматическая очистка кэша при публикации поможет всегда показывать свежий контент.