Выпуск 32. Виджеты в WordPress (делаем настройки)
Виджеты
В прошлом выпуске я показал, как делаются виджеты и как они подключаются. Продолжим. ![]()
Несколько сайдбаров
Возможно, что у вас шаблон из нескольких колонок. Вполне логично было бы сделать каждую из них виджетной. Для этого нужно зарегистрировать сколько нужно сайдбаров, а в файле sidebar-N.php указать номер используемого сайдбара.
И хотя я говорю "сайдбар", но на самом деле разместить его динамический код можно где угодно, например в шапке или подвале.
Предположим у нас два сайдбара sidebar-1.php и sidebar-2.php.
<strong>sidebar-1.php:</strong>
if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(<strong>1</strong>) ) {
...
<strong>sidebar-2.php:</strong>
if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(<strong>2</strong>) ) {
...
А в файле functions.php:
register_sidebar(array(
'name' => '<strong>Первая колонка</strong>',
'before_widget' => '', 'after_widget' => '',
'before_title' => '', 'after_title' => ''));
register_sidebar(array(
'name' => '<strong>Вторая колонка</strong>',
'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 (когда вы обновляете страницу виджетов) и обновить опции.
Сразу привожу код с комментариями:
<strong>function widget_maxsite_1_options() {</strong>
# получаем наши опции. Обратите внимание на название
# оно должно быть такое-же, как в предыдущей функции
<strong>$options = $newoptions = get_option('widget_maxsite_1');</strong>
# получаем данные POST. Если они есть, то есть было обновление настроек,
# то обновляем переменную $newoptions новыми значениями.
# Сами значения - это названия полей формы (см. ниже)
# Функция isset проверяет есть ли такое значение
# вы помните, что опции hide_empty и show_count принимают
# значения 1 или 0 (отмеченны или нет)
<strong>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']);
}</strong>
# если новые опции не равны старым, то есть изменились
# то обновляем старые
<strong>if ( $options != $newoptions ) {
$options = $newoptions;
update_option('widget_maxsite_1', $options);
}</strong>
# Получаем значения переменных. Нужно это для того,
# чтобы в самой форме восстановить значения чекбоксов
<strong>$hide_empty = $options['hide_empty'] ? 'checked="checked"' : '';
$show_count = $options['show_count'] ? 'checked="checked"' : '';</strong>
# вывод формы
# Обратите внимание на префикс полей "widget_maxsite_1_"
# нужно обязательно использовать уникальные поля, поскольку
# у вас будут множество виджетов и если имена (name и id)
# будут совпадать, то в массиве POST может оказаться значение
# из другого виджета
<strong>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;
}
</strong>
Код кажется сложноват, но если вы внимательно с ним разберетесь, то никаких секретов уже не останется.
Лирическое отступление
Сразу давайте определим как делать текстовые поля, например использовать свой заголовок вместо слова "Рубрики".
Принцип точно такой же. Мы определяем поле в форме, только 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. В нем описаны все функции для работы с виджетами, а также созданы виджеты по-умолчанию.
Кстати, если вы назовете свои виджеты как и стандартные, то будут вызываться уже ваши.
Виджеты это маленькие программки, которые совместно с плагинами позволяют перенести управление в админ-панель. На мой взгляд, разработка виджетов перспективное направление. ![]()
В следующий раз поговорим об интеграции плагинов и виджетов.
- Выпуск 25. Делаем собственный шаблон для WordPress (часть 2)
- Выпуск 4. Знакомимся с плагинами
- Выпуск 28. Делаем собственный шаблон для WordPress (часть 5)
- Выпуск 10. Блог-клиент. Поиск. Полезные плагины
- Выпуск 19. Оптимизация WordPress
- Делаем статический сайт! Шаблоны страниц
- Выпуск 18. Подключаем статистику Google
- Выпуск 29. Облако тэгов/меток/ключевых слов
- Выпуск 3. Руссификация. Устанавливаем шаблоны
- Выпуск 21. Установка fGallery
- Выпуск 22. WordPress-шаблон
- Выпуск 8. Оформление текстов с помощью HTML (окончание)
- Выпуск 7. Оформление текстов с помощью HTML
- Выпуск 27. Делаем собственный шаблон для WordPress (часть 4)
- Выпуск 31. Виджеты в WordPress


А как вывести мой виджет, если я хочу его использовать для вставки описания в шаблон страницы категори N?
У меня там перед циклом просто текст?
При этом новый файл типа сайбара у меня называется uran.php (копия одного из сайдбаров)...
Тут же почти офтоп-вопросик. Просто если ответ на мой вопрос будет позитивным, то предыдущий комментарий неактуален. Можно ли спомощью какой-то переменной вывести в шаблон категории содержание страницы N? Если да, то тогда редактировать єти самые описания категори намного проще - в визуальном редакторе страниц, а не в в виджетах и не в редакторе тем, колупая код шаблона под каждую категорию. А у меня их много!
И еще. У меня есть категории, которые имеют закрытые ото всех посты. В моей теме выджеты эти категории прячут, так как они не имеют ни одной открытой записи. А как сделать так, чтобы в залогиненом виде я видел свои секретные категории в сайбдаре?
А каким образом виджеты унаследывают оформление блоков сайдбара? Как бы сделать так, чтобы виджеты принимали отдельное оформление? Допустим, у меня есть какой-то класс, и как мне его подключить к виджетам?
Всё делается, но для этого нужно писать свои виджеты и в них использовать и любое оформление, и любую функциональность. Лично я, не пользуюсь стандартными виджетами. Вместо этого я написал свои, которые имеют настройки, которые нужны мне или моим клиентам. Один из прмиеров вот здесь: http://maxsite.org/sozdanie-saytov
Уже полдня мурыжусь, Как сделать чтобы виджет отображался только на главной странице блога?
В коде виджета прописать
if (is_home()) { код виджета }Добрый день. Подскажите если не сложно, или создайте такую тему. Вопрос такой. Есть штатные рекламные ссылки - которые выводятся как правило в боковой колонке. А меня интерисует отдельно взятая страница со ссылками. Т.Е. Каталог ссылок. Вопрос: есть ли плагин каталога ссылок? Если нет то - возможно ли перенести штатный виджет ссылок на отдельную страницу? Заранее благодарен. Простите что не по теме! и ICQ 428-311-164