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

Зачем нужен виджет с поддержкой AJAX в WordPress

Виджеты — важная часть функционала WordPress, позволяющая добавлять разнообразный контент в сайдбары и другие области темы. Однако стандартные виджеты обновляются только при перезагрузке страницы, что не всегда удобно, особенно если нужно динамически изменять содержимое без лишних задержек.

Использование AJAX позволяет обновлять содержимое виджета «на лету», без перезагрузки страницы, улучшая UX и снижая нагрузку на сервер. Это востребовано для виджетов с интерактивными элементами, фильтрами, счетчиками, формами и т.п.

В этой статье мы подробно разберем, как создать собственный виджет WordPress с поддержкой AJAX, рассмотрим регистрацию скриптов, обработку AJAX-запросов и пример динамического обновления данных.

Создание базового виджета WordPress

Начнем с создания простого класса виджета. Вставьте следующий код в файл своего плагина или в functions.php темы:

class Wproot_Custom_Ajax_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wproot_custom_ajax_widget',
            'WProot AJAX Виджет',
            ['description' => 'Виджет с поддержкой AJAX']
        );
    }

    public function widget($args, $instance) {
        echo $args['before_widget'];
        echo '<div id="wproot-ajax-widget-content">';
        echo '<button id="wproot-refresh-btn">Обновить данные</button>';
        echo '<div id="wproot-data">Загрузка...</div>';
        echo '</div>';
        echo $args['after_widget'];
    }

    public function form($instance) {
        echo '<p>Настроек пока нет.</p>';
    }

    public function update($new_instance, $old_instance) {
        return $old_instance;
    }
}

function wproot_register_custom_ajax_widget() {
    register_widget('Wproot_Custom_Ajax_Widget');
}
add_action('widgets_init', 'wproot_register_custom_ajax_widget');

Этот код создает базовый виджет с кнопкой и блоком для вывода динамических данных.

Подключение скрипта и локализация AJAX URL

Чтобы отправлять AJAX-запросы, нужно подключить JavaScript и передать ему URL для обработки запросов. Добавим функцию подключения скрипта:

function wproot_enqueue_ajax_widget_scripts() {
    wp_enqueue_script('wproot-ajax-widget', get_template_directory_uri() . '/js/wproot-ajax-widget.js', ['jquery'], null, true);
    wp_localize_script('wproot-ajax-widget', 'wproot_ajax_params', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wproot_ajax_nonce')
    ]);
}
add_action('wp_enqueue_scripts', 'wproot_enqueue_ajax_widget_scripts');

Обратите внимание, что скрипт подключается из папки темы в файле js/wproot-ajax-widget.js. В этом файле будет описана логика AJAX.

JavaScript для отправки AJAX-запроса

Создайте файл js/wproot-ajax-widget.js и добавьте следующий код:

jQuery(document).ready(function($) {
    function wproot_load_data() {
        $('#wproot-data').text('Загрузка...');
        $.ajax({
            url: wproot_ajax_params.ajax_url,
            type: 'POST',
            data: {
                action: 'wproot_refresh_widget',
                nonce: wproot_ajax_params.nonce
            },
            success: function(response) {
                if(response.success) {
                    $('#wproot-data').html(response.data);
                } else {
                    $('#wproot-data').text('Ошибка загрузки данных');
                }
            },
            error: function() {
                $('#wproot-data').text('Ошибка AJAX запроса');
            }
        });
    }

    $('#wproot-refresh-btn').on('click', function(e) {
        e.preventDefault();
        wproot_load_data();
    });

    // Автозагрузка при загрузке страницы
    wproot_load_data();
});

Этот скрипт по клику на кнопку и при загрузке страницы отправляет AJAX-запрос на сервер и выводит полученные данные.

Обработка AJAX-запроса на сервере

Теперь создадим серверный обработчик в functions.php или плагине:

function wproot_ajax_refresh_widget() {
    check_ajax_referer('wproot_ajax_nonce', 'nonce');

    // Пример динамических данных — текущее время сервера
    $current_time = current_time('H:i:s');
    $message = 'Текущее серверное время: ' . esc_html($current_time);

    wp_send_json_success($message);
}
add_action('wp_ajax_wproot_refresh_widget', 'wproot_ajax_refresh_widget');
add_action('wp_ajax_nopriv_wproot_refresh_widget', 'wproot_ajax_refresh_widget');

Вызывается функция check_ajax_referer для проверки безопасности запроса. После этого формируется ответ с текущим временем сервера и отправляется клиенту.

Улучшение безопасности и производительности

При разработке виджетов с AJAX важно учитывать несколько важных моментов:

  • Проверка nonce: Обязательно проверяйте nonce в обработчиках AJAX, чтобы предотвратить CSRF-атаки.
  • Разграничение доступа: Если данные виджета должны быть доступны только авторизованным пользователям, используйте wp_ajax_ хук без _nopriv.
  • Кэширование: Если данные тяжелые для формирования, используйте Transients API для кэширования результата и уменьшения нагрузки на сервер.
  • Минимизация скриптов: Подключайте скрипты только там, где нужно — через условные проверки или wp_enqueue_script с зависимостями.

Пример расширения виджета с пользовательскими настройками

Добавим в форму виджета настройку заголовка, которую можно менять в админке:

public function form($instance) {
    $title = !empty($instance['title']) ? $instance['title'] : 'Мой AJAX виджет';
    ?>
    <p>
        <label for="<?php echo $this->get_field_id('title'); ?>">Заголовок:</label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" />
    </p>
    <?php
}

public function update($new_instance, $old_instance) {
    $instance = [];
    $instance['title'] = (!empty($new_instance['title'])) ? sanitize_text_field($new_instance['title']) : '';
    return $instance;
}

public function widget($args, $instance) {
    echo $args['before_widget'];
    if (!empty($instance['title'])) {
        echo $args['before_title'] . apply_filters('widget_title', $instance['title']) . $args['after_title'];
    }
    echo '<div id="wproot-ajax-widget-content">';
    echo '<button id="wproot-refresh-btn">Обновить данные</button>';
    echo '<div id="wproot-data">Загрузка...</div>';
    echo '</div>';
    echo $args['after_widget'];
}

Это позволит гибко управлять заголовком виджета из админки.

Плагины для расширения функционала AJAX-виджетов

Если хочется ускорить разработку и получить готовые решения, можно обратить внимание на следующие плагины:

  • WPRemark — расширяет возможности работы с комментариями и виджетами с AJAX.
  • ABC Pagination — удобная AJAX-пагинация для виджетов и списков записей.
  • My Popup — создание интерактивных окон с поддержкой AJAX-запросов.

Эти плагины помогут создавать динамичные и интерактивные виджеты без глубоких знаний JavaScript.

Итоги

Создание собственного виджета с поддержкой AJAX в WordPress — это отличный способ повысить интерактивность сайта и улучшить UX. Следуя описанному алгоритму, вы сможете реализовать динамические виджеты, которые обновляют данные без перезагрузки страницы, с надежной защитой и настройками.

Используйте проверку nonce, оптимизируйте запросы и подключайте скрипты только там, где это необходимо. А для ускорения разработки можно применять готовые плагины из каталога WPSHOP.

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

⭐⭐⭐⭐⭐
Как избежать проблем с кешем в WordPress: практическое руководство
22.03.2026
Как создать автоматический подпись в email, отправляемых через WordPress
12.02.2026
Создать динамический список постов в WordPress с AJAX: практическое руководство
30.01.2026
Как создать уникальный виджет WordPress с настройками и примерами кода
28.11.2025
Как использовать Transients в WordPress для кэширования данных
09.02.2026
×
WordPress
прокачай свой сайт!

-20% на премиум темы и плагины

Сделай апгрейд сайта ⋙