WPExperts

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

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

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

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

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

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

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

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

Регистрируем виджет с помощью хука widgets_init и функции register_widget(). Лучше оформить в плагине или в functions.php темы.

add_action('widgets_init', function() {
    register_widget('Wpexperts_Welcome_Widget');
});

class Wpexperts_Welcome_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wpexperts_welcome_widget',
            'Wpexperts: Приветствие',
            ['description' => 'Простой виджет для вывода приветственного текста']
        );
    }

    public function widget($args, $instance) {
        echo $args['before_widget'];
        $title = apply_filters('widget_title', $instance['title'] ?? '');
        $message = $instance['message'] ?? 'Добро пожаловать на сайт!';

        if (!empty($title)) {
            echo $args['before_title'] . $title . $args['after_title'];
        }

        echo '<p>' . esc_html($message) . '</p>';
        echo $args['after_widget'];
    }

    public function form($instance) {
        $title = $instance['title'] ?? '';
        $message = $instance['message'] ?? '';
        ?>
        <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('message')); ?>">Сообщение:</label>
            <textarea class="widefat" rows="4" id="<?php echo esc_attr($this->get_field_id('message')); ?>" name="<?php echo esc_attr($this->get_field_name('message')); ?>"><?php echo esc_textarea($message); ?></textarea>
        </p>
        <?php
    }

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

Разбор кода регистрации виджета

В конструкторе задается ID виджета, его название и описание. Метод widget отвечает за вывод контента на сайте, form — отображение формы настроек в админке, а update — обработку и сохранение настроек.

Обратите внимание на использование esc_html и esc_textarea для безопасности вывода и сохранения данных.

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

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

Добавим в форму поле выбора цвета и в выводе применим стиль:

public function form($instance) {
    $color = $instance['color'] ?? '#000000';
    // ... существующий код полей
    ?>
    <p>
        <label for="<?php echo esc_attr($this->get_field_id('color')); ?>">Цвет текста:</label>
        <input class="widefat" id="<?php echo esc_attr($this->get_field_id('color')); ?>" name="<?php echo esc_attr($this->get_field_name('color')); ?>" type="color" value="<?php echo esc_attr($color); ?>">
    </p>
    <?php
}

public function update($new_instance, $old_instance) {
    $instance = parent::update($new_instance, $old_instance);
    $instance['color'] = sanitize_hex_color($new_instance['color']);
    return $instance;
}

public function widget($args, $instance) {
    echo $args['before_widget'];
    $title = apply_filters('widget_title', $instance['title'] ?? '');
    $message = $instance['message'] ?? 'Добро пожаловать на сайт!';
    $color = $instance['color'] ?? '#000000';

    if (!empty($title)) {
        echo $args['before_title'] . $title . $args['after_title'];
    }

    echo '<p style="color:' . esc_attr($color) . ';">' . esc_html($message) . '</p>';
    echo $args['after_widget'];
}

Такой подход позволяет пользователю персонализировать вывод без правки кода.

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

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

  • SiteOrigin Widgets Bundle — набор настраиваемых виджетов с визуальным редактором.
  • Custom HTML Widget — расширенный виджет для вывода произвольного HTML с поддержкой редактора.
  • WPForms — плагин для создания форм с виджетом вывода формы.

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

Как добавить собственный виджет в тему или плагин: лучшие практики

Если вы планируете использовать виджет в рамках темы, добавьте код виджета в файл functions.php или в отдельный файл с подключением через require_once. Для плагина создайте отдельный PHP-файл и зарегистрируйте там виджет.

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

Также рекомендуется загружать скрипты и стили виджета только при необходимости, подключая их через хук wp_enqueue_scripts или admin_enqueue_scripts.

Пример подключения скриптов для виджета

add_action('wp_enqueue_scripts', function() {
    if (is_active_widget(false, false, 'wpexperts_welcome_widget', true)) {
        wp_enqueue_style('wpexperts-widget-style', plugins_url('css/widget-style.css', __FILE__));
    }
});

Отладка и тестирование виджета: советы для разработчиков

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

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

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

×
до 3225₽

Продавай темы и плагины WordPress!

Лови с каждой продажи

Начать ⋙