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

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

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

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

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

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

Основные шаги создания собственного виджета WordPress

Процесс создания виджета включает несколько важнейших этапов:

  • Определение класса виджета, наследуемого от WP_Widget.
  • Реализация конструкторов и основных методов: __construct(), widget(), form(), update().
  • Регистрация виджета в системе через хук widgets_init.
  • Добавление настроек и логики отображения.

Давайте рассмотрим каждый этап подробно с примерами.

Создаем класс виджета

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

class Wpplugin_Widget_Hello extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wpplugin_widget_hello',
            'Приветственный виджет Wpplugin',
            ['description' => 'Показывает простое приветствие']
        );
    }
}

Реализация метода widget() — вывод на сайт

Метод widget() отвечает за вывод содержимого виджета на сайт. В него передаются параметры для оформления и данные.

public function widget($args, $instance) {
    echo $args['before_widget'];
    $title = !empty($instance['title']) ? $instance['title'] : 'Приветствие';
    echo $args['before_title'] . apply_filters('widget_title', $title) . $args['after_title'];
    echo '<p>Добро пожаловать на сайт от Wpplugin.ru!</p>';
    echo $args['after_widget'];
}

Добавляем форму настройки виджета form()

Метод form() выводит форму настроек в админке. Мы добавим поле для заголовка.

public function form($instance) {
    $title = !empty($instance['title']) ? $instance['title'] : '';
    ?>
    <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
}

Обработка сохранения настроек update()

Метод update() сохраняет изменения, в нашем случае — заголовок.

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

Регистрация виджета в WordPress

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

function wpplugin_register_hello_widget() {
    register_widget('Wpplugin_Widget_Hello');
}
add_action('widgets_init', 'wpplugin_register_hello_widget');

После этого наш виджет появится в списке доступных в админке в разделе Внешний вид > Виджеты.

Расширение функционала: динамические данные и кастомный HTML

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

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

public function widget($args, $instance) {
    echo $args['before_widget'];
    $title = !empty($instance['title']) ? $instance['title'] : 'Приветствие';
    $message = !empty($instance['message']) ? $instance['message'] : 'Добро пожаловать!';
    echo $args['before_title'] . apply_filters('widget_title', $title) . $args['after_title'];
    echo '<p>' . esc_html($message) . '</p>';
    echo $args['after_widget'];
}

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

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

Популярные плагины для работы с виджетами и альтернативы кастомному коду

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

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

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

Советы по написанию виджетов и отладке

При разработке виджетов учитывайте следующие моменты:

  • Используйте префиксы в названиях классов и функций, чтобы избежать конфликтов (например, Wpplugin_).
  • Обрабатывайте и экранируйте данные, чтобы избежать XSS и других уязвимостей.
  • Тестируйте виджет с разными темами и версиями PHP/WordPress.
  • Документируйте код и добавляйте комментарии для удобства поддержки.

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

Как добавить поддержку виджетов в редактор Gutenberg WordPress
03.04.2026
Оптимизация загрузки изображений в WordPress с помощью WP Rocket
12.01.2026
Создание настраиваемой страницы настроек плагина WordPress с поддержкой AJAX
27.03.2026
Автоматический импорт продуктов из Excel в WooCommerce на WordPress
16.12.2025
Как правильно удалить и отключить плагин в WordPress без ошибок
26.12.2025