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

|

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

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

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

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

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

Как создать собственный виджет: основные шаги

Создание виджета включает несколько этапов:

Рассмотрим каждый шаг более подробно.

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

Класс виджета должен наследоваться от WP_Widget. В конструкторе задаём название и описание для админки.

class WPZoom_Widget_Example extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wpzoom_widget_example', // ID виджета
            'WPZoom: Пример виджета', // Название
            array('description' => 'Пример собственного виджета от WPZoom')
        );
    }
}

Это минимальный шаблон, который можно расширять.

2. Метод вывода виджета (frontend)

Метод widget() отвечает за вывод содержимого в публичной части сайта. Здесь вы можете вывести любые данные, включая HTML и динамический контент.

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>Это пример вывода собственного виджета от WPZoom.</p>';
    echo $args['after_widget'];
}

Здесь $args — массив с обёртками темы, а $instance содержит настройки виджета.

3. Метод формы настроек в админке

Чтобы пользователь мог настраивать виджет через админку, реализуем метод form(). В нём создаём поля формы для ввода настроек.

public function form($instance) {
    $title = !empty($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
}

Этот код создаёт поле для ввода заголовка виджета.

4. Метод сохранения настроек

Метод update() вызывается при сохранении настроек виджета. Здесь необходимо валидировать и очистить данные.

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

Так мы защищаем данные от вредоносного ввода.

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

Чтобы WordPress знал о нашем виджете, нужно зарегистрировать его с помощью хука widgets_init. Это делается так:

function wpzoom_register_widget() {
    register_widget('WPZoom_Widget_Example');
}
add_action('widgets_init', 'wpzoom_register_widget');

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

Пример расширенного виджета: вывод последних публикаций с миниатюрами

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

Добавим в форму настройки количество записей:

public function form($instance) {
    $title = !empty($instance['title']) ? $instance['title'] : '';
    $number = !empty($instance['number']) ? absint($instance['number']) : 5;
    ?>
    <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('number')); ?>">Количество записей:</label>
        <input class="tiny-text" id="<?php echo esc_attr($this->get_field_id('number')); ?>" name="<?php echo esc_attr($this->get_field_name('number')); ?>" type="number" step="1" min="1" value="<?php echo esc_attr($number); ?>" size="3" />
    </p>
    <?php
}

Обновим метод update() для сохранения нового параметра:

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

И изменим вывод в методе 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'];
    }
    $number = !empty($instance['number']) ? $instance['number'] : 5;
    $query = new WP_Query(array(
        'posts_per_page' => $number,
        'post_status' => 'publish'
    ));
    if ($query->have_posts()) {
        echo '<ul class="wpzoom-latest-posts">';
        while ($query->have_posts()) {
            $query->the_post();
            echo '<li>';
            if (has_post_thumbnail()) {
                echo '<a href="' . get_permalink() . '">' . get_the_post_thumbnail(get_the_ID(), array(50,50)) . '</a> ';
            }
            echo '<a href="' . get_permalink() . '">' . get_the_title() . '</a>';
            echo '</li>';
        }
        echo '</ul>';
        wp_reset_postdata();
    } else {
        echo '<p>Записей не найдено.</p>';
    }
    echo $args['after_widget'];
}

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

При разработке виджетов важно соблюдать несколько правил:

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

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

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

Заключение

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

Оптимизация загрузки шрифтов в WordPress: практические решения для ускорения сайта
08.12.2025
Как создать автоматическое отключение подписок в WordPress по условиям
28.01.2026
Как добавить автоматическое удаление старого контента в WordPress
14.02.2026
Автоматическое удаление спама в комментариях WordPress: лучшие плагины и примеры кода
29.12.2025
Как автоматизировать удаление старых черновиков в WordPress без плагинов
20.02.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше