В этой статье разберем, как создать собственный динамический виджет в WordPress, который позволит выводить уникальный контент в боковых панелях вашего сайта. Мы рассмотрим базовую структуру виджета, методы работы с настройками и пример интеграции с дополнительными функциями. Такой подход пригодится, если вам нужно реализовать нестандартный функционал, которого нет в готовых плагинах.
Что такое динамический виджет и зачем он нужен
Динамический виджет — это виджет, который не просто выводит статический контент, а способен изменять своё содержимое на основе настроек, условий или данных сайта. В отличие от стандартных текстовых или HTML-виджетов, динамический виджет программируется разработчиком, имеет собственные параметры и логику.
Например, такой виджет может показывать последние записи определенной категории, выводить персональные приветствия для авторизованных пользователей или отображать популярные товары с интернет-магазина.
Создаем базовый класс виджета в WordPress
Чтобы создать собственный виджет, нужно создать класс, наследующий WP_Widget. В нем реализуются три основных метода:
__construct()— инициализация виджета;widget()— вывод контента на фронтенде;form()— форма настроек в админке;update()— обработка сохранения настроек.
Пример создания простого динамического виджета:
class WPtricks_Dynamic_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'wptricks_dynamic_widget', // ID
'WPtricks: Динамический виджет', // Название
array('description' => 'Пример динамического виджета с настройками')
);
}
public function widget($args, $instance) {
echo $args['before_widget'];
$title = apply_filters('widget_title', $instance['title']);
if (!empty($title)) {
echo $args['before_title'] . $title . $args['after_title'];
}
echo '<p>Сегодняшняя дата: ' . date('d.m.Y') . '</p>';
echo $args['after_widget'];
}
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
}
public function update($new_instance, $old_instance) {
$instance = array();
$instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
return $instance;
}
}
function wptricks_register_dynamic_widget() {
register_widget('WPtricks_Dynamic_Widget');
}
add_action('widgets_init', 'wptricks_register_dynamic_widget');Этот код добавляет простой виджет, который выводит заголовок и текущую дату. Обратите внимание на префикс WPtricks_ для уникальности имен функций и классов.
Добавляем дополнительные настройки и динамический контент
Чтобы сделать виджет более полезным, расширим функционал. Добавим настройку для выбора категории записей и вывод списка последних постов из выбранной категории.
Расширенный метод form() для выбора категории:
public function form($instance) {
$title = !empty($instance['title']) ? $instance['title'] : 'Последние записи';
$category = !empty($instance['category']) ? $instance['category'] : 0;
$categories = get_categories(array('hide_empty' => false));
?>
<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('category')); ?>">Категория:</label>
<select class="widefat" id="<?php echo esc_attr($this->get_field_id('category')); ?>"
name="<?php echo esc_attr($this->get_field_name('category')); ?>">
<option value="0">Все категории</option>
<?php foreach ($categories as $cat) : ?>
<option value="<?php echo esc_attr($cat->term_id); ?>" <?php selected($category, $cat->term_id); ?>>
<?php echo esc_html($cat->name); ?>
</option>
<?php endforeach; ?>
</select>
</p>
<?php
}Обновим метод widget() для вывода постов из выбранной категории:
public function widget($args, $instance) {
echo $args['before_widget'];
$title = apply_filters('widget_title', $instance['title']);
if (!empty($title)) {
echo $args['before_title'] . $title . $args['after_title'];
}
$category = !empty($instance['category']) ? intval($instance['category']) : 0;
$query_args = array(
'posts_per_page' => 5,
'post_status' => 'publish',
);
if ($category > 0) {
$query_args['cat'] = $category;
}
$recent_posts = new WP_Query($query_args);
if ($recent_posts->have_posts()) {
echo '<ul>';
while ($recent_posts->have_posts()) {
$recent_posts->the_post();
echo '<li><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Нет записей для отображения.</p>';
}
echo $args['after_widget'];
}Используем созданный виджет в теме и плагинах
После регистрации виджета в файле functions.php вашей темы или в собственном плагине, вы можете добавлять его через админку WordPress в любую доступную виджет-зону. Такой подход позволяет создавать кастомные блоки с динамическим контентом без необходимости правки шаблонов напрямую.
Если хотите расширить функционал, можно добавить кеширование вывода с помощью set_transient и get_transient, или реализовать AJAX-подгрузку при прокрутке.
Пример кеширования вывода виджета
public function widget($args, $instance) {
$cache_key = 'wptricks_dynamic_widget_' . $this->id;
$cached = get_transient($cache_key);
if ($cached !== false) {
echo $cached;
return;
}
ob_start();
echo $args['before_widget'];
$title = apply_filters('widget_title', $instance['title']);
if (!empty($title)) {
echo $args['before_title'] . $title . $args['after_title'];
}
// ... вывод постов ...
echo $args['after_widget'];
$output = ob_get_clean();
set_transient($cache_key, $output, 3600); // кеш на 1 час
echo $output;
}Популярные плагины для расширения функционала виджетов
Если не хотите писать виджеты с нуля, обратите внимание на плагины с расширенными возможностями:
- Widget Options — удобный менеджер виджетов с условиями показа и настройками.
- Content Aware Sidebars — позволяет создавать виджет-зоны с условиями отображения.
- Custom Sidebars — создает дополнительные боковые панели и управляет их отображением.
Эти плагины помогут гибко настраивать виджеты и области вывода без программирования, но для полного контроля и уникального функционала собственный код всегда в приоритете.