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

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

Что такое виджет в WordPress и зачем создавать собственный

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

Создание собственного виджета даёт вам полный контроль над его поведением и внешним видом. Это удобно, если стандартных возможностей недостаточно или нужно добавить уникальный функционал, который соответствует специфике вашего сайта.

Также собственные виджеты позволяют создавать повторно используемые компоненты, которые могут быть легко настроены через интерфейс администратора WordPress.

Основы создания виджета: класс WP_Widget и его методы

Для создания виджета в WordPress необходимо наследовать встроенный класс WP_Widget. Этот класс содержит базовую логику для отображения, сохранения настроек и административного интерфейса виджета.

Обязательными для переопределения являются следующие методы:

  • __construct() — инициализация виджета, установка его имени и описания.
  • widget($args, $instance) — вывод содержимого виджета на сайте.
  • form($instance) — форма настроек виджета в административной панели.
  • update($new_instance, $old_instance) — обработка и сохранение настроек.

Вот минимальный шаблон класса виджета:

class ExpertReview_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'expertreview_widget',
            'ExpertReview Виджет',
            array('description' => 'Пример собственного виджета')
        );
    }

    public function widget($args, $instance) {
        echo $args['before_widget'];
        echo '<p>Привет от ExpertReview!</p>';
        echo $args['after_widget'];
    }

    public function form($instance) {
        echo '<p>Настройки отсутствуют</p>';
    }

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

После создания класса необходимо зарегистрировать виджет с помощью хука widgets_init:

function expertreview_register_widget() {
    register_widget('ExpertReview_Widget');
}
add_action('widgets_init', 'expertreview_register_widget');

Пример: создание виджета с настраиваемым заголовком и текстом

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

class ExpertReview_Custom_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'expertreview_custom_widget',
            'ExpertReview Текстовый виджет',
            array('description' => 'Виджет с настраиваемым заголовком и текстом')
        );
    }

    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'];
        }
        if (!empty($instance['text'])) {
            echo '<p>' . esc_html($instance['text']) . '</p>';
        }
        echo $args['after_widget'];
    }

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

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

Такой виджет позволит пользователю темы или администратору гибко управлять содержимым блока без правки кода.

Дополнительные советы: расширяем функционал и используем плагины

Если вы хотите создавать более сложные виджеты, можно подключать внешние библиотеки, использовать AJAX для динамического обновления контента или интегрироваться с REST API.

Для упрощения разработки можно использовать плагины-генераторы виджетов, например:

  • Widget Options — расширяет стандартные возможности виджетов, добавляя условия отображения и стили.
  • Custom Sidebars — позволяет создавать новые области для виджетов, что удобно для сложных тем.
  • SiteOrigin Widgets Bundle — набор готовых виджетов и удобный конструктор.

Пример AJAX-виджета с динамическим контентом

Для примера, как можно использовать AJAX внутри виджета, рассмотрим простой код, который подгружает случайную цитату по кнопке:

class ExpertReview_Ajax_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct('expertreview_ajax_widget', 'ExpertReview AJAX виджет');
        add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
        add_action('wp_ajax_expertreview_get_quote', array($this, 'ajax_get_quote'));
        add_action('wp_ajax_nopriv_expertreview_get_quote', array($this, 'ajax_get_quote'));
    }

    public function enqueue_scripts() {
        wp_enqueue_script('expertreview-ajax', plugin_dir_url(__FILE__) . 'expertreview-ajax.js', array('jquery'), null, true);
        wp_localize_script('expertreview-ajax', 'expertreview_ajax_obj', array(
            'ajax_url' => admin_url('admin-ajax.php')
        ));
    }

    public function widget($args, $instance) {
        echo $args['before_widget'];
        echo '<div id="expertreview-quote">Нажмите кнопку для получения цитаты.</div>';
        echo '<button id="expertreview-quote-btn">Получить цитату</button>';
        echo $args['after_widget'];
    }

    public function ajax_get_quote() {
        $quotes = array(
            'Будь изменением, которое хочешь видеть в мире. - Махатма Ганди',
            'Код — это поэзия для программиста.',
            'Не бойтесь ошибки — боясь не учиться.',
            'Простота — высшая степень изысканности. - Леонардо да Винчи'
        );
        wp_send_json_success($quotes[array_rand($quotes)]);
    }

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

Фронтенд-скрипт expertreview-ajax.js:

jQuery(document).ready(function($){
    $('#expertreview-quote-btn').on('click', function(){
        $.post(expertreview_ajax_obj.ajax_url, { action: 'expertreview_get_quote' }, function(response){
            if(response.success) {
                $('#expertreview-quote').text(response.data);
            }
        });
    });
});

Заключение по созданию собственных виджетов

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

Рекомендуется всегда внимательно обрабатывать пользовательский ввод, использовать функции безопасности WordPress и тестировать виджеты на разных темах и версиях CMS.

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

Как удалить автоматические ревизии в WordPress для оптимизации базы данных
30.01.2026
Как реализовать двойной вызов функций в WordPress
27.02.2026
Как настроить отложенный запуск AJAX запросов в WordPress для оптимизации производительности
30.03.2026
Как автоматизировать просмотр отзывов в WordPress с помощью WPRemark
10.03.2026
Как создать обязательное поле в форме WordPress с помощью WPRemark
12.04.2026