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

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

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

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

Почему создавать собственный виджет?

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

Создание собственного виджета — это расширение возможностей вашего сайта и способ сделать админку удобнее.

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

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

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

Регистрация виджета происходит через хук widgets_init с помощью функции register_widget().

Пример создания виджета wpmark_simple_widget

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

class WPMark_Simple_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wpmark_simple_widget',
            __('WPMark Приветственный виджет', 'wpmark'),
            ['description' => __('Простой виджет для отображения приветствия', 'wpmark')]
        );
    }

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

    public function form($instance) {
        $title = $instance['title'] ?? '';
        $message = $instance['message'] ?? '';
        ?>
        <p>
            <label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php _e('Заголовок:', 'wpmark'); ?></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')); ?>"><?php _e('Сообщение:', 'wpmark'); ?></label>
            <textarea class="widefat" 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 = [];
        $instance['title'] = sanitize_text_field($new_instance['title']);
        $instance['message'] = sanitize_textarea_field($new_instance['message']);
        return $instance;
    }
}

function wpmark_register_simple_widget() {
    register_widget('WPMark_Simple_Widget');
}
add_action('widgets_init', 'wpmark_register_simple_widget');

Этот код необходимо добавить в файл плагина или файл functions.php вашей темы. После этого в админке появится новый виджет с настройками.

Как расширить виджет: дополнительные настройки и обработка данных

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

Например, добавим чекбокс, который будет включать или выключать отображение сообщения:

public function form($instance) {
    $title = $instance['title'] ?? '';
    $message = $instance['message'] ?? '';
    $show_message = isset($instance['show_message']) ? (bool)$instance['show_message'] : true;
    ?>
    <p>
        <label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php _e('Заголовок:', 'wpmark'); ?></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')); ?>"><?php _e('Сообщение:', 'wpmark'); ?></label>
        <textarea class="widefat" 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>
        <input class="checkbox" type="checkbox" <?php checked($show_message); ?> id="<?php echo esc_attr($this->get_field_id('show_message')); ?>" name="<?php echo esc_attr($this->get_field_name('show_message')); ?>" />
        <label for="<?php echo esc_attr($this->get_field_id('show_message')); ?>"><?php _e('Показывать сообщение', 'wpmark'); ?></label>
    </p>
    <?php
}

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

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

    if (!empty($title)) {
        echo $args['before_title'] . esc_html($title) . $args['after_title'];
    }
    if ($show_message) {
        echo '<p>' . esc_html($message) . '</p>';
    }
    echo $args['after_widget'];
}

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

Полезные плагины для работы с виджетами в WordPress

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

  • Widget Options — расширенные настройки виджетов: управление отображением, видимость по страницам, устройствам и ролям пользователей.
  • Custom Sidebars – Dynamic Widget Area Manager — позволяет создавать собственные области виджетов и управлять ими.
  • SiteOrigin Widgets Bundle — набор виджетов с расширенными возможностями и визуальным редактором.

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

Практические рекомендации и советы

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

  • Используйте функции WordPress для безопасности: esc_html(), sanitize_text_field() и другие для обработки данных.
  • Соблюдайте стандарты кодирования WordPress для совместимости и поддержки.
  • Тестируйте виджет в разных темах и на разных устройствах.
  • Добавляйте локализацию, чтобы сделать виджет удобным для многоязычных сайтов.
  • Оптимизируйте вывод, чтобы не замедлять загрузку страниц.

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

Как создать собственный фильтровый плагин WordPress с примерами кода
05.01.2026
Как автоматизировать создание и удаление временных файлов в WordPress
23.02.2026
WordPress: как использовать REST API для авторизации пользователей
15.01.2026
Как удалить и заблокировать загрузочные файлы в WordPress
05.02.2026
Автоматический импорт продуктов в WooCommerce через CSV: пошаговое руководство
01.01.2026