Выпуск 32. Виджеты в WordPress (делаем настройки)
Виджеты
В прошлом выпуске я показал, как делаются виджеты и как они подключаются. Продолжим.
Несколько сайдбаров
Возможно, что у вас шаблон из нескольких колонок. Вполне логично было бы сделать каждую из них виджетной. Для этого нужно зарегистрировать сколько нужно сайдбаров, а в файле sidebar-N.php указать номер используемого сайдбара.
И хотя я говорю "сайдбар", но на самом деле разместить его динамический код можно где угодно, например в шапке или подвале.
Предположим у нас два сайдбара sidebar-1.php и sidebar-2.php.
sidebar-1.php:
if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(1) ) {
...
sidebar-2.php:
if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(2) ) {
...
А в файле functions.php:
register_sidebar(array(
'name' => 'Первая колонка',
'before_widget' => '', 'after_widget' => '',
'before_title' => '', 'after_title' => ''));
register_sidebar(array(
'name' => 'Вторая колонка',
'before_widget' => '', 'after_widget' => '',
'before_title' => '', 'after_title' => ''));
...
Как видите, всё очень просто. Сайдбары регистрируются по очереди (register_sidebar), а их номер мы указываем в уже в dynamic_sidebar.
Настройки виджета
Мы уже сделали виджет "Рубрики для меня", теперь сделаем его настраиваемым. Для этого используется такая схема:
- Создается функция отображения виджета.
- Создается функция для настройки виджета.
- Обе эти функции регистрируются.
- В качестве хранилища параметров используются options WordPress'а.
То есть, в форме настройки мы задаем опции, сохраняем их, а когда вызываем функцию отображения, считываем эти опции и применяем их по своему усмотрению.
Делаем настройки виджета
Для примера давайте сделаем две настройки:
- Скрывать рубрики без записей
- Показывать количество записей
Для этого модернизируем нашу widget_maxsite_1:
function widget_maxsite_1() {
$options = get_option('widget_maxsite_1');
$hide_empty = $options['hide_empty'] ? '1' : '0';
$show_count = $options['show_count'] ? '1' : '0';
echo '<h2 class="box">Рубрики</h2><ul class="is_link">';
wp_list_categories('title_li=&show_count=' . $show_count .
'&hide_empty=' . $hide_empty);
echo '</ul>';
}
Рассмотрим этот код.
Вначале мы получаем опции для этого виджета. В качестве имени опции мы укажем имя нашей функции.
$options = get_option('widget_maxsite_1');
В прошлый раз я указал об используемых именах. На самом деле жесткой системы не существует. Главное, чтобы вы сами не запутались.
![]()
Таким образом в переменной $options у нас находится массив опций. Следующими строчками мы заполняем переменные $hide_empty и $show_count. Такая запись является короткой формой оператора if:
$переменная = условие : значение если true : значение если false.
В начаем случае $hide_empty равна 1, если $options['hide_empty'] больше нуля; или 0 - если нет.
Полученные значение мы передаем в функцию wp_list_categories.
Код совсем простой и короткий. В дальнейшем вы сможете его видоизменить под свои нужды. Несколько сложней делается функция настройки виджета.
Функция настройки
Если вы делали свои плагины, то знаете как легко запутаться в полях формы и правильно передать параметры POST. К чести разработчиков WordPress'а, этот механизм в виджетах реализован на высоком уровне. Во всяком случае большинство рутинных операций вынесены в сам WordPress и о них нет надобности беспокоится.
То есть по-сути нам нужно будет только описать поля формы, принять POST (когда вы обновляете страницу виджетов) и обновить опции.
Сразу привожу код с комментариями:
function widget_maxsite_1_options() {
# получаем наши опции. Обратите внимание на название
# оно должно быть такое-же, как в предыдущей функции
$options = $newoptions = get_option('widget_maxsite_1');
# получаем данные POST. Если они есть, то есть было обновление настроек,
# то обновляем переменную $newoptions новыми значениями.
# Сами значения - это названия полей формы (см. ниже)
# Функция isset проверяет есть ли такое значение
# вы помните, что опции hide_empty и show_count принимают
# значения 1 или 0 (отмеченны или нет)
if ( $_POST['widget_maxsite_1_submit'] ) {
$newoptions['hide_empty'] =
isset($_POST['widget_maxsite_1_hide_empty']);
$newoptions['show_count'] =
isset($_POST['widget_maxsite_1_show_count']);
}
# если новые опции не равны старым, то есть изменились
# то обновляем старые
if ( $options != $newoptions ) {
$options = $newoptions;
update_option('widget_maxsite_1', $options);
}
# Получаем значения переменных. Нужно это для того,
# чтобы в самой форме восстановить значения чекбоксов
$hide_empty = $options['hide_empty'] ? 'checked="checked"' : '';
$show_count = $options['show_count'] ? 'checked="checked"' : '';
# вывод формы
# Обратите внимание на префикс полей "widget_maxsite_1_"
# нужно обязательно использовать уникальные поля, поскольку
# у вас будут множество виджетов и если имена (name и id)
# будут совпадать, то в массиве POST может оказаться значение
# из другого виджета
echo <<<EOF
Скрывать рубрики без записей
<input class="checkbox" type="checkbox" {$hide_empty}
id="widget_maxsite_1_hide_empty" name="widget_maxsite_1_hide_empty" />
<br />Показывать количество записей
<input class="checkbox" type="checkbox" {$show_count}
id="widget_maxsite_1_show_count" name="widget_maxsite_1_show_count" />
<input type="hidden" id="widget_maxsite_1_submit"
name="widget_maxsite_1_submit" value="1" />
EOF;
}
Код кажется сложноват, но если вы внимательно с ним разберетесь, то никаких секретов уже не останется.
Лирическое отступление
Сразу давайте определим как делать текстовые поля, например использовать свой заголовок вместо слова "Рубрики".
Принцип точно такой же. Мы определяем поле в форме, только type="text". В функции настройки:
$newoptions['title'] = stripslashes($_POST["widget_maxsite_1_title"]); ... $title = attribute_escape($options['title']);
А в функции вывода:
$title = $options['title'];
Регистрируем настройки виджета
Последний штрих - регистрация функции настройки. Делается это просто. В конце файла functions.php допишем:
register_widget_control('Рубрики для меня', 'widget_maxsite_1_options');
Первый параметр (название виджета) должен быть таким же как и при регистрации функции вывода (register_sidebar_widget).
В заключении
Тема виджетов довольно обширна. Наверное можно было бы еще дальше углубляться в неё, но думаю, что пока не стоит усложнять материал. Всё-таки большинство виджетов могут оказаться довольно сложными для новичков.
Если же вы все-таки решили углубить свои познания виджетов, то обратите внимание на файл widgets.php. В нем описаны все функции для работы с виджетами, а также созданы виджеты по-умолчанию.
Кстати, если вы назовете свои виджеты как и стандартные, то будут вызываться уже ваши.
![]()
Виджеты это маленькие программки, которые совместно с плагинами позволяют перенести управление в админ-панель. На мой взгляд, разработка виджетов перспективное направление.
В следующий раз поговорим об интеграции плагинов и виджетов.
Подпишитесь на рассылкуИспользуем WordPress для создания своего сайта
и получайте её на e-mail раньше всех!
Постоянная ссылка: http://maxsite.org/?p=260
Версия для печати
