Как добавить кастомную кэшировку данных в WordPress без плагинов

Почему кастомная кэшировка важна для 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 — он предлагает удобные инструменты для оптимизации и кэширования.

Настройка автоматической очистки базы данных WordPress по расписанию
29.01.2026
Как избежать проблем с конфликтами между плагинами в WordPress
21.12.2025
Как удалить неиспользуемые метаполя из базы WordPress
29.04.2026
Как автоматизировать удаление старых комментариев в WordPress
09.03.2026
Как решить проблему нерабочих изображений в WordPress после переездов сайта
26.03.2026