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

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

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

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

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

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

Далее мы разберём, как это сделать правильно и просто.

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

Для создания виджета нужно выполнить несколько последовательных шагов:

  1. Создать класс, наследующий WP_Widget;
  2. Определить методы __construct(), widget(), form() и update();
  3. Зарегистрировать виджет с помощью register_widget();
  4. Подключить код в ваш плагин или файл functions.php темы.

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

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

Для начала создадим класс, который будет расширять встроенный класс WP_Widget. Назовём его WP3_Custom_Widget, чтобы видеть связь с доменом wp3.ru.

class WP3_Custom_Widget extends WP_Widget {  public function __construct() {    parent::__construct(      'wp3_custom_widget', // ID виджета    'WP3: Пользовательский виджет', // Название виджета    array( 'description' => 'Пример простого пользовательского виджета WP3' )  );  }

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

Метод 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>Привет от виджета WP3!</p>';  echo $args['after_widget'];}

Здесь мы выводим заголовок, если он задан, а затем простой HTML-контент.

Метод 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 }

В примере показано поле для ввода заголовка виджета с использованием helper-методов для корректного формирования id и имени поля.

Метод update() — обработка и сохранение данных

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

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

Здесь мы используем функцию sanitize_text_field() для безопасности.

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

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

function wp3_register_custom_widget() {  register_widget( 'WP3_Custom_Widget' );}add_action( 'widgets_init', 'wp3_register_custom_widget' );

Добавьте этот код в файл плагина или в functions.php вашей темы.

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

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

class WP3_Advanced_Widget extends WP_Widget {  public function __construct() {    parent::__construct(      'wp3_advanced_widget',      'WP3: Расширенный виджет',      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' ); ?>"><?php echo esc_textarea( $description ); ?></textarea>    </p>    <?php  }  public function update( $new_instance, $old_instance ) {    $instance = array();    $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? sanitize_text_field( $new_instance['title'] ) : '';    $instance['description'] = ( ! empty( $new_instance['description'] ) ) ? sanitize_textarea_field( $new_instance['description'] ) : '';    return $instance;  }}

Регистрация аналогична предыдущему примеру.

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

Для расширения возможностей виджетов можно использовать следующие плагины:

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

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

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

При создании виджетов всегда проверяйте входные данные, используйте функции санитизации (например, sanitize_text_field(), esc_html()), чтобы предотвратить XSS-уязвимости.

Для отладки можно временно включить вывод ошибок в PHP и использовать error_log() для отслеживания проблем.

Для улучшения производительности избегайте тяжелых операций в методе widget(), лучше кэшируйте результаты, если это возможно.

Как отладить проблемы с кешем в WordPress: практические советы и примеры кода
12.11.2025
Как создать автоматические отчёты в WordPress с помощью пакетов Cron и WPGPT
27.02.2026
Как удалить неиспользуемые мета-данные в WordPress
08.12.2025
Как использовать WPRemark для автоматического модерирования комментариев в WordPress
31.12.2025
Как автоматизировать создание бэкапов в WordPress
17.11.2025