Июл 14
2009WordPress Plugins. Попробуем его на вкус
Рубрики: (wordpress) Автор: phpdude 14-07-2009
Теги : dude, dude widget, widgets, wordpress, wordpress widgets, ахуенно
Добрый день, с вами говорит автоответчик.
захотелось мне попробовать написать вордпресс виджет! Долго искал тип инсталляшки такой как ВИДЖЕТ! и хрен
оказывается виджеты добавляются плагинами, ну в системе в которой вся структура – метод хендлеров это адекватно я думаю.
значит надо научиться писать плагин
Поехали!
начну с того, что скажу что я не люблю когда плагин валяется просто файлом в папке плагинов, я люблю папку
поэтому создадим папочку wp-content/plugins/dude-test/
а в ней файлик с одноименным названием – dude-test.php
смотрим в админку … нет плагина?
это да, потому что необходимо заполнить метаинформацию о плагине. я много чего придумывал в этой жизни, но пожалуй впервые в вордпрессе заметил что метаинформацию они пишут в МНОГОСТРОЧНЫХ КОММЕНТАРИЯХ .. с одной стороны этопиздец с другой стороны это нормально …ладно, напишем там шапочку
<?php
/*
Plugin Name: dudeTest Widject plugin
Plugin URI: http://hell.helldude.ru/
Description: phpdude Test widget plugin
Author: phpdude
Version: 1
Author URI: http://helldude.ru/
*/
Шикарно! Теперь если обновить страничку с плагинами в админке нашего вордпресса, мы видим что он там появился и его можно активировать
Давайте поиграемся с этой штукой
впишем в файл после шапки die(‘Yeah’); чтоли. активируем плагин и о боже)) видим слово еах! круто наш плагин фурычит.
как дальше воркать будем.
читаем хав то старты и ексамплесы, оттуда понимаем что писать как мы нам не советуют, а советуют как на яваскрипте писать, то есть надо бы поставить инциализацию нашего плагина на момент plugins_loaded, приступаем
function dude_init() {
die(‘yeah!’);
}
add_action(«plugins_loaded»,»dude_init»);
и осталось както проверить что у нас и правда наступил этот момент. не будем придумывать сложности, пройдемся так – просто посмотрим на список инклуженых файлов.
в первом случае это так
print_r(get_included_files());
die();
А во втором вот так
function dude_init() {
print_r(get_included_files());
die();
}
add_action(«plugins_loaded»,»dude_init»);
НУ и смотрим что получается
В первом случае это
Array
(
[0] => /www/wordpress/wp-admin/plugins.php
[1] => /www/wordpress/wp-admin/admin.php
[2] => /www/wordpress/wp-load.php
[3] => /www/wordpress/wp-config.php
[4] => /www/wordpress/wp-settings.php
[5] => /www/wordpress/wp-includes/compat.php
[6] => /www/wordpress/wp-includes/functions.php
[7] => /www/wordpress/wp-includes/classes.php
[8] => /www/wordpress/wp-includes/wp-db.php
[9] => /www/wordpress/wp-includes/cache.php
[10] => /www/wordpress/wp-includes/plugin.php
[11] => /www/wordpress/wp-includes/default-filters.php
[12] => /www/wordpress/wp-includes/pomo/mo.php
[13] => /www/wordpress/wp-includes/pomo/translations.php
[14] => /www/wordpress/wp-includes/pomo/entry.php
[15] => /www/wordpress/wp-includes/pomo/streams.php
[16] => /www/wordpress/wp-includes/l10n.php
[17] => /www/wordpress/wp-includes/formatting.php
[18] => /www/wordpress/wp-includes/capabilities.php
[19] => /www/wordpress/wp-includes/query.php
[20] => /www/wordpress/wp-includes/theme.php
[21] => /www/wordpress/wp-includes/user.php
[22] => /www/wordpress/wp-includes/general-template.php
[23] => /www/wordpress/wp-includes/link-template.php
[24] => /www/wordpress/wp-includes/author-template.php
[25] => /www/wordpress/wp-includes/post.php
[26] => /www/wordpress/wp-includes/post-template.php
[27] => /www/wordpress/wp-includes/category.php
[28] => /www/wordpress/wp-includes/category-template.php
[29] => /www/wordpress/wp-includes/comment.php
[30] => /www/wordpress/wp-includes/comment-template.php
[31] => /www/wordpress/wp-includes/rewrite.php
[32] => /www/wordpress/wp-includes/feed.php
[33] => /www/wordpress/wp-includes/bookmark.php
[34] => /www/wordpress/wp-includes/bookmark-template.php
[35] => /www/wordpress/wp-includes/kses.php
[36] => /www/wordpress/wp-includes/cron.php
[37] => /www/wordpress/wp-includes/version.php
[38] => /www/wordpress/wp-includes/deprecated.php
[39] => /www/wordpress/wp-includes/script-loader.php
[40] => /www/wordpress/wp-includes/class.wp-dependencies.php
[41] => /www/wordpress/wp-includes/class.wp-scripts.php
[42] => /www/wordpress/wp-includes/functions.wp-scripts.php
[43] => /www/wordpress/wp-includes/class.wp-styles.php
[44] => /www/wordpress/wp-includes/functions.wp-styles.php
[45] => /www/wordpress/wp-includes/taxonomy.php
[46] => /www/wordpress/wp-includes/update.php
[47] => /www/wordpress/wp-includes/canonical.php
[48] => /www/wordpress/wp-includes/shortcodes.php
[49] => /www/wordpress/wp-includes/media.php
[50] => /www/wordpress/wp-includes/http.php
[51] => /www/wordpress/wp-includes/widgets.php
[52] => /www/wordpress/wp-includes/vars.php
[53] => /www/wordpress/wp-content/plugins/jobpoll/jobpoll.php
)
а во втором случае
Array
(
[0] => /www/wordpress/wp-admin/plugins.php
[1] => /www/wordpress/wp-admin/admin.php
[2] => /www/wordpress/wp-load.php
[3] => /www/wordpress/wp-config.php
[4] => /www/wordpress/wp-settings.php
[5] => /www/wordpress/wp-includes/compat.php
[6] => /www/wordpress/wp-includes/functions.php
[7] => /www/wordpress/wp-includes/classes.php
[8] => /www/wordpress/wp-includes/wp-db.php
[9] => /www/wordpress/wp-includes/cache.php
[10] => /www/wordpress/wp-includes/plugin.php
[11] => /www/wordpress/wp-includes/default-filters.php
[12] => /www/wordpress/wp-includes/pomo/mo.php
[13] => /www/wordpress/wp-includes/pomo/translations.php
[14] => /www/wordpress/wp-includes/pomo/entry.php
[15] => /www/wordpress/wp-includes/pomo/streams.php
[16] => /www/wordpress/wp-includes/l10n.php
[17] => /www/wordpress/wp-includes/formatting.php
[18] => /www/wordpress/wp-includes/capabilities.php
[19] => /www/wordpress/wp-includes/query.php
[20] => /www/wordpress/wp-includes/theme.php
[21] => /www/wordpress/wp-includes/user.php
[22] => /www/wordpress/wp-includes/general-template.php
[23] => /www/wordpress/wp-includes/link-template.php
[24] => /www/wordpress/wp-includes/author-template.php
[25] => /www/wordpress/wp-includes/post.php
[26] => /www/wordpress/wp-includes/post-template.php
[27] => /www/wordpress/wp-includes/category.php
[28] => /www/wordpress/wp-includes/category-template.php
[29] => /www/wordpress/wp-includes/comment.php
[30] => /www/wordpress/wp-includes/comment-template.php
[31] => /www/wordpress/wp-includes/rewrite.php
[32] => /www/wordpress/wp-includes/feed.php
[33] => /www/wordpress/wp-includes/bookmark.php
[34] => /www/wordpress/wp-includes/bookmark-template.php
[35] => /www/wordpress/wp-includes/kses.php
[36] => /www/wordpress/wp-includes/cron.php
[37] => /www/wordpress/wp-includes/version.php
[38] => /www/wordpress/wp-includes/deprecated.php
[39] => /www/wordpress/wp-includes/script-loader.php
[40] => /www/wordpress/wp-includes/class.wp-dependencies.php
[41] => /www/wordpress/wp-includes/class.wp-scripts.php
[42] => /www/wordpress/wp-includes/functions.wp-scripts.php
[43] => /www/wordpress/wp-includes/class.wp-styles.php
[44] => /www/wordpress/wp-includes/functions.wp-styles.php
[45] => /www/wordpress/wp-includes/taxonomy.php
[46] => /www/wordpress/wp-includes/update.php
[47] => /www/wordpress/wp-includes/canonical.php
[48] => /www/wordpress/wp-includes/shortcodes.php
[49] => /www/wordpress/wp-includes/media.php
[50] => /www/wordpress/wp-includes/http.php
[51] => /www/wordpress/wp-includes/widgets.php
[52] => /www/wordpress/wp-includes/vars.php
[53] => /www/wordpress/wp-content/plugins/jobpoll/jobpoll.php
[54] => /www/wordpress/wp-includes/pluggable.php
[55] => /www/wordpress/wp-includes/default-widgets.php
)
видим 2 разные строчки?
думаю что айс.
теперь мы поняли как правильно проводить инициализацию нашего плагина дабы не напороться на «object not found exception» ну и «logic exception»(в вашей голове конечно).
далее мы можем посмотреть вот сюда
http://codex.wordpress.org/Plugin_API
и вот сюда http://codex.wordpress.org/Plugin_API/Filter_Reference
у меня же задача проще
) надо сделать небольшой виджет.
на этой строчке я задумался «будет ли это ктото читать … ладно допишем уж».
Добавить свой виджет в систему просто – просто надо его заргистрировать через функцию register_sidebar_widget итого
function dude_init() {
register_sidebar_widget(«Dude widget», «dude_widget»);
}function dude_widget() {
}
add_action(«plugins_loaded»,»dude_init»);
круто!
![]()
шикарно, не правда ли? ![]()
казалось бы круто, да не так как я думал … вордпрессовцы не стоят на месте и туториал по которому я это наговнокодил видимо уже устарел, смотрит в файлы вордпресса, я решил глянуть в default-widgets.php и что? ДА! там используется не функция(идиотизм) а класс для работы с виджетом. а на офф сайте сразу оговроюсь я не нашел нормальной документации по виджетам, да и вообще ее там не нашел …
сущеуствует функция register_widget, которй надо передавать имя класс которое является потомком от WP_Widget итого
register_widget(‘WP_Widget_Pages’);
поехали
)
поковыряв исходный класс я понял что существуют функции, которые можно переопределить
вот картиночка с ними
простите за говенное качество фотки, но благодарить надо мспайнт.
А знаете зачем я полез дальше рыться? я банально не понял как одна функция будет все обрабатывать: настройки виджета, его отображение, да епт даже дескрипшн отдавать из функции както ебано, не будет эе эта функция возвращать некий объект/массив, это глупо. Поэтому я стал рыть дальше
и наткнулся на видимо «new wave widgets», странно почему сначала не были использованы классы.
поехали!
function dude_init() {
register_widget(«WP_Widget_DudeWidget»);
do_action(‘widgets_init’);
}
class WP_Widget_DudeWidget extends WP_Widget {
function WP_Widget_DudeWidget()
{
$opts = array();
$opts['description'] = «Dude mega description»;
$this->WP_Widget(__CLASS__, «Dude Widget», $opts);
}
}
add_action(«init»,«dude_init»);
для умных и глазастых скажу, что да! пришлось сменить акшн на «init» и дополнительно вызвать екшн «init_widgets».
теперь все шикарно.
![]()
шикарненько, неправда ли?
ну и дальше можно переписывая предопределенные функции сделать свой ДОСТОЙНЫЙ виджет
вот функции, которые необходимо переписать чтобы наш виджет стал полноценным.
- widget
- update
- form
Ну вот
)) вам удачного виджеточтения, а мне виджетописания
удачи! привет типочкам с ПЫХА.РУ!
Всея ПЫХА
adw0rd
Мавр
ГО
Irinax
Да, оформлять материал ты умеешь
А зачем именно виджет?
да заказ мелкий попался)) + опыт хочется поиметь в этом деле.
оформлять умею – в смысле «не умею» или наоборот «норм оформил»?)
Я себе поставил вордпреcс чтобы больше никогда не лазить в движло сайта
ыы))) ну так это не избалвяет от проблемы кастомного кода =))
Спасибо дуд за статью
Пригодится)
Надо бы зарегится у тебя тут…