Оптимизация скорости загрузки сайта на WordPress напрямую связана с эффективным кешированием данных. В данной статье мы рассмотрим, как можно реализовать собственный кеш в WordPress, используя перегрузку функций и кэширование на уровне PHP, без привлечения сторонних плагинов, что даст вам полный контроль над процессом и позволит гибко настраивать логику кеширования.
Что такое кеширование и зачем оно нужно в WordPress
Кеширование — это сохранение результата выполнения ресурсоёмких операций (например, запросов к базе данных, сложной логики генерации контента) в промежуточное хранилище. При повторном обращении к этим данным сервер не выполняет всю работу заново, а просто отдаёт кешированный результат, значительно ускоряя загрузку страницы.
WordPress по умолчанию использует объектный кеш, но он часто сбрасывается после окончания работы скрипта, если не настроен внешний кеш (например, Memcached или Redis). Мы рассмотрим, как реализовать кеширование в рамках PHP и файловой системы, что подойдет для большинства хостингов без дополнительной настройки.
Перегрузка функций в WordPress для реализации кеша
Перегрузка функций (function overloading) в PHP — это создание пользовательских функций, которые переопределяют стандартное поведение, либо обертка вокруг существующих, чтобы добавить дополнительный функционал. В WordPress это часто реализуется через хуки, но иногда удобнее именно создать свою функцию, которая будет кешировать результат и возвращать его при повторных вызовах.
Пример — кеширование результата длительного запроса к базе данных, например, выборки последних комментариев.
Пример реализации кеша с помощью пользовательской функции
function wpcoder_get_recent_comments_cached($number = 5) {
$cache_key = 'wpcoder_recent_comments_' . $number;
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$comments = get_comments(array('number' => $number, 'status' => 'approve'));
set_transient($cache_key, $comments, 60 * 10); // кеш на 10 минут
return $comments;
}Здесь мы используем WordPress API для транзиентов — временного кеша, хранящегося в базе данных. Функция сначала пытается получить данные из кеша, если их нет — делает запрос и сохраняет результат.
Кеширование с использованием файловой системы
Если хостинг не поддерживает транзиенты или вы хотите избежать нагрузки на базу, можно кешировать данные в файлы. Для этого создадим функцию, которая сохраняет сериализованные данные в файл и читает их при необходимости.
Пример кеширования в файл
function wpcoder_file_cache_get($key) {
$cache_file = WP_CONTENT_DIR . '/cache/wpcoder_' . md5($key) . '.cache';
if (!file_exists($cache_file)) {
return false;
}
$data = file_get_contents($cache_file);
$cache = unserialize($data);
if ($cache['expires'] < time()) {
unlink($cache_file);
return false;
}
return $cache['data'];
}
function wpcoder_file_cache_set($key, $data, $ttl = 600) {
$cache_file = WP_CONTENT_DIR . '/cache/wpcoder_' . md5($key) . '.cache';
$cache = array(
'data' => $data,
'expires' => time() + $ttl
);
if (!file_exists(dirname($cache_file))) {
mkdir(dirname($cache_file), 0755, true);
}
file_put_contents($cache_file, serialize($cache));
}Теперь можно использовать эти функции для кеширования сложных запросов или данных. Например:
$comments = wpcoder_file_cache_get('recent_comments_5');
if ($comments === false) {
$comments = get_comments(array('number' => 5, 'status' => 'approve'));
wpcoder_file_cache_set('recent_comments_5', $comments, 600);
}
// Далее используем $commentsСоветы и рекомендации по кешированию в WordPress
1. Всегда учитывайте время жизни кеша, чтобы не показывать устаревшую информацию.
2. Для динамического контента используйте более короткие TTL или инвалидируйте кеш принудительно при изменении данных.
3. Если ваш хостинг поддерживает Memcached или Redis, лучше использовать их для объектного кеша — это гораздо эффективнее файлового кеша.
4. Для кеширования HTML-контента можно использовать плагины, например, WP Super Cache или W3 Total Cache, но если нужна кастомизация — создавайте собственные функции как в примерах.
Использование встроенного объекта кеша WordPress с перегрузкой функций
WordPress предоставляет объектный кеш через функции wp_cache_get и wp_cache_set. Мы можем обернуть получение данных в свою функцию, которая сначала проверит кеш, а при отсутствии - выполнит запрос и сохранит результат.
function wpcoder_get_data_with_object_cache($key, callable $callback, $ttl = 600) {
$data = wp_cache_get($key, 'wpcoder_cache_group');
if ($data !== false) {
return $data;
}
$data = $callback();
wp_cache_set($key, $data, 'wpcoder_cache_group', $ttl);
return $data;
}Использование:
$comments = wpcoder_get_data_with_object_cache('recent_comments_5', function() {
return get_comments(array('number' => 5, 'status' => 'approve'));
}, 600);Такой подход позволяет легко кешировать любые данные, просто передавая логику их получения через callback.