Как создать автоматические виджеты в WordPress с поддержкой AJAX

В современных проектах на 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.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
WooCommerce: автоматическое изменение цены товара при обновлении заказа
18.05.2026
Как добавить AJAX в формы WordPress без плагинов: практическое руководство
25.11.2025
Как создать автоматическую транслитерацию заголовков в WordPress
25.01.2026
Как установить и настроить автоматическую транслитерацию URL в WordPress
27.02.2026
WooCommerce: автоматическое отключение неактивных способов оплаты
11.05.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее