Как написать wordpress виджет
24 августа 2008Плагины в wordpress – это независимые подпрограммы, которые дополняют или изменяют функциональность wordpress`а. Если вы хотите как-то визуализировать ваш плагин на страницах вашего блога, то вам нужно написать виджет для этого плагина. Другими словами, да, виджет – это визуальная часть вашего wordpress плагина.
Хотя, если быть точным, то виджет может существовать и независимо от плагина.
Быстрый старт.
Рассмотрим простейший виджет.
/*
Plugin Name: My first widget
*/
function my_first_widget($args) {
extract($args);
echo $before_widget;
echo $before_title;
echo ‘Title’;
echo $after_title;
echo ‘<center>My first widget</center>’;
echo $after_widget;
}
function register_my_widget() {
register_sidebar_widget(‘Widget name’, ‘my_first_widget’);
}
add_action(‘init’, ‘register_my_widget’);
?>
После активации этого плагина в сайдбар можно будет добавить виджет с именем ‘Widget name’. Этот виджет просто выводит текст “My first widget” в блок с заголовком Title.
Выглядит это примерно так:

Теперь разберу про исходник… В wordpress каждый виджет определяется двумя вещами – уникальным именем и функцией вывода. С именем понятно, а функция вывода – это любая функция, которая что-то выводит в браузер.
В моем случае это функция my_first_widget.
Строка
extract($args);
просто вытаскивает перменнные $before_widget, $before_title, $after_title, $after_widget из массива $args.
Зачем нужны эти переменные? Дело в том, что все виджеты в некоторой степени унифицированы в плане дизайна при выводе. В моей теме, например все виджеты размечаются через html так:
Здесь как раз видно все эти переменные:
- $before_widget = <li class=”widget my_first_widget” id=”widget-name”>
- $before_title = <h2 class=”widgettitle”>
- $after_title = </h2>
- $after_widget = </li>
И все они задаются глобально для всей темы. Таким образом и достигается стандартный дизайн всех виджетов.
Следующая функция
register_sidebar_widget
нужная для регистрации виджета (чтобы он появился в адмике).
Такой специфический способ ее запуска (через add_action(‘init’, ‘register_my_widget’)) я выбрал не случайно. Может так получиться, что код вашего виджета будет подключен раньше, чем библиотека с функцией register_sidebar_widget. Привязка регистрации моего виджета к действию init исключит такую вероятность, так как оно вызывается после подключения всех библиотек.
Так вот, допустим, теперь нам нужно добавить возможность изменять заголовок виджета. Чтобы вместо Title писалось что-то другое. Знакомая задачка да?
Но нет. На этот раз мы решим ее по-другому.
В wordpress для виджетов есть свои настройки, которые предназначены для управления внешним видом, например.
Виджеты, которые так можно настроить в админке, выглядят так:

У моего виджета пока нет настроек, поэтому нет и значка.
Ничего, сейчас исправим ?
Для регистрации панели управления виджетом нужно тоже только две функции.
Первая – выводит список полей с настройками, а вторая – регистрирует эту панель управления.
Вот первая :
function my_widget_control() {
if (!empty($_REQUEST['my_widget_title'])) {
update_option(‘my_widget_title’, $_REQUEST['my_widget_title']);
}
?>
Заголовок : <input type=“text” name=“my_widget_title” />
<?
}
?>
Как вы уже заметили функция обработки выводит только поле для ввода, без формы и кнопки для ее сабмита (как в случае с плагином). Это работает потому, что все поля всех виждетов, которые сейчас на сайдбаре – находятся внутри одной формы. Поэтому имена для этих полей нужно придумывать уникальные.
Вторую функцию
register_widget_control(’Widget name’, ‘my_widget_control’ );
помещаем внутрь register_my_widget.
Теперь мой виджет полностью работоспособен.
Вот его код:
/*
Plugin Name: My first widget
Plugin URI: http://www.wpsoftblog.ru/my_first_widget.zip
Author: Novice
Author URI: http://www.wpsoftblog.ru
*/
function my_first_widget($args) {
extract($args);
echo $before_widget;
echo $before_title;
echo get_option(‘my_widget_title’);
echo $after_title;
echo ‘<center>My first widget</center>’;
echo $after_widget;
}
function register_my_widget() {
register_sidebar_widget(‘Widget name’, ‘my_first_widget’);
register_widget_control(‘Widget name’, ‘my_widget_control’ );
}
function my_widget_control() {
if (!empty($_REQUEST['my_widget_title'])) {
update_option(‘my_widget_title’, $_REQUEST['my_widget_title']);
}
?>
Заголовок : <input type=“text” name=“my_widget_title” />
<?
}
add_action(‘init’, ‘register_my_widget’);
?>
Скачать его для препарирования можно здесь “Мой первый виджет”.