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

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

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

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

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

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

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

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

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

Рассмотрим каждый из них подробнее и создадим пример рабочего виджета.

Метод __construct() – регистрация виджета

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

class WPDir_Custom_Widget extends WP_Widget { public function __construct() { parent::__construct( 'wpdir_custom_widget', 'WPDir: Кастомный виджет', array('description' => 'Пример кастомного виджета для WPDir сайта') ); } }

Метод widget() – вывод виджета на сайте

Этот метод отвечает за отображение содержимого виджета на сайте. В параметры передаются аргументы темы для обёрток и сохранённые настройки виджета. Важно использовать echo $args['before_widget'] и $args['after_widget'] для корректного оформления.

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>Привет из кастомного виджета WPDir!</p>'; echo $args['after_widget']; }

Метод form() – форма настроек в админке

Здесь выводится HTML форма для настройки виджета. Все поля должны быть связаны с параметрами $instance, а имена должны использовать $this->get_field_name() и $this->get_field_id() для правильного сохранения.

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() – сохранение настроек виджета

Обрабатывает данные из формы, проверяет их и возвращает обновлённый массив значений, которые сохранятся в базе.

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

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

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

function wpdir_register_custom_widget() { register_widget('WPDir_Custom_Widget'); } add_action('widgets_init', 'wpdir_register_custom_widget');

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

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

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

class WPDir_Advanced_Widget extends WP_Widget { public function __construct() { parent::__construct('wpdir_advanced_widget', 'WPDir: Расширенный виджет', 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['description'])) { echo '<p>' . esc_html($instance['description']) . '</p>'; } echo $args['after_widget']; } public function form($instance) { $title = !empty($instance['title']) ? $instance['title'] : ''; $description = !empty($instance['description']) ? $instance['description'] : ''; ?> <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('description'); ?>">Описание:</label> <textarea class="widefat" id="<?php echo $this->get_field_id('description'); ?>" name="<?php echo $this->get_field_name('description'); ?>" rows="3"><?php echo esc_textarea($description); ?></textarea> </p> <?php } public function update($new_instance, $old_instance) { $instance = array(); $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : ''; $instance['description'] = (!empty($new_instance['description'])) ? strip_tags($new_instance['description']) : ''; return $instance; } } function wpdir_register_advanced_widget() { register_widget('WPDir_Advanced_Widget'); } add_action('widgets_init', 'wpdir_register_advanced_widget');

Советы по разработке виджетов и рекомендации

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

  • Используйте функции esc_html, esc_attr и esc_textarea для безопасного вывода данных;
  • Добавляйте фильтры и хуки для расширения функциональности;
  • Соблюдайте стандарты кодирования WordPress для совместимости;
  • Тестируйте виджет с разными темами и плагинами;
  • Документируйте код и комментарии для поддержки.

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

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

  • Widget Options — для управления видимостью виджетов на страницах, устройствах и ролях пользователей;
  • Custom Sidebars — позволяет создавать и управлять разными боковыми панелями;
  • SiteOrigin Widgets Bundle — набор расширенных виджетов с настройками и визуальным редактором.
Автозаполнение метаданных для постов WordPress: примеры и настройка
06.03.2026
Как отключить XML-RPC в WordPress для повышения безопасности
23.03.2026
Как создать уникальный обработчик Ajax в WordPress с нуля
23.01.2026
Как добавить динамические параметры в URL в WordPress
30.03.2026
WooCommerce: автоматическое удаление товаров с нулевым остатком без плагинов
12.06.2026