В процессе разработки плагинов и тем для WordPress часто возникает задача реализовать постоянный AJAX запрос, который обновляет данные на странице в реальном времени или с минимальной задержкой. Однако стандартные методы AJAX в WordPress могут кэшироваться браузером или сервером, что приводит к устаревшим данным и некорректной работе функционала.
Почему AJAX запросы кэшируются и как это влияет на WordPress
По умолчанию браузеры могут кэшировать GET запросы, чтобы ускорить загрузку страниц, а некоторые серверы и CDN тоже применяют кэширование. В WordPress AJAX запросы обычно отправляются на admin-ajax.php с параметром action, и если запрос использует метод GET, есть риск, что ответ будет взят из кэша.
Это особенно критично, если вы обновляете динамические данные, например, статистику, результаты опросов или чаты, где важна своевременность информации. В таких случаях кэширование приводит к тому, что пользователи видят устаревшие данные, и функционал ломается.
Чтобы этого избежать, нужно использовать методы, которые отключают или минимизируют кэширование AJAX запросов.
Как правильно настроить постоянный AJAX запрос без кэширования в WordPress
Основные рекомендации для отключения кэширования AJAX запросов в WordPress:
- Использовать метод POST вместо GET.
- Добавлять уникальные параметры к URL, например, временную метку или случайное число.
- Устанавливать корректные HTTP заголовки, запрещающие кэширование.
- Обрабатывать запросы через
admin-ajax.phpс корректной регистрацией обработчиков.
Рассмотрим пример на базе собственного префикса функций wpplugin_ для наглядности.
Регистрация обработчика AJAX в WordPress
add_action('wp_ajax_wpplugin_get_data', 'wpplugin_get_data_callback');
add_action('wp_ajax_nopriv_wpplugin_get_data', 'wpplugin_get_data_callback');
function wpplugin_get_data_callback() {
// Отключаем кэширование ответа
nocache_headers();
// Генерируем данные для ответа
$data = array(
'time' => current_time('mysql'),
'random' => rand(1, 1000),
);
wp_send_json_success($data);
}В этом коде функция nocache_headers() отправляет HTTP заголовки, которые запрещают кэширование со стороны браузера и прокси. Это важный шаг для свежести данных.
JavaScript часть для постоянного AJAX запроса с отключением кэша
function wpplugin_fetchData() {
jQuery.ajax({
url: wpplugin_ajax_object.ajax_url,
method: 'POST', // POST для отключения кэширования
data: {
action: 'wpplugin_get_data',
nonce: wpplugin_ajax_object.nonce,
_t: new Date().getTime() // уникальный параметр, предотвращающий кэш
},
success: function(response) {
if(response.success) {
console.log('Данные:', response.data);
// обновляем UI
}
}
});
}
// Запуск запроса каждые 5 секунд
setInterval(wpplugin_fetchData, 5000);Обратите внимание, что мы используем метод POST и добавляем параметр _t с текущим временем, что дополнительно гарантирует уникальность запроса и предотвращает кэширование.
Как добавить безопасность запросов с помощью nonce в WPPlugin
Для защиты AJAX запросов в WordPress принято использовать nonce — одноразовые ключи безопасности. Они предотвращают сторонние атаки и обеспечивают авторизацию вызова.
В PHP-части плагина добавьте генерацию nonce и передачу его в JavaScript:
function wpplugin_enqueue_scripts() {
wp_enqueue_script('wpplugin-ajax', plugin_dir_url(__FILE__) . 'js/wpplugin-ajax.js', array('jquery'), null, true);
wp_localize_script('wpplugin-ajax', 'wpplugin_ajax_object', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpplugin_nonce')
));
}
add_action('wp_enqueue_scripts', 'wpplugin_enqueue_scripts');И в обработчике AJAX проверяйте nonce:
function wpplugin_get_data_callback() {
check_ajax_referer('wpplugin_nonce', 'nonce');
nocache_headers();
$data = array(
'time' => current_time('mysql'),
'random' => rand(1, 1000),
);
wp_send_json_success($data);
}Полезные плагины для управления кэшированием AJAX запросов в WordPress
Если вы не хотите писать код с нуля, можно использовать готовые решения, которые помогают управлять кэшированием и оптимизацией AJAX запросов.
- WP Rocket — популярный плагин для кэширования, который позволяет исключать из кэширования определённые AJAX запросы.
- Cache Enabler — легковесный плагин с настройками исключений для URL запросов, включая AJAX.
- Ajax Load More — плагин для бесконечной подгрузки контента с поддержкой различных настроек, включая управление кэшированием.
Настраивая эти плагины, убедитесь, что ваши AJAX запросы не попадают под кэширование, чтобы обеспечить их актуальность.
Выводы и рекомендации по постоянным AJAX запросам в WordPress
Чтобы сделать AJAX запросы в WordPress постоянными и избежать проблем с кэшированием, придерживайтесь следующих правил:
- Используйте метод POST вместо GET.
- Добавляйте уникальные параметры к запросам, например, временную метку.
- Используйте функцию
nocache_headers()в PHP для отправки заголовков, запрещающих кэш. - Обязательно защищайте запросы с помощью nonce.
- При использовании плагинов кэширования настраивайте исключения для AJAX URL.
Такой подход гарантирует, что пользователь всегда получает актуальные данные, а функционал вашего плагина или темы работает корректно и стабильно.