Внутреннее кэширование — один из наиболее эффективных способов ускорить загрузку сайта на WordPress, особенно на легкой и гибкой теме GeneratePress. В этой статье мы подробно рассмотрим, как реализовать собственное внутреннее кэширование для отдельных частей сайта, чтобы снизить нагрузку на сервер и улучшить пользовательский опыт.
Почему внутреннее кэширование важно для сайтов на GeneratePress
GeneratePress уже оптимизирована по умолчанию, но при наличии динамического контента, сложных запросов к базе данных или сторонних плагинов скорость загрузки может снижаться. Внутреннее кэширование позволяет хранить результат дорогостоящих операций в памяти или на диске, чтобы при следующем запросе не выполнять их заново.
Это особенно актуально для блоков с динамическими данными, виджетов, кастомных запросов и API-вызовов. Внутренний кэш работает на уровне PHP и сервера, не полагаясь на внешние сервисы.
Основные преимущества внутреннего кэша:
- Снижение времени обработки PHP и запросов к базе данных;
- Уменьшение нагрузки на сервер при большом трафике;
- Улучшение показателей Core Web Vitals за счёт быстрой отдачи контента;
- Гибкость — можно кэшировать только отдельные компоненты сайта.
Как реализовать внутреннее кэширование в GeneratePress с помощью transient API
WordPress предоставляет встроенный механизм кэширования — Transients API. Он позволяет сохранять временные данные с указанием срока жизни. Это идеальный вариант для кэширования части страницы или результата сложного запроса.
Рассмотрим пример создания функции generatepressru_set_transient, которая кэширует результат функции генерации динамического контента в GeneratePress.
function generatepressru_set_transient( $transient_name, $callback, $expiration = 3600 ) {
$cached = get_transient( $transient_name );
if ( false !== $cached ) {
return $cached;
}
$data = call_user_func( $callback );
set_transient( $transient_name, $data, $expiration );
return $data;
}Эта функция принимает имя кэша, callback для получения данных и время жизни в секундах. Если кэш есть — возвращает его, иначе вызывает callback, сохраняет результат и возвращает.
Пример использования для кэширования списка последних постов
function generatepressru_get_latest_posts_html() {
return generatepressru_set_transient('gp_latest_posts_html', function() {
$posts = get_posts([ 'numberposts' => 5, 'post_status' => 'publish' ]);
if ( empty( $posts ) ) {
return '<p>Нет последних постов</p>';
}
$output = '<ul>';
foreach ( $posts as $post ) {
$output .= '<li><a href="' . get_permalink( $post ) . '">' . esc_html( get_the_title( $post ) ) . '</a></li>';
}
$output .= '</ul>';
return $output;
}, 600 ); // кэш на 10 минут
}Встраиваем вызов generatepressru_get_latest_posts_html() в нужное место темы, например, в sidebar.php или через хук GeneratePress.
Оптимизация кэша: сброс и обновление при изменениях контента
Чтобы кэш не устаревал, важно сбрасывать его при публикации или обновлении постов. Для этого используем хук save_post:
function generatepressru_clear_transient_on_post_save( $post_id ) {
if ( wp_is_post_revision( $post_id ) ) {
return;
}
delete_transient( 'gp_latest_posts_html' );
}
add_action( 'save_post', 'generatepressru_clear_transient_on_post_save' );Так мы гарантируем, что после изменения контента кэш обновится автоматически.
Использование плагинов для расширенного внутреннего кэширования в GeneratePress
Если хочется более мощного решения с минимальной кодировкой, можно использовать плагины, совместимые с GeneratePress:
- Clearfy Pro — оптимизация и кэширование с удобным интерфейсом и очисткой ненужных запросов;
- ABC Pagination — для кэширования пагинации и постраничной навигации;
- WPRemark — кэширование пользовательских отзывов и комментариев.
Эти инструменты дополнят внутреннее кэширование и повысят общую производительность сайта.
Кэширование AJAX-запросов в GeneratePress
Если на сайте используются AJAX-запросы для динамического контента (например, фильтры или подгрузка постов), имеет смысл кэшировать их ответы на сервере.
Пример кэширования AJAX-обработчика:
add_action( 'wp_ajax_generatepressru_load_more', 'generatepressru_ajax_load_more' );
add_action( 'wp_ajax_nopriv_generatepressru_load_more', 'generatepressru_ajax_load_more' );
function generatepressru_ajax_load_more() {
$page = isset( $_POST['page'] ) ? intval( $_POST['page'] ) : 1;
$transient_key = 'gp_ajax_load_more_' . $page;
$response = get_transient( $transient_key );
if ( false === $response ) {
// Выполняем запрос
$posts = get_posts([
'paged' => $page,
'posts_per_page' => 5,
'post_status' => 'publish'
]);
ob_start();
if ( $posts ) {
foreach ( $posts as $post ) {
setup_postdata( $post );
echo '<div><a href="' . get_permalink() . '">' . get_the_title() . '</a></div>';
}
wp_reset_postdata();
} else {
echo '<p>Нет дополнительных записей</p>';
}
$response = ob_get_clean();
set_transient( $transient_key, $response, HOUR_IN_SECONDS );
}
wp_send_json_success( $response );
}Такой подход значительно снижает нагрузку на сервер при частых AJAX-запросах.
Заключение по внутреннему кэшированию в GeneratePress
Внутреннее кэширование — мощный инструмент в арсенале разработчика GeneratePress. Правильная реализация с помощью Transients API позволяет ускорить сайт, снизить нагрузку и улучшить взаимодействие с пользователями без больших затрат.
Вместе с плагинами из WPShop можно построить максимально производительный и адаптированный под задачи сайт на GeneratePress.