Виджеты — один из самых удобных способов расширить функциональность сайта на WordPress и упростить управление контентом в боковых панелях, подвалах и других областях темы. В этой статье мы подробно разберём, как создать собственный виджет с нуля, используя объектно-ориентированный подход, и приведём примеры кода для наглядности.
Что такое виджет в WordPress и зачем создавать свой
Виджет — это небольшой блок с определённой функциональностью, который можно добавить в специальную область темы, поддерживающую виджеты (sidebar, footer и др.). В WordPress уже есть множество встроенных виджетов, но часто возникает необходимость добавить уникальный функционал, которого нет в стандартном наборе.
Создание собственного виджета позволяет:
- Добавить кастомный вывод информации, например, произвольные списки, формы или интерактивные блоки.
- Контролировать внешний вид и поведение виджета в админке и на сайте.
- Интегрировать виджет с другими частями сайта и плагинами.
Ниже мы пошагово рассмотрим, как зарегистрировать и реализовать виджет.
Регистрация виджета: базовый каркас класса
Для создания виджета нужно создать класс, расширяющий WP_Widget, и зарегистрировать его в WordPress. Вот базовый шаблон:
class WPBOX_Widget_Example extends WP_Widget {
public function __construct() {
parent::__construct(
'wpbox_widget_example', // ID виджета
'WPBOX: Пример виджета', // Название виджета
['description' => 'Пример собственного виджета для WPBOX.ru']
);
}
// Вывод содержимого виджета на фронтенде
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>Привет от WPBOX: это пример собственного виджета!</p>';
echo $args['after_widget'];
}
// Форма в админке для настройки виджета
public function form($instance) {
$title = !empty($instance['title']) ? $instance['title'] : '';
?>
<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>
<?php
}
// Сохранение настроек виджета
public function update($new_instance, $old_instance) {
$instance = [];
$instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
return $instance;
}
}
// Регистрируем виджет
function wpbox_register_widget_example() {
register_widget('WPBOX_Widget_Example');
}
add_action('widgets_init', 'wpbox_register_widget_example');
Этот код создаёт простой виджет с настраиваемым заголовком и статичным текстом внутри. Разместите его в файле плагина или в functions.php вашей темы.
Добавление расширенного функционала: динамический вывод и AJAX
Пример выше показывает базовый вывод, но часто требуется, чтобы виджет показывал динамические данные или имел интерактивность. Рассмотрим, как добавить в виджет кнопку, которая по нажатию через AJAX будет подгружать случайный совет из массива.
Подготовка виджета с кнопкой
Расширим метод 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'];
}
echo '<div id="wpbox-advice-container"></div>';
echo '<button id="wpbox-get-advice">Получить совет</button>';
echo $args['after_widget'];
}
Добавление скрипта AJAX
Зарегистрируем и подключим скрипт, который будет отправлять запрос к серверу:
function wpbox_enqueue_widget_scripts() {
wp_enqueue_script('wpbox-widget-ajax', get_template_directory_uri() . '/js/wpbox-widget-ajax.js', ['jquery'], null, true);
wp_localize_script('wpbox-widget-ajax', 'wpbox_ajax_obj', [
'ajax_url' => admin_url('admin-ajax.php')
]);
}
add_action('wp_enqueue_scripts', 'wpbox_enqueue_widget_scripts');
Создайте файл wpbox-widget-ajax.js в папке темы js со следующим содержимым:
jQuery(document).ready(function($) {
$('#wpbox-get-advice').on('click', function() {
$.ajax({
url: wpbox_ajax_obj.ajax_url,
type: 'POST',
data: { action: 'wpbox_get_advice' },
success: function(response) {
$('#wpbox-advice-container').html('<p>' + response.data + '</p>');
}
});
});
});
Обработка AJAX-запроса на сервере
Добавим функцию для обработки запроса и возвращения случайного совета:
function wpbox_ajax_get_advice() {
$advices = [
'Регулярно делайте бэкапы сайта.',
'Оптимизируйте изображения для быстрого загрузки.',
'Используйте дочерние темы для кастомизаций.',
'Обновляйте плагины и ядро WordPress вовремя.',
'Минимизируйте количество активных плагинов для производительности.'
];
$advice = $advices[array_rand($advices)];
wp_send_json_success($advice);
}
add_action('wp_ajax_wpbox_get_advice', 'wpbox_ajax_get_advice');
add_action('wp_ajax_nopriv_wpbox_get_advice', 'wpbox_ajax_get_advice');
Теперь при нажатии кнопки в виджете будет запрашиваться случайный совет с сервера и выводиться в контейнер.
Интеграция с популярными плагинами WPShop
Если вы используете плагины с wpshop.ru, например, Clearfy Pro для оптимизации или WPRemark для комментариев, можно расширять виджет, например, показывая последние отзывы или оптимизируя кеш.
Пример: чтобы вывести последние отзывы из WPRemark в виджете, достаточно внутри метода widget() получить посты типа wpremark_review и вывести их:
$reviews = get_posts(['post_type' => 'wpremark_review', 'numberposts' => 5]);
echo '<ul>';
foreach ($reviews as $review) {
echo '<li>' . esc_html(get_the_title($review)) . '</li>';
}
echo '</ul>';
Резюме и рекомендации по созданию виджетов
Создание собственного виджета — это удобный способ добавить уникальные блоки на сайт. Используйте объектно-ориентированный подход, обязательно реализуйте методы widget(), form() и update(). Для динамических функций добавляйте AJAX и подключайте скрипты корректно.
Не забывайте о безопасности: используйте esc_html, wp_nonce_field при необходимости, фильтры и санитизацию. А для интеграции с плагинами смотрите их API и возможности.
Если хотите быстро расширить функционал и оптимизировать работу с виджетами, обратите внимание на Clearfy Pro — много полезных инструментов в одном плагине.