26.02.2025
Создание пользовательских виджетов в WordPress: Пошаговое руководство
Виджеты в WordPress — это удобный способ добавлять динамический контент в боковые панели, футер или другие области темы. Хотя встроенные виджеты, такие как “Последние записи” или “Облако тегов”, полезны, иногда вам нужно что-то уникальное. В этой статье мы разберем, как создать собственный виджет с нуля, используя PHP и WordPress API. Никаких плагинов — только код и немного терпения!
Зачем создавать свои виджеты?
Пользовательские виджеты позволяют:
- Вывести специфический контент (например, баннер, форму подписки или случайную цитату).
- Настроить функционал под конкретный проект.
- Повысить гибкость темы без необходимости править шаблоны.
Давайте создадим простой виджет, который будет отображать приветственное сообщение с настраиваемым текстом и кнопкой.
Шаг 1: Подготовка
Для начала убедитесь, что у вас есть:
- Установленный WordPress (локально или на хостинге).
- Доступ к файлам темы (например, через
functions.php
). - Базовые знания PHP.
Мы будем работать в файле functions.php
активной темы. Если вы создаете много кастомного кода, лучше вынести виджет в отдельный файл и подключить его через include
или создать собственный плагин.
Шаг 2: Регистрация виджета
WordPress использует класс WP_Widget
для создания виджетов. Добавим следующий код в functions.php
:
<?php
// Регистрация виджета
function my_custom_widget_register() {
register_widget('My_Custom_Widget');
}
add_action('widgets_init', 'my_custom_widget_register');
// Класс виджета
class My_Custom_Widget extends WP_Widget {
// Конструктор
public function __construct() {
parent::__construct(
'my_custom_widget', // Уникальный ID
'Мой кастомный виджет', // Название в админке
array('description' => 'Простой виджет с приветственным сообщением.') // Описание
);
}
}
Этот код регистрирует виджет и задает его базовые параметры. После сохранения файла он появится в разделе “Внешний вид → Виджеты” в админке.
Шаг 3: Добавляем форму настроек
Теперь создадим форму, чтобы пользователь мог настроить виджет. Добавим метод form
в класс:
public function form($instance) {
$title = !empty($instance['title']) ? $instance['title'] : 'Привет!';
$button_text = !empty($instance['button_text']) ? $instance['button_text'] : 'Нажми меня';
?>
<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('button_text'); ?>">Текст кнопки:</label>
<input class="widefat" id="<?php echo $this->get_field_id('button_text'); ?>"
name="<?php echo $this->get_field_name('button_text'); ?>" type="text"
value="<?php echo esc_attr($button_text); ?>">
</p>
<?php
}
Этот код добавляет два поля в админке: для текста приветствия и текста кнопки. Значения сохраняются в $instance
и подставляются по умолчанию, если пользователь ничего не ввел.
Шаг 4: Сохранение данных
Метод update
отвечает за сохранение введенных данных:
public function update($new_instance, $old_instance) {
$instance = array();
$instance['title'] = (!empty($new_instance['title'])) ? sanitize_text_field($new_instance['title']) : '';
$instance['button_text'] = (!empty($new_instance['button_text'])) ? sanitize_text_field($new_instance['button_text']) : '';
return $instance;
}
Здесь мы очищаем данные через sanitize_text_field
для безопасности и обновляем массив $instance
.
Шаг 5: Вывод виджета на сайте
Метод widget
определяет, что увидят посетители. Добавим его в класс:
public function widget($args, $instance) {
$title = !empty($instance['title']) ? $instance['title'] : 'Привет!';
$button_text = !empty($instance['button_text']) ? $instance['button_text'] : 'Нажми меня';
// Выводим HTML
echo $args['before_widget'];
echo '<div class="custom-widget">';
echo '<h3>' . esc_html($title) . '</h3>';
echo '<button>' . esc_html($button_text) . '</button>';
echo '</div>';
echo $args['after_widget'];
}
$args
содержит параметры темы (например, обертки <div>
или <aside>
), а $instance
— данные из формы. Мы выводим заголовок и кнопку с использованием esc_html
для защиты от XSS.
Шаг 6: Полный код
Вот как выглядит весь класс целиком:
<?php
function my_custom_widget_register() {
register_widget('My_Custom_Widget');
}
add_action('widgets_init', 'my_custom_widget_register');
class My_Custom_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'my_custom_widget',
'Мой кастомный виджет',
array('description' => 'Простой виджет с приветственным сообщением.')
);
}
public function form($instance) {
$title = !empty($instance['title']) ? $instance['title'] : 'Привет!';
$button_text = !empty($instance['button_text']) ? $instance['button_text'] : 'Нажми меня';
?>
<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('button_text'); ?>">Текст кнопки:</label>
<input class="widefat" id="<?php echo $this->get_field_id('button_text'); ?>"
name="<?php echo $this->get_field_name('button_text'); ?>" type="text"
value="<?php echo esc_attr($button_text); ?>">
</p>
<?php
}
public function update($new_instance, $old_instance) {
$instance = array();
$instance['title'] = (!empty($new_instance['title'])) ? sanitize_text_field($new_instance['title']) : '';
$instance['button_text'] = (!empty($new_instance['button_text'])) ? sanitize_text_field($new_instance['button_text']) : '';
return $instance;
}
public function widget($args, $instance) {
$title = !empty($instance['title']) ? $instance['title'] : 'Привет!';
$button_text = !empty($instance['button_text']) ? $instance['button_text'] : 'Нажми меня';
echo $args['before_widget'];
echo '<div class="custom-widget">';
echo '<h3>' . esc_html($title) . '</h3>';
echo '<button>' . esc_html($button_text) . '</button>';
echo '</div>';
echo $args['after_widget'];
}
}
Шаг 7: Стилизация (опционально)
Чтобы виджет выглядел красиво, добавьте CSS в файл style.css
вашей темы:
.custom-widget {
padding: 20px;
background: #f5f5f5;
border-radius: 5px;
}
.custom-widget h3 {
margin: 0 0 10px;
}
.custom-widget button {
padding: 10px 20px;
background: #0073aa;
color: #fff;
border: none;
cursor: pointer;
}
.custom-widget button:hover {
background: #005d87;
}
Шаг 8: Тестирование
Сохраните изменения, перейдите в “Внешний вид → Виджеты”, найдите “Мой кастомный виджет”, перетащите его в нужную область (например, боковую панель) и настройте текст. Обновите сайт и проверьте результат!
Заключение
Создание пользовательских виджетов в WordPress — это отличный способ расширить функционал сайта и сделать его уникальным. Начните с простого примера, как этот, а затем добавляйте сложные элементы: динамические данные, AJAX или интеграцию с API. Главное — экспериментируйте и адаптируйте код под свои задачи. Удачи в разработке!