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

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

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

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

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

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

Регистрация и структура пользовательского виджета WordPress

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

Начнём с базового шаблона виджета, который мы зарегистрируем в WordPress через хук widgets_init. Например, для домена wpcource.ru префикс функций и классов добавим wpcource_ для уникальности.

add_action('widgets_init', 'wpcource_register_custom_widget');
function wpcource_register_custom_widget() {
    register_widget('WPCource_Custom_Widget');
}

class WPCource_Custom_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wpcource_custom_widget',
            'WPCource: Персонализированный виджет',
            ['description' => 'Пример кастомного виджета с настройками для wpcource.ru']
        );
    }

    public function widget($args, $instance) {
        echo $args['before_widget'];
        $title = apply_filters('widget_title', $instance['title'] ?? '');
        if (!empty($title)) {
            echo $args['before_title'] . $title . $args['after_title'];
        }
        echo '<p>Это персонализированный виджет с настройками.</p>';
        echo $args['after_widget'];
    }

    public function form($instance) {
        $title = $instance['title'] ?? '';
        ?>
        <p>
            <label for="<?php echo esc_attr($this->get_field_id('title')); ?>">Заголовок:</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>
        <?php
    }

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

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

Добавление пользовательских полей и расширение функционала

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

Добавим в класс виджета новые поля text и bg_color и реализуем их отображение и сохранение.

public function widget($args, $instance) {
    echo $args['before_widget'];
    $title = apply_filters('widget_title', $instance['title'] ?? '');
    $text = $instance['text'] ?? '';
    $bg_color = $instance['bg_color'] ?? '#ffffff';

    echo '<div style="background-color:' . esc_attr($bg_color) . '; padding: 10px;">';
    if (!empty($title)) {
        echo $args['before_title'] . $title . $args['after_title'];
    }
    if (!empty($text)) {
        echo '<p>' . wp_kses_post($text) . '</p>';
    }
    echo '</div>';
    echo $args['after_widget'];
}

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

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

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

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

Вот несколько полезных плагинов, которые помогут в этом:

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

Совмещение собственного кода с такими плагинами позволяет создавать максимально гибкие и персонализированные решения.

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

При разработке собственных виджетов важно помнить про производительность и безопасность. Несколько рекомендаций:

  • Всегда используйте функции санитизации и экранирования (например, sanitize_text_field, wp_kses_post) для данных, вводимых пользователем.
  • Минимизируйте количество запросов к базе данных внутри виджета, кешируйте результаты, если возможно.
  • Используйте хуки и фильтры WordPress для расширения функционала, чтобы ваш код был совместим с другими плагинами и темами.
  • Тестируйте виджет на разных устройствах и браузерах, чтобы обеспечить корректное отображение.

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

Как удалить пустые теги meta в WordPress с помощью PHP
16.04.2026
Удаление неиспользуемых терминов таксономий в WordPress
09.02.2026
WooCommerce: успешное отправление email после подтверждения заказа
31.05.2026
Как удалить старые изображения в WordPress без плагинов
22.03.2026
Как изменить размер и оптимизировать изображения в WordPress без плагинов
05.01.2026

Обучение разработке на WordPress, как создавать темы, плагины. Подробнее об обучении.