В современных проектах на WordPress часто возникает задача сделать виджеты, которые обновляют свой контент динамически, без полной перезагрузки страницы. Это улучшает пользовательский опыт и ускоряет работу сайта. В этой статье мы подробно рассмотрим, как создать такой автоматический виджет с использованием AJAX, который будет подгружать и обновлять данные по событию или по таймеру.
Почему автоматические виджеты с AJAX полезны для WordPress
Стандартные виджеты WordPress выводят статический контент, который обновляется только при загрузке страницы. Но если вы хотите, чтобы в сайдбаре, футере или в любой другой области отображалась, например, актуальная статистика, последние комментарии, обновления курса валют или любые данные, которые меняются часто, AJAX — оптимальное решение.
Использование AJAX для автоматического обновления виджета позволяет:
- Снизить нагрузку на сервер, обновляя только часть страницы.
- Улучшить взаимодействие с пользователем — контент меняется без перезагрузки.
- Реализовать динамические функции, которые сложно сделать с помощью PHP без JS.
Однако важно грамотно реализовать код, чтобы не создавать излишнюю нагрузку и обеспечить безопасность.
Создаем базовый автоматический виджет с AJAX
Шаг 1. Создаем класс виджета
Для начала создадим простой виджет, который будет выводить блок с текущим временем, обновляемым раз в 10 секунд. Вот базовый каркас класса виджета с приставкой cyrtolat_ в функциях для уникальности:
class Cyrtolat_Ajax_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'cyrtolat_ajax_widget',
'Автоматический AJAX виджет'
);
}
public function widget($args, $instance) {
echo $args['before_widget'];
echo '<div id="cyrtolat-ajax-widget-content">Загрузка...</div>';
echo $args['after_widget'];
}
}Зарегистрируем этот виджет в хуке widgets_init:
function cyrtolat_register_ajax_widget() {
register_widget('Cyrtolat_Ajax_Widget');
}
add_action('widgets_init', 'cyrtolat_register_ajax_widget');Шаг 2. Подключаем скрипты и локализуем AJAX URL
Для работы AJAX нужно добавить JavaScript на фронтенд. Сделаем это через enqueue скрипт и передадим URL обработчика:
function cyrtolat_enqueue_scripts() {
wp_enqueue_script('cyrtolat-ajax-widget-script', get_template_directory_uri() . '/js/cyrtolat-ajax-widget.js', ['jquery'], null, true);
wp_localize_script('cyrtolat-ajax-widget-script', 'cyrtolat_ajax_obj', [
'ajax_url' => admin_url('admin-ajax.php')
]);
}
add_action('wp_enqueue_scripts', 'cyrtolat_enqueue_scripts');Шаг 3. Создаем обработчик AJAX в PHP
Обработчик будет возвращать текущее время сервера в формате JSON. Добавим функции для авторизованных и неавторизованных пользователей:
function cyrtolat_ajax_get_time() {
wp_send_json_success(['time' => current_time('H:i:s')]);
}
add_action('wp_ajax_cyrtolat_get_time', 'cyrtolat_ajax_get_time');
add_action('wp_ajax_nopriv_cyrtolat_get_time', 'cyrtolat_ajax_get_time');Шаг 4. Пишем JavaScript для обновления виджета
В файле js/cyrtolat-ajax-widget.js создадим код, который будет делать AJAX-запросы каждые 10 секунд и обновлять содержимое виджета:
jQuery(document).ready(function($) {
function cyrtolat_update_widget() {
$.ajax({
url: cyrtolat_ajax_obj.ajax_url,
type: 'POST',
data: {
action: 'cyrtolat_get_time'
},
success: function(response) {
if(response.success) {
$('#cyrtolat-ajax-widget-content').text('Текущее время: ' + response.data.time);
}
}
});
}
cyrtolat_update_widget(); // первый вызов
setInterval(cyrtolat_update_widget, 10000); // обновление каждые 10 секунд
});Расширяем функционал: автоматическое обновление контента по событию
Помимо таймера, можно обновлять виджет по событиям — например, при клике пользователя на кнопку. В виджете добавим кнопку:
public function widget($args, $instance) {
echo $args['before_widget'];
echo '<div id="cyrtolat-ajax-widget-content">Нажмите кнопку для обновления</div>';
echo '<button id="cyrtolat-refresh-btn">Обновить время</button>';
echo $args['after_widget'];
}Изменим JS для обработки клика:
jQuery(document).ready(function($) {
function cyrtolat_update_widget() {
$.post(cyrtolat_ajax_obj.ajax_url, {action: 'cyrtolat_get_time'}, function(response) {
if(response.success) {
$('#cyrtolat-ajax-widget-content').text('Текущее время: ' + response.data.time);
}
});
}
$('#cyrtolat-refresh-btn').on('click', function() {
cyrtolat_update_widget();
});
});Практические советы по оптимизации и безопасности AJAX-виджетов
Используйте nonce для защиты AJAX-запросов
Для защиты от CSRF добавьте nonce в локализацию скрипта и проверяйте его в обработчике:
function cyrtolat_enqueue_scripts() {
wp_enqueue_script('cyrtolat-ajax-widget-script', get_template_directory_uri() . '/js/cyrtolat-ajax-widget.js', ['jquery'], null, true);
wp_localize_script('cyrtolat-ajax-widget-script', 'cyrtolat_ajax_obj', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('cyrtolat_ajax_nonce')
]);
}
function cyrtolat_ajax_get_time() {
check_ajax_referer('cyrtolat_ajax_nonce', 'nonce');
wp_send_json_success(['time' => current_time('H:i:s')]);
}В JS добавьте nonce в запрос:
data: {
action: 'cyrtolat_get_time',
nonce: cyrtolat_ajax_obj.nonce
}Кэширование данных для снижения нагрузки
Если данные не требуют обновления каждую секунду, используйте transient API для хранения результата, например, обновлять время не чаще раза в минуту.
function cyrtolat_ajax_get_time() {
check_ajax_referer('cyrtolat_ajax_nonce', 'nonce');
$time = get_transient('cyrtolat_current_time');
if(false === $time) {
$time = current_time('H:i:s');
set_transient('cyrtolat_current_time', $time, 60); // кэш 60 секунд
}
wp_send_json_success(['time' => $time]);
}Использование плагинов для расширенного функционала AJAX-виджетов
Если вы хотите создавать сложные AJAX-виджеты без большого объема кода, обратите внимание на плагины, которые облегчают работу с AJAX и виджетами, например, WPRemark. Он позволяет создавать кастомные виджеты с AJAX-поддержкой и настраивать их через интерфейс без глубоких знаний кода.
Подводим итоги и рекомендации
Автоматические виджеты с поддержкой AJAX — мощный инструмент для динамичных сайтов на WordPress. Правильная реализация через собственные классы, обработчики AJAX и JavaScript обеспечивает гибкость и производительность. Обязательно учитывайте безопасность и оптимизацию, используя nonce и кэширование.
Такой подход применим для вывода новостей, курсов валют, погоды, пользовательских уведомлений и других живых данных. Если вы ищете готовые решения с более сложным функционалом, рекомендуем ознакомиться с плагинами из каталога WPSHOP.