Как создать своё виджет в WordPress с примером кода

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

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

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

Собственный виджет позволяет:

  • Добавить уникальный функционал, например, вывод произвольных данных из базы.
  • Упростить администрирование и настройку через настройки виджета в админке.
  • Интегрироваться с другими плагинами и API.

Далее рассмотрим пример создания простого виджета, который выводит приветствие и настраиваемое сообщение.

Создание класса виджета: базовая структура и регистрация

В WordPress виджеты создаются через классы, которые наследуются от WP_Widget. Основные методы, которые нужно реализовать:

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

Пример простого виджета для wpturbo.ru:

class WPTurbo_Widget_Greeting extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wpturbo_greeting',
            'WPTurbo: Приветствие',
            array('description' => 'Простой виджет с приветствием')
        );
    }
    
    public function widget($args, $instance) {
        echo $args['before_widget'];
        $title = apply_filters('widget_title', $instance['title']);
        $message = !empty($instance['message']) ? $instance['message'] : 'Добро пожаловать на сайт!';

        if (!empty($title)) {
            echo $args['before_title'] . $title . $args['after_title'];
        }

        echo '<p>' . esc_html($message) . '</p>';
        echo $args['after_widget'];
    }

    public function form($instance) {
        $title = isset($instance['title']) ? $instance['title'] : 'Приветствие';
        $message = isset($instance['message']) ? $instance['message'] : '';
        ?>
        <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('message')); ?>">Сообщение:</label>
            <textarea class="widefat" rows="4" id="<?php echo esc_attr($this->get_field_id('message')); ?>" name="<?php echo esc_attr($this->get_field_name('message')); ?>"><?php echo esc_textarea($message); ?></textarea>
        </p>
        <?php
    }

    public function update($new_instance, $old_instance) {
        $instance = array();
        $instance['title'] = sanitize_text_field($new_instance['title']);
        $instance['message'] = sanitize_textarea_field($new_instance['message']);
        return $instance;
    }
}

// Регистрируем виджет
function wpturbo_register_greeting_widget() {
    register_widget('WPTurbo_Widget_Greeting');
}
add_action('widgets_init', 'wpturbo_register_greeting_widget');

Этот код создаёт виджет с двумя настраиваемыми полями: заголовок и сообщение. Администратор может изменять их в разделе «Виджеты» в админке.

Расширение виджета: как добавить поддержку настроек и стилей

Чтобы виджет выглядел лучше и был удобнее, можно добавить подключение CSS и более сложные настройки. Например, добавим выбор цвета текста и выводим сообщение с этим цветом.

Дополните класс следующими изменениями:

public function widget($args, $instance) {
    echo $args['before_widget'];
    $title = apply_filters('widget_title', $instance['title']);
    $message = !empty($instance['message']) ? $instance['message'] : 'Добро пожаловать на сайт!';
    $color = !empty($instance['color']) ? $instance['color'] : '#000000';

    if (!empty($title)) {
        echo $args['before_title'] . $title . $args['after_title'];
    }

    echo '<p style="color:' . esc_attr($color) . '">' . esc_html($message) . '</p>';
    echo $args['after_widget'];
}

public function form($instance) {
    $title = isset($instance['title']) ? $instance['title'] : 'Приветствие';
    $message = isset($instance['message']) ? $instance['message'] : '';
    $color = isset($instance['color']) ? $instance['color'] : '#000000';
    ?>
    <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('message')); ?>">Сообщение:</label>
        <textarea class="widefat" rows="4" id="<?php echo esc_attr($this->get_field_id('message')); ?>" name="<?php echo esc_attr($this->get_field_name('message')); ?>"><?php echo esc_textarea($message); ?></textarea>
    </p>
    <p>
        <label for="<?php echo esc_attr($this->get_field_id('color')); ?>">Цвет текста:</label>
        <input class="widefat" id="<?php echo esc_attr($this->get_field_id('color')); ?>" name="<?php echo esc_attr($this->get_field_name('color')); ?>" type="color" value="<?php echo esc_attr($color); ?>" />
    </p>
    <?php
}

public function update($new_instance, $old_instance) {
    $instance = array();
    $instance['title'] = sanitize_text_field($new_instance['title']);
    $instance['message'] = sanitize_textarea_field($new_instance['message']);
    $instance['color'] = sanitize_hex_color($new_instance['color']);
    return $instance;
}

Добавление поля с выбором цвета значительно расширит возможности настройки виджета без необходимости править код темы.

Использование плагина Clearfy Pro для управления виджетами и производительностью

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

Советы по безопасности и производительности для собственных виджетов

При создании виджетов важно соблюдать базовые правила безопасности и оптимизации:

  • Всегда используйте функции экранирования данных: esc_html, esc_attr, sanitize_text_field и др.
  • Минимизируйте запросы к базе данных внутри виджета, чтобы не замедлять загрузку страниц.
  • Если виджет использует внешние API или сложную логику, подумайте о кэшировании результата с помощью транзиентов.
  • Подключайте стили и скрипты только тогда, когда виджет реально выводится на странице.

Например, для подключения CSS только при выводе виджета можно использовать хук wp_enqueue_scripts с проверкой условий.

Подключение CSS для виджета

function wpturbo_enqueue_widget_styles() {
    if (is_active_widget(false, false, 'wpturbo_greeting', true)) {
        wp_enqueue_style('wpturbo-widget-style', plugins_url('css/widget-style.css', __FILE__));
    }
}
add_action('wp_enqueue_scripts', 'wpturbo_enqueue_widget_styles');

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

Заключение: создание виджетов как инструмент расширения функционала WordPress

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

Рекомендуем экспериментировать с настройками и расширять виджет, добавляя поддержку скриптов, стилей и интеграцию с API. Для управления производительностью используйте инструменты вроде Clearfy Pro, чтобы сайт работал быстро и стабильно даже при большом количестве виджетов.

Удаление неиспользуемых вариаций товаров в WooCommerce через код
14.05.2026
WooCommerce: автоматическое удаление неиспользуемых вариаций товаров через код
26.05.2026
Как создать своё виджет в WordPress с примером кода
07.01.2026
Как использовать REST API в WordPress для создания настроек
26.11.2025
Удаление неиспользуемых вариаций товаров в WooCommerce без плагинов
09.05.2026