При использовании кэширующих плагинов, таких как WP Super Cache, часто возникает проблема с динамическими элементами сайта, например, формами обратной связи, формами подписки или кастомными AJAX-формами. Кэширование страниц, содержащих такие формы, может привести к тому, что пользователь получает устаревший или неправильный ответ, либо форма перестает корректно работать.
Почему кэширование форм в WordPress создаёт сложности
Основная задача WP Super Cache — ускорить загрузку страниц, сохраняя их статичные версии. Однако формы обычно требуют обработки данных на сервере и динамического отображения результатов. При кэшировании форма может показывать уже заполненные поля, сообщения об ошибках или успехе, относящиеся к предыдущим запросам других пользователей.
Это приводит к ухудшению пользовательского опыта и даже к потере данных. Поэтому важно грамотно настроить исключения из кэширования и обеспечить корректную работу форм.
Как настроить исключения из кэширования в WP Super Cache для форм
WP Super Cache позволяет исключать из кэша определённые страницы, запросы или куки. Вот несколько способов:
- Исключение страниц с формами из кэша по URL. В настройках плагина во вкладке Advanced есть поле "Rejected URLs", куда можно добавить адреса страниц с формами.
- Использование куков для динамического кэширования. Если у пользователя есть куки, которые указывают на состояние формы (например, залогинен ли пользователь, или есть ли ошибки), можно исключить кэш или создавать отдельные кэши.
- Обработка AJAX-запросов вне кэша. Формы, использующие AJAX для отправки данных, обычно не зависят от кэша страниц, но иногда их ответы тоже можно кэшировать с учётом специфики.
Рассмотрим пример добавления исключения по URL через фильтр в functions.php:
function wpsupercache_reject_form_pages($urls) {
$urls[] = '/contact-form/'; // адрес страницы с формой
$urls[] = '/subscribe/';
return $urls;
}
add_filter('wp_cache_rejected_uri', 'wpsupercache_reject_form_pages');
Кэширование AJAX-ответов в формах с WP Super Cache
Многие современные формы используют AJAX, чтобы отправлять данные без перезагрузки страницы. В этом случае важно понимать, что WP Super Cache кэширует только статичные страницы, а AJAX-запросы обрабатываются отдельно.
Однако, если AJAX-запросы возвращают однотипный ответ, который не зависит от конкретного пользователя, их можно кэшировать на уровне сервера или с помощью плагина, чтобы снизить нагрузку.
Пример: кэширование AJAX-ответа с помощью transient API
Допустим, у вас есть AJAX-обработчик, который возвращает список популярных статей для формы подписки. Чтобы кэшировать ответ 10 минут, используйте transient:
add_action('wp_ajax_wpsupercache_get_popular_posts', 'wpsupercache_get_popular_posts');
add_action('wp_ajax_nopriv_wpsupercache_get_popular_posts', 'wpsupercache_get_popular_posts');
function wpsupercache_get_popular_posts() {
$cache_key = 'wpsupercache_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'
];
$query = new WP_Query($args);
$popular_posts = [];
foreach ($query->posts as $post) {
$popular_posts[] = ['title' => $post->post_title, 'link' => get_permalink($post)];
}
set_transient($cache_key, $popular_posts, 10 * MINUTE_IN_SECONDS);
}
wp_send_json_success($popular_posts);
}
Такой подход уменьшит количество запросов к базе при загрузке формы, сохранив при этом актуальность данных.
Реализация условного кэширования формы по ролям пользователей
Иногда формы должны отображаться по-разному для гостей и зарегистрированных пользователей. В WP Super Cache можно настроить кэширование с учётом ролей.
Можно запретить кэширование для авторизованных пользователей, чтобы форма всегда была свежей и индивидуальной. Для этого в настройках плагина достаточно включить "Don't cache pages for logged in users".
Пример программного исключения кэша для определённых ролей
function wpsupercache_no_cache_for_roles() {
if ( is_user_logged_in() ) {
$user = wp_get_current_user();
$roles_to_exclude = ['editor', 'administrator'];
if ( array_intersect($roles_to_exclude, $user->roles) ) {
return true; // не кэшировать
}
}
return false; // кэшируем
}
add_filter('wp_cache_no_cache', 'wpsupercache_no_cache_for_roles');
Данный код гарантирует, что пользователи с ролями редактора и администратора всегда увидят свежую форму без кэширования.
Интеграция WP Super Cache с плагинами форм и решения типичных проблем
Популярные плагины форм, например Contact Form 7, Gravity Forms, WPForms, иногда конфликтуют с кэшированием. Важно помнить:
- Используйте встроенные возможности плагина для AJAX-отправки — это уменьшит проблемы с кэшированием.
- Добавляйте страницы с формами в исключения из кэша.
- Проверяйте кэшированные страницы на наличие устаревших сообщений об ошибках или успехе.
Например, для Contact Form 7 можно добавить страницу с формой в исключения из кэша, либо использовать JavaScript для обновления сообщений после отправки.
Заключение по теме кэширования форм с WP Super Cache
Правильная настройка кэширования для форм — залог стабильной работы сайта и удобства пользователей. Используйте исключения по URL и ролям, кэшируйте AJAX-ответы с помощью transient API, и обязательно тестируйте результат после изменения настроек.
Для расширенной оптимизации можете рассмотреть плагин Clearfy Pro, который помогает управлять кэшем и оптимизацией в WordPress дополнительно.