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

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

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

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

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

  • Добавить уникальный функционал, специфичный для вашего проекта;
  • Обеспечить удобное управление дополнительным контентом через админку WordPress;
  • Избавиться от необходимости использовать сторонние плагины, уменьшая нагрузку на сайт;
  • Повысить гибкость и масштабируемость вашего решения.

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

Шаг 1. Регистрация и базовая структура виджета

Для начала создадим класс виджета, который будет наследоваться от WP_Widget. В нем определим конструктор, форму настройки и вывод на фронтенде.

class WPEducation_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wpeducation_widget',
            __('WPEducation: Простой виджет', 'wpeducation'),
            ['description' => __('Пример собственного виджета для WPEducation', 'wpeducation')]
        );
    }

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

    public function form($instance) {
        $title = !empty($instance['title']) ? $instance['title'] : __('Заголовок', 'wpeducation');
        $text = !empty($instance['text']) ? $instance['text'] : '';
        ?>
        <p>
            <label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php _e('Заголовок:'); ?></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')); ?>"><?php _e('Текст:'); ?></label>
            <textarea class="widefat" 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 = [];
        $instance['title'] = sanitize_text_field($new_instance['title']);
        $instance['text'] = sanitize_textarea_field($new_instance['text']);
        return $instance;
    }
}

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

function wpeducation_register_widget() {
    register_widget('WPEducation_Widget');
}
add_action('widgets_init', 'wpeducation_register_widget');

Шаг 2. Настройка и использование собственного виджета

После регистрации виджета зайдите в панель администратора WordPress в раздел Внешний вид > Виджеты. Там вы увидите новый виджет «WPEducation: Простой виджет». Его можно перетащить в любую область виджетов темы.

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

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

Шаг 3. Расширение функционала: добавляем поле выбора цвета

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

Добавим новое поле в форму настройки:

public function form($instance) {
    $title = !empty($instance['title']) ? $instance['title'] : __('Заголовок', 'wpeducation');
    $text = !empty($instance['text']) ? $instance['text'] : '';
    $bg_color = !empty($instance['bg_color']) ? $instance['bg_color'] : '#ffffff';
    ?>
    <p>
        <label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php _e('Заголовок:'); ?></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')); ?>"><?php _e('Текст:'); ?></label>
        <textarea class="widefat" 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>
    <p>
        <label for="<?php echo esc_attr($this->get_field_id('bg_color')); ?>"><?php _e('Цвет фона:'); ?></label>
        <input class="widefat" id="<?php echo esc_attr($this->get_field_id('bg_color')); ?>" name="<?php echo esc_attr($this->get_field_name('bg_color')); ?>" type="color" value="<?php echo esc_attr($bg_color); ?>">
    </p>
    <?php
}

Обновим методы сохранения и вывода:

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

public function widget($args, $instance) {
    echo $args['before_widget'];
    $bg_color = !empty($instance['bg_color']) ? $instance['bg_color'] : '#ffffff';
    echo '<div style="background-color:' . esc_attr($bg_color) . '; padding: 10px;">';
    if (!empty($instance['title'])) {
        echo $args['before_title'] . apply_filters('widget_title', $instance['title']) . $args['after_title'];
    }
    echo '<p>' . esc_html($instance['text']) . '</p>';
    echo '</div>';
    echo $args['after_widget'];
}

Популярные плагины для расширения виджетов

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

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

Однако создание собственного виджета даёт полный контроль и оптимизацию под конкретные задачи.

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

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

  • Используйте функцию esc_html() и другие функции для экранирования данных, чтобы обеспечить безопасность;
  • Правильно реализуйте методы form(), update() и widget() согласно стандартам WordPress;
  • Не забывайте о локализации строк через __() и _e() для поддержки многоязычности;
  • Проверяйте совместимость с темой и другими плагинами;
  • Пишите чистый и документированный код, чтобы облегчить поддержку.

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

Создание кастомных REST API эндпоинтов в WordPress: подробный гайд
24.11.2025
Как установить лимит на регистрацию пользователей в WordPress
21.02.2026
Как автоматизировать управление ролями в WordPress по значениям метаполей пользователя
04.04.2026
Как создать динамическую почтовую рассылку в WordPress
21.03.2026
WooCommerce: установка минимального заказа с автоматическим отключением способов оплаты
24.05.2026