В современных проектах на WordPress часто встречается ситуация, когда страницы содержат динамический контент, меняющийся в зависимости от параметров запроса, пользовательских данных или других условий. Правильное кэширование таких страниц — задача нетривиальная. Если кэшировать страницу целиком без учета параметров, пользователи могут получать устаревшую или неверную информацию. В этой статье разберем, как эффективно организовать кэширование динамического контента с разными параметрами в WordPress, используя WP Super Cache и собственные решения.
Почему стандартное кэширование не подходит для динамического контента
Большинство кэширующих плагинов, включая WP Super Cache, ориентированы на статические страницы или страницы с ограниченным количеством вариантов вывода. При наличии динамических параметров, например, GET-параметров в URL (например, ?filter=color_red), стандартный кэш создает одну версию страницы и выдает её всем пользователям.
Это приводит к следующим проблемам:
- Пользователь видит контент, не соответствующий выбранным параметрам.
- Динамические данные, например, результаты фильтрации товаров, отзывов или пользовательских настроек, не обновляются.
- Кэш может засоряться из-за большого числа вариантов параметров, если создавать отдельные кэши под каждый.
Поэтому важно настраивать кэширование с учетом параметров или исключать из кэширования страницы с определенными параметрами.
Как WP Super Cache обрабатывает параметры в URL
WP Super Cache по умолчанию кэширует страницы по полному URL, включая параметры. Это значит, что example.com/page?param=1 и example.com/page?param=2 будут отдельными кэшами. Но при большом количестве параметров или их значений это может привести к чрезмерному расходу дискового пространства и снижению производительности.
WP Super Cache позволяет настроить правила исключения из кэширования по регулярным выражениям, чтобы не кэшировать страницы с определенными параметрами. Однако это не всегда удобно, если мы хотим кэшировать динамический контент с учетом некоторых параметров, но игнорировать другие.
Практическое решение: кэширование с фильтрацией параметров
Оптимальный способ — реализовать фильтрацию параметров, которые влияют на контент, и игнорировать ненужные. Для этого можно использовать собственный фильтр формирования ключа кэша в WP Super Cache.
Пример функции, которая отфильтровывает параметры и формирует ключ кэша только из важных параметров:
function wpsupercache_filter_cache_key($url) {
$parsed_url = parse_url($url);
if (empty($parsed_url['query'])) {
return $url; // Нет параметров, возвращаем как есть
}
parse_str($parsed_url['query'], $query_params);
// Оставляем только нужные параметры для кэширования
$allowed_params = ['filter', 'sort'];
$filtered_params = array_intersect_key($query_params, array_flip($allowed_params));
// Формируем новую строку параметров
$new_query = http_build_query($filtered_params);
// Собираем новый URL для ключа кэша
$new_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'];
if (!empty($new_query)) {
$new_url .= '?' . $new_query;
}
return $new_url;
}
Этот код можно подключить в functions.php темы или в отдельном плагине. Чтобы WP Super Cache использовал этот фильтр, нужно добавить его в систему кэширования, например, через хуки или расширение плагина.
Пример интеграции с WP Super Cache
WP Super Cache не предоставляет напрямую фильтр для ключа, но можно использовать хук wpsupercache_cache_file_name для изменения имени файла кэша:
add_filter('wpsupercache_cache_file_name', 'wpsupercache_custom_cache_key', 10, 2);
function wpsupercache_custom_cache_key($cache_file, $url) {
$filtered_url = wpsupercache_filter_cache_key($url);
// Генерируем имя файла кэша по отфильтрованному URL
$cache_file = md5($filtered_url) . '.html';
return $cache_file;
}
Таким образом, кэш будет создаваться не по полному URL с параметрами, а по отфильтрованному, что уменьшит количество дубликатов и одновременно позволит кэшировать страницы с нужными параметрами.
Кэширование динамических блоков с помощью шорткодов и AJAX
Если динамический контент находится внутри страницы, и важно кэшировать саму страницу целиком, можно применить подход с динамическими шорткодами, которые обновляют содержимое по AJAX, не затрагивая кэш страницы.
Пример шорткода, выводящего количество просмотров записи в реальном времени:
function wpsupercache_dynamic_views_shortcode() {
$post_id = get_the_ID();
return '<span id="views-count" data-post-id="' . esc_attr($post_id) . '">Загрузка...</span>';
}
add_shortcode('dynamic_views', 'wpsupercache_dynamic_views_shortcode');
// AJAX обработчик
add_action('wp_ajax_wpsupercache_get_views', 'wpsupercache_get_views_callback');
add_action('wp_ajax_nopriv_wpsupercache_get_views', 'wpsupercache_get_views_callback');
function wpsupercache_get_views_callback() {
$post_id = intval($_GET['post_id']);
$views = (int) get_post_meta($post_id, 'views_count', true);
wp_send_json_success(['views' => $views]);
}
И добавим JavaScript для обновления счетчика после загрузки страницы:
document.addEventListener('DOMContentLoaded', function() {
var span = document.getElementById('views-count');
if (!span) return;
var postId = span.getAttribute('data-post-id');
fetch('/wp-admin/admin-ajax.php?action=wpsupercache_get_views&post_id=' + postId)
.then(response => response.json())
.then(data => {
if (data.success) {
span.textContent = data.data.views;
} else {
span.textContent = 'Ошибка';
}
});
});
Такой подход позволяет кэшировать всю страницу, а динамический блок обновлять отдельно, избегая проблем с устаревшим кэшем.
Практические рекомендации по управлению кэшем с динамическими параметрами
- Фильтруйте параметры URL, учитывайте только те, которые действительно влияют на контент.
- Исключайте из кэширования URL с сессионными или уникальными параметрами, например,
?utm_sourceили?session_id, которые не влияют на содержимое. - Используйте динамические шорткоды и AJAX для частей страницы, которые обновляются часто или индивидуальны для пользователя.
- Мониторьте размер кэша и количество файлов, чтобы избежать переполнения диска.
- Регулярно очищайте кэш, особенно если контент меняется часто или появляются новые параметры.
Дополнительные инструменты и плагины для расширенного кэширования
Помимо WP Super Cache, существуют плагины, которые позволяют более гибко управлять кэшированием динамического контента:
- Clearfy Pro — предлагает расширенные настройки кэширования, включая управление исключениями и оптимизацию параметров URL.
- ABC Pagination — помогает оптимизировать пагинацию и кэширование страниц с большим количеством параметров.
Использование таких инструментов в комплексе с приведенными методами значительно повысит производительность сайта и качество кэширования динамического контента.