Создаем собственный виджет в WordPress на PHP: подробное руководство

|

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

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

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

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

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

Основы создания виджета в WordPress на PHP

Для создания виджета нужно создать класс, который наследуется от WP_Widget и реализует несколько методов:

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

Создадим пример виджета под названием WPreboot_Custom_Widget.

Пример кода простого виджета

class WPreboot_Custom_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wpreboot_custom_widget',
            __('WPreboot Custom Widget', 'wpreboot'),
            ['description' => __('Простой виджет с текстом и ссылкой', 'wpreboot')]
        );
    }
    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'];
        }
        $text = !empty($instance['text']) ? $instance['text'] : '';
        $url = !empty($instance['url']) ? esc_url($instance['url']) : '';
        if ($text && $url) {
            echo '<p><a href="' . $url . '" target="_blank" rel="nofollow">' . esc_html($text) . '</a></p>';
        } elseif ($text) {
            echo '<p>' . esc_html($text) . '</p>';
        }
        echo $args['after_widget'];
    }
    public function form($instance) {
        $title = !empty($instance['title']) ? $instance['title'] : __('Заголовок', 'wpreboot');
        $text = !empty($instance['text']) ? $instance['text'] : '';
        $url = !empty($instance['url']) ? $instance['url'] : '';
        ?>
        <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Заголовок:'); ?></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('text'); ?>"><?php _e('Текст ссылки:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('text'); ?>" name="<?php echo $this->get_field_name('text'); ?>" type="text" value="<?php echo esc_attr($text); ?>" /></p>

        <p><label for="<?php echo $this->get_field_id('url'); ?>"><?php _e('URL ссылки:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('url'); ?>" name="<?php echo $this->get_field_name('url'); ?>" type="url" value="<?php echo esc_attr($url); ?>" /></p>
        <?php
    }
    public function update($new_instance, $old_instance) {
        $instance = [];
        $instance['title'] = sanitize_text_field($new_instance['title']);
        $instance['text'] = sanitize_text_field($new_instance['text']);
        $instance['url'] = esc_url_raw($new_instance['url']);
        return $instance;
    }
}

function wpreboot_register_custom_widget() {
    register_widget('WPreboot_Custom_Widget');
}
add_action('widgets_init', 'wpreboot_register_custom_widget');

Этот код можно добавить в файл вашего плагина или в functions.php темы. После этого в админке в разделе Виджеты появится новый виджет «WPreboot Custom Widget» с полями для заголовка, текста и ссылки.

Расширение функционала: добавляем дополнительные настройки и стили

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

Чтобы добавить цвет текста, можно расширить форму:

<p><label for="<?php echo $this->get_field_id('text_color'); ?>"><?php _e('Цвет текста:'); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id('text_color'); ?>" name="<?php echo $this->get_field_name('text_color'); ?>" type="color" value="<?php echo esc_attr($text_color); ?>" /></p>

В методе widget() применим цвет через инлайновый стиль:

$text_color = !empty($instance['text_color']) ? $instance['text_color'] : '#000000';
echo '<p style="color:' . esc_attr($text_color) . '">' . esc_html($text) . '</p>';

Так можно добавить любые поля и контролировать вывод виджета.

Загрузка иконки в виджет

Для загрузки иконки нужно использовать медиа-библиотеку WordPress и JavaScript, что немного сложнее. В админке для этого добавляется кнопка, при нажатии открывается медиабраузер. В базовом видежете это не реализовано, но для примера можно добавить поле с URL изображения.

В форме добавьте поле для URL и выводите изображение в виджете, используя тег <img>.

Примеры полезных виджетов, которые можно создать самостоятельно

Создание виджета — это универсальный способ добавить уникальную функциональность. Вот несколько идей для собственных виджетов на WordPress:

Для каждого такого виджета принцип создания остается тем же: класс-наследник WP_Widget, реализация методов и регистрация.

Отладка и рекомендации по безопасности при создании виджетов

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

Отладку можно проводить с помощью отладчика PHP, а также встроенных функций WordPress и консоли браузера.

Вывод

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

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

Как удалить или скрыть авторизацию для определённых пользователей в WordPress
26.03.2026
Как сделать автоматический редирект с удалением WWW в WordPress
13.03.2026
Как создать простой шорткод для вывода отзывов в WordPress
16.03.2026
WooCommerce: автоматическое удаление просмотренных товаров из корзины
30.04.2026
WooCommerce: как автоматически возвращать товар в склад после отмены заказа
24.04.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙