Как написать wordpress виджет.

widget Как написать wordpress виджет. Условно в wordpress`е все элементы дизайна можно разделить на несколько частей:

  • Шапка (header)
  • Часть с контентом
  • Сайдбар (sidebar)
  • Подвал (footer)

Единственное, что здесь может быть незнакомо для вас – это сайдбар. По сути, это обобщенная модель боковых колонок на большинстве сайтов. В них обычно ставят всякие блоки с навигацией, выводят новости, формы для авторизации и т.д.

В wordpress все эти блоки обобщили под названием виджет.
Таким образом, сайдбар – это просто список из виджетов и ничего больше.

Теперь вернемся к теме плагинов. Плагины в wordpress – это независимые подпрограммы, которые дополняют или изменяют функциональность wordpress`а. Если вы хотите как-то визуализировать ваш плагин на страницах вашего блога, то вам нужно написать виджет для этого плагина. Другими словами, да, виджет – это визуальная часть вашего wordpress плагина.
Хотя, если быть точным, то виджет может существовать и независимо от плагина.

Быстрый старт.

Рассмотрим простейший виджет.

<?php
/*
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.
Выглядит это примерно так:

pic1 Как написать wordpress виджет.

Теперь разберу про исходник… В wordpress каждый виджет определяется двумя вещами – уникальным именем и функцией вывода. С именем понятно, а функция вывода – это любая функция, которая что-то выводит в браузер.

В моем случае это функция my_first_widget.
Строка

    extract($args);

просто вытаскивает перменнные $before_widget, $before_title, $after_title, $after_widget из массива $args.

Зачем нужны эти переменные? Дело в том, что все виджеты в некоторой степени унифицированы в плане дизайна при выводе. В моей теме, например все виджеты размечаются через html так:

<li class="widget my_first_widget" id="widget-name">
<h2 class="widgettitle">Title</h2>
<center>My first widget</center>
</li>

Здесь как раз видно все эти переменные:

  1. $before_widget = <li class=”widget my_first_widget” id=”widget-name”>
  2. $before_title = <h2 class=”widgettitle”>
  3. $after_title = </h2>
  4. $after_widget = </li>

И все они задаются глобально для всей темы. Таким образом и достигается стандартный дизайн всех виджетов.

Следующая функция

    register_sidebar_widget

нужная для регистрации виджета (чтобы он появился в адмике).
Такой специфический способ ее запуска (через add_action(‘init’, ‘register_my_widget’)) я выбрал не случайно. Может так получиться, что код вашего виджета будет подключен раньше, чем библиотека с функцией register_sidebar_widget. Привязка регистрации моего виджета к действию init исключит такую вероятность, так как оно вызывается после подключения всех библиотек.

Так вот, допустим, теперь нам нужно добавить возможность изменять заголовок виджета. Чтобы вместо Title писалось что-то другое. Знакомая задачка да? icon smile Как написать wordpress виджет. Но нет. На этот раз мы решим ее по-другому.

В wordpress для виджетов есть свои настройки, которые предназначены для управления внешним видом, например.
Виджеты, которые так можно настроить в админке, выглядят так:

pic2 Как написать wordpress виджет.

У моего виджета пока нет настроек, поэтому нет и значка.
Ничего, сейчас исправим 

Для регистрации панели управления виджетом нужно тоже только две функции.
Первая – выводит список полей с настройками, а вторая – регистрирует эту панель управления.

Вот первая :

<?php
function my_widget_control() {
   
    if (!empty($_REQUEST['my_widget_title'])) {
        update_option('my_widget_title', $_REQUEST['my_widget_title']);
    }
?>
    Заголовок&nbsp;:&nbsp;<input type="text" name="my_widget_title" />
<?

}
?>

Как вы уже заметили функция обработки выводит только поле для ввода, без формы и кнопки для ее сабмита (как в случае с плагином). Это работает потому, что все поля всех виждетов, которые сейчас на сайдбаре – находятся внутри одной формы. Поэтому имена для этих полей нужно придумывать уникальные.

Вторую функцию

    register_widget_control(‘Widget name’, ‘my_widget_control’ );

помещаем внутрь register_my_widget.

Теперь мой виджет полностью работоспособен.
Вот его код:

<?php
/*
Plugin Name: My first widget
Plugin URI: http://i-novice.net/files/my_first_widget.zip
Author: Novice
Author URI: http://i-novice.net
*/


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']);
    }
?>
    Заголовок&nbsp;:&nbsp;<input type="text" name="my_widget_title" />
<?

}

add_action('init', 'register_my_widget');
?>

Скачать его для препарирования можно здесь “Мой первый виджет”.

Итоги

В принципе, прочитав все предыдущие статьи про написание плагинов для wordpress:

  1. Hello, world плагин
  2. Админка для плагина hello_world
  3. Работа с БД в плагинах wordpress

а так же эту статью, можно написать плагин и виджет для wordpress любой сложности.
Остался только один вопрос, который я рассмотрю в следующей статье – интернационализация. Как можно перевести ваш wordpress плагин на много языков средствами wordpress.
А пока удачи. icon smile Как написать wordpress виджет.



Теги: ,


Читайте также:



28 Ответов на “Как написать wordpress виджет.”

  1. NLander
    Сентябрь 22nd, 2008

    Супер!!!

  2. Red
    Октябрь 30th, 2008

    А куда их складывать то, виждеты?

  3. Red
    Октябрь 31st, 2008

    Все разобрался, нужно кидать либо в wp-content\plugins отдельным пхп файлом и потом в админке активоровать плагин, либо добавить код виджета в wp-content\themes\название_темы\functions.php
    Первое предпочтительней, так как не зависит от конкретной темы.
    Автору статьи большой респект, разобрался с виджетами.

    P.S. Кстати сохранять нада в кодировке UTF-8 without BOM а то будет ругаться при сохранении настроек виджетов в админке.

  4. novice
    Октябрь 31st, 2008

    Не успел я ответить :)

  5. Дима
    Ноябрь 23rd, 2008

    Будет инет(анлим) разберусь основательней с этой статьёй)) Идеи есть уже для сайтов)

  6. Zefo
    Декабрь 3rd, 2008

    Только-только начинаю разбираться с WP. У многих блогеров в сайд баре висях 4 грфических баннера. Интересно они их ручками вставляют ? Или какой то плагин используют ?

    И спасибо за блог. Думаю будет интересно почитать в дальнейшем.

  7. novice
    Декабрь 4th, 2008

    Баннеры можно добавлять через текстовые виджеты (виджет с именем Текст). Кроме того, иногда это делают, через добавление html кода прям в шаблон (ручками т.е.). Плагины для этого не нужны. :)

  8. Zefo
    Декабрь 8th, 2008

    Да, я понимаю ,что можно ручками. Думал что может есть плагин для админки.. ну что б быстрее.

  9. Антоха
    Декабрь 18th, 2008

    Ребята, подскажите кто знает с помощью какого виджета можно сделать меню чтобы при наведении мышкой на строку меню выплывала подстрока с возможным выбором нескольких подопций. Типа Услуги- консалтинг
    – факторинг
    – банкинг
    -…

  10. Red
    Декабрь 21st, 2008

    Ну незнаю нащет стандартных, виджетов, но можно написать самому, принцып тотже что и описан здесь, а сама менюшка делается с помощью ява скрипт. Принцып такой, создаеш div с подпунктами, факторинг, банкинг, и через style=”display:’none’;” прячем его от глаз юзера, а на блок с главным пунктом меню назначаем onmouseover=”my_function();”

    Функцыя елементарная:
    function my_function {
    ID_дива_с_подпунктами.style.display=”"
    }
    при наведении наш скрытый див становится видимым, по томуже принцыпу прячем его при уберании мышки через onmouseout.

    Сразу можно подсвечивать выбраный пункт меню изменяя допустим цвет фона или текста.

    Надеюсь общий принцып понятен.

  11. jump
    Декабрь 29th, 2008

    Проблема в следующем: при добавлении виджета Текст и вставляя в него ссылки на RSS, кнопки и т.д., теряется форматирование, т.е. кнопки в один ряд идут прижатые к левой части. Хотелось бы их выровнять по центру сайдбара.
    Делаю таблицу, но всё равно не получается.

  12. novice
    Декабрь 30th, 2008

    Это уже вопрос верстки. Я бы посоветовал открыть сайт в Firefox+Firebug и глянуть какие стили там действуют внутри сайдбара. Возможно, это получится разрешить. :)

  13. jump
    Январь 18th, 2009

    Моя тема основана на: Rock-Kitty.net. Спасибо за совет Firefox+Firebug, так и поступлю, как тока времени будет побольше.

  14. Олег
    Февраль 24th, 2009

    Так и не понял, как мне поправить код виджета “Рубрики”. Я хочу добавить параметр “depth=1″ для функции wp_list_category, но я не знаю как отредактировать этот виджет

  15. Андрей
    Март 19th, 2009

    Класная статья! То что нужно, как раз хотел вджет найти и подумывал сам написать … простенький нужен. И наткнулся на эту статью. Спасибо, в общем!

  16. Алексей
    Апрель 23rd, 2009

    Большое спасибо за статью. На русском языке не так много информации по WordPress для разработчиков. Плагины-то я делать умею, а вот виджетов не делал еще.

  17. Михаил
    Август 18th, 2009

    Решил попрограммировать для WordPress. А можно ли как-то поместить виджет внутрь страницы?

  18. cryptus
    Август 21st, 2009

    2Михаил: Если хочешь поместить какой-то контент внутрь страницы, то лучше использовать для этого плагин. В тексте, например, делаешь пометку [MY_WIDGET_CONTENT] в нужном месте, а плагином ее потом меняешь на нужный контент.

  19. [...] Сделан виджет на основе наработок Spryt в частности скрипта SAPE stat и статьи ‘Как написать wordpress виджет‘. [...]

  20. Человек
    Апрель 15th, 2010

    Подскажите пожалуйста, какой использовать плагин, чтобы у каждого поста был свой виджет с уникальным html кодом? Очень надо!!!! Спасибо!!!!!!!!!!!

  21. ananda7
    Август 4th, 2010

    Отличная статья!
    Просто и доступно. Искал как раз написание плагина, но нашлось много мусора, а тут именно то что нужно.
    Спасибо.

  22. Игнат
    Сентябрь 1st, 2010

    Отлично написано. Спасибо.
    В нете мало нормальной инфы по этому поводу.
    Понимаю что статья старовата, но все же надеюсь на ответ знающего автора!
    Сделал по примеру свой, более функциональный и сложный виджет. Но он у меня используется в теме только один раз :(
    То есть, мне хотелось бы его использовать в разный местах сайдбара (в разных сайдбарах) с различными настройками!
    а он, зараза, после перетаскивания в сайдбар пропадает из админ панели. Типо его можно использовать только раз :(

    помогите плз!!!
    как решить этот вопрос?

  23. Misha
    Декабрь 16th, 2010

    Автору Респект. Отличная стаття

  24. Алекс
    Январь 8th, 2011

    Кстати, в кодексе WP данные функции – register_sidebar_widget и т. д. помечены как Deprecated, т.е. в будущих версиях они не будут поддерживаться. Что любопытно, в том же кодексе новые аналоги приведены не для всех функций, и это в англоязычной ветке.

  25. Alex
    Февраль 14th, 2011

    Очень классная статья, все достаточно просто и доступно.
    Просмотрел много различных статей по созданию виджетов под вордпресс, однако здесь на мой взгляд показан самый простой вариант.
    Только одну вещь я так и не понял как мне сделать чтоб я мог использовать созданный виджет несколько раз. То есть как только я перетаскиваю его в одну из позиций он сразу же исчезает из Available Widgets.

  26. HeX
    Декабрь 14th, 2011

    Спасибо то что нужно и не чего лишнего

  27. Роман
    Декабрь 24th, 2011

    Отличная статья. Спасибо. Нашел много чего интересного

  28. Tmk
    Февраль 20th, 2012

    Как создать свой виджет???

Оставить комментарий


© 2008 - 2012 i-novice.net | Все права защищены.