Почему кастомная кэшировка важна для WordPress
WordPress — мощная CMS, но при работе с динамическим контентом и сложными запросами к базе данных нагрузка на сервер может значительно возрасти. Использование стандартных плагинов кэширования, таких как W3 Total Cache или WP Super Cache, решает многие задачи, но иногда требуется более тонкая настройка и кастомизация кэширования именно для конкретных данных или функционала.
Кастомная кэшировка позволяет сохранять в кэш не весь HTML, а отдельные тяжелые запросы или вычисления, что сокращает время отклика и снижает нагрузку на базу данных.
В этой статье я расскажу, как реализовать кастомный механизм кэширования в WordPress без плагинов, используя Transients API и объектный кэш.
Использование Transients API для кэширования данных
Transients API — встроенный в WordPress механизм временного хранения данных в базе или объектном кэше. Отлично подходит для кэширования результатов запросов к базе или внешних API.
Рассмотрим пример функции wpelement_cache_get_popular_posts(), которая возвращает популярные посты и кэширует результат на 12 часов.
function wpelement_cache_get_popular_posts() {
$cache_key = 'wpelement_popular_posts';
$popular_posts = get_transient($cache_key);
if (false === $popular_posts) {
// Запрос популярных постов (например, по мета-полю просмотров)
$args = [
'posts_per_page' => 5,
'meta_key' => 'post_views_count',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'post_status' => 'publish',
];
$query = new WP_Query($args);
$popular_posts = $query->posts;
set_transient($cache_key, $popular_posts, 12 * HOUR_IN_SECONDS);
}
return $popular_posts;
}В этом примере первый вызов функции выполнит тяжелый запрос и сохранит результат в кэш. Последующие вызовы в течение 12 часов будут возвращать закэшированные данные, значительно ускоряя загрузку.
Как очистить кэш при обновлении данных
Чтобы кэш не устаревал, нужно сбрасывать transient при изменении постов или мета-данных. Для этого можно использовать хук save_post:
function wpelement_cache_clear_popular_posts($post_id) {
if (wp_is_post_revision($post_id)) {
return;
}
delete_transient('wpelement_popular_posts');
}
add_action('save_post', 'wpelement_cache_clear_popular_posts');Теперь кэш будет сбрасываться при каждом сохранении поста, и данные всегда будут актуальны.
Объектный кэш в WordPress: ускоряем работу без лишних запросов
Объектный кэш — это механизм хранения данных в памяти на время выполнения запроса. WordPress автоматически кэширует результаты запросов к базе, но можно использовать объектный кэш для кастомных данных.
Для этого используем функции wp_cache_set(), wp_cache_get() и wp_cache_delete(). Пример реализации кэширования в объектном кэше:
function wpelement_cache_get_custom_data() {
$cache_key = 'wpelement_custom_data';
$cached = wp_cache_get($cache_key, 'wpelement_group');
if ($cached === false) {
// Тяжелая операция, например, сложный запрос к API или базе
$data = do_some_heavy_processing();
wp_cache_set($cache_key, $data, 'wpelement_group', 3600); // кешируем на 1 час
return $data;
}
return $cached;
}<Объектный кэш эффективен, если у вас настроен persistent cache (например, Redis или Memcached). В противном случае данные кэшируются только на время одного запроса.
Пример использования с WP_Query и объектным кэшем
Можно комбинировать WP_Query с объектным кэшем для кэширования результата:
function wpelement_cache_get_latest_posts() {
$cache_key = 'wpelement_latest_posts';
$posts = wp_cache_get($cache_key, 'wpelement_group');
if ($posts === false) {
$query = new WP_Query(['posts_per_page' => 10]);
$posts = $query->posts;
wp_cache_set($cache_key, $posts, 'wpelement_group', 1800);
}
return $posts;
}Реализация собственного файлового кэширования для больших данных
Если нужно кэшировать большие объемы данных и нет доступа к объектному кэшу, можно сделать простой файловый кэш. Такой подход полезен для API-ответов или обработанных данных.
Пример функции сохранения и получения кэша в файле:
function wpelement_file_cache_set($key, $data, $ttl = 3600) {
$cache_dir = WP_CONTENT_DIR . '/cache/wpelement/';
if (!file_exists($cache_dir)) {
wp_mkdir_p($cache_dir);
}
$cache_file = $cache_dir . md5($key) . '.cache';
$cache_data = [
'expires' => time() + $ttl,
'data' => $data,
];
file_put_contents($cache_file, serialize($cache_data));
}
function wpelement_file_cache_get($key) {
$cache_file = WP_CONTENT_DIR . '/cache/wpelement/' . md5($key) . '.cache';
if (!file_exists($cache_file)) {
return false;
}
$cache_data = unserialize(file_get_contents($cache_file));
if ($cache_data['expires'] < time()) {
unlink($cache_file);
return false;
}
return $cache_data['data'];
}Используем эти функции для кэширования данных с примерами:
function wpelement_get_external_api_data() {
$cache_key = 'external_api_data';
$data = wpelement_file_cache_get($cache_key);
if ($data === false) {
// Выполняем запрос к внешнему API
$response = wp_remote_get('https://api.example.com/data');
if (is_wp_error($response)) {
return null;
}
$data = wp_remote_retrieve_body($response);
wpelement_file_cache_set($cache_key, $data, 3600); // кэшируем на час
}
return $data;
}Советы по оптимизации и мониторингу кэширования
При использовании кастомного кэширования важно контролировать размер и время жизни кэша, чтобы не переполнять диск или базу данных.
Рекомендуется периодически очищать устаревшие кэш-файлы и контролировать логи ошибок для своевременного обнаружения проблем.
Для удобства можно добавить в админку кнопку сброса кэша или использовать WP-CLI команды для управления кэшем.
Пример сброса кэша через WP-CLI
if (defined('WP_CLI') && WP_CLI) {
WP_CLI::add_command('wpelement cache flush', function() {
// Очистка transient
delete_transient('wpelement_popular_posts');
// Очистка файлового кэша
$cache_dir = WP_CONTENT_DIR . '/cache/wpelement/';
$files = glob($cache_dir . '*.cache');
foreach ($files as $file) {
unlink($file);
}
WP_CLI::success('Кэш WPelement успешно очищен.');
});
}Вывод: кастомное кэширование в WordPress — мощный инструмент для ускорения сайта и снижения нагрузки, который можно реализовать без плагинов, используя встроенные API и простые решения.
Если хотите расширить функционал и автоматизировать управление кэшем, рекомендую посмотреть плагин Clearfy Pro — он предлагает удобные инструменты для оптимизации и кэширования.