Делаем плагины для WordPress. Часть 3
ОглавлениеВведение ВведениеВ первой и во второй частях статьи мы научились делать плагины, использующие shortcode, и добавили пару новых кнопок на панель инструментов визуального редактора. В третьей части мы рассмотрим вопросы, касающиеся хранения настроек плагина и их изменения через веб-интерфейс. Работа с настройкамиИтак, какие же настройки будет иметь наш плагин? Мы сделаем так, чтобы с помощью настроек можно было бы изменять картинку, которая показывается перед именем ЖЖ-пользователя или сообщества. Все настройки WordPress хранит в базе данных, таблица которой была создана при установке. У каждой настройки есть свое строковое имя, а в качестве значений настоек используются строковые значения, поэтому числовые параметры перед записью в базу данных нужно будет преобразовывать в строку. Но перед первым использованием параметров из базы данных мы должны быть уверены, что нужный нам параметр существует. Для этого в WordPress существует функция add_option(), которая добавляет в базу данных параметр со значением по умолчанию, если такого параметра еще не было, и ничего не делает, если параметр уже существует. У функции add_option() есть несколько аргументов:
Чтобы прочитать параметр из базы данных, используется очень простая функция get_option(), которая принимает всего один аргумент - строку с именем параметра, значение которого мы хотим получить. То есть это имя, которое до этого было передано в качестве первого аргумента $name в функцию add_option(). Функция возвращает строку-значение для запрашиваемого параметра. Для записи параметра в базу существует функция update_option(), которая принимает два аргумента: update_option($option_name, $newvalue)
Как видите, работать с параметрами, хранящимися в базе, очень легко. Исправим конструктор класса нашего плагина ljusers таким образом, чтобы в нем создавались нужные параметры. Для этого добавим в него следующие строки: add_option('ljusers_userinfo', 'http://p-stat.livejournal.com/img/userinfo.gif'); add_option('ljusers_community', 'http://www.livejournal.com/img/community.gif'); Первая строка создает параметр ljusers_userinfo, который будет содержать ссылку на картинку с человечком перед именем пользователя. По умолчанию будем использовать ссылку на соответствующую картинку из ЖЖ. Затем создается второй параметр с именем ljusers_community, который хранит ссылку на картинку, которая показывается перед именем сообщества. По умолчанию, опять же, будет использоваться ссылка на картинку, которая используется в ЖЖ. В будущем, когда мы сделаем возможность изменять эти ссылки, эти параметры не мешало бы поменять на ссылки, указывающие на картинки на вашем сервере, чтобы не зависеть от сервера ЖЖ. Делаем страницу настроекТеперь осталось разобраться с тем, как делать страницы с настройками, отображаемые в главном меню панели администрирования. Мы будем делать страницу настроек в разделе "Параметры". Для этого нам необходимо установить хук на действие (action) под названием admin_menu. Хуки на действия устанавливаются аналогично тому, как мы устанавливали их на фильтры в прошлой части статьи, только вместо функции add_filter() используется похожая функция add_action(). Функция add_action() также принимает два параметра:
Таким образом, нам надо добавить следующую строку в конструктор класса ljusers: add_action('admin_menu', array (&$this, 'admin') ); Здесь мы добавляем хук на действие admin_menu, причем обработчик хука - функция admin() внутри класса, которую нам надо будет создать. Полностью конструктор класса ljusers теперь выглядит следующим так: function ljusers() { add_option('ljusers_userinfo', 'http://p-stat.livejournal.com/img/userinfo.gif'); add_option('ljusers_community', 'http://www.livejournal.com/img/community.gif'); if (function_exists ('add_shortcode') ) { add_shortcode('ljuser', array (&$this, 'user_shortcode') ); add_shortcode('ljcomm', array (&$this, 'community_shortcode') ); add_filter( 'mce_buttons_3', array(&$this, 'mce_buttons') ); add_filter( 'mce_external_plugins', array(&$this, 'mce_external_plugins') ); add_action('admin_menu', array (&$this, 'admin') ); } } Функция для обработки хука admin() не должна иметь входных параметров. Внутри нее мы будем использовать функцию движка WordPress - add_options_page(), которая как раз и добавляет страницу в раздел "Options" или, говоря по-русски, "Параметры". Еще объявление выглядит следующим образом: add_options_page(page_title, menu_title, access_level/capability, file, func);
Давайте создадим для начала пустую страницу настроек. Для этого функция admin() у нас будет выглядеть следующим образом: function admin () { if ( function_exists('add_options_page') ) { add_options_page('LJusers Options', 'LJUsers', 8, basename(__FILE__), array (&$this, 'admin_form') ); } } Если функция add_options_page() существует, то мы создаем страницу настроек с заголовком LJusers Options. Новый пункт меню будет называться LJUsers. Изменять настройки нашего плагины смогут пользователи с уровнем доступа 8 и выше, а отображать собственно страницу будет функция admin_form(), которую мы сейчас создадим. Пусть для начала в ней мы просто будем читать интересующие нас параметры: function admin_form() { $userinfo_url = get_option('ljusers_userinfo'); $community_url = get_option('ljusers_community'); } Если теперь установить наш плагин в таким виде (скачать его можно отсюда), то в меню "Параметры" появится новый подпункт "LJUsers": ![]() Делаем форму для изменения настроекНам осталось сделать форму, в которой будет выводиться текущие значения параметров, и через которую эти параметры можно будет изменять. Давайте сначала посмотрим на функцию admin_form(), в которой и осуществляется создание формы, а затем подробно разберем ее код function admin_form() { $userinfo_url = get_option('ljusers_userinfo'); $community_url = get_option('ljusers_community'); if ( isset($_POST['submit']) ) { if ( function_exists('current_user_can') && !current_user_can('manage_options') ) die ( _e('Hacker?', 'ljusers') ); if (function_exists ('check_admin_referer') ) { check_admin_referer('ljusers_form'); } $userinfo_url = $_POST['userinfo_url']; $community_url = $_POST['community_url']; update_option('ljusers_userinfo', $userinfo_url); update_option('ljusers_community', $community_url); } ?> <div class='wrap'> <h2><?php _e('LJUsers Settings', 'ljusers'); ?></h2> <form name="ljusers" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>?page=ljusers.php&updated=true"> <!-- Имя ljusers_form используется в check_admin_referer --> <?php if (function_exists ('wp_nonce_field') ) { wp_nonce_field('ljusers_form'); } ?> <table class="form-table"> <tr valign="top"> <th scope="row"><?php _e('Userinfo image url:', 'ljusers'); ?></th> <td> <input type="text" name="userinfo_url" size="80" value="<?php echo $userinfo_url; ?>" /> </td> </tr> <tr valign="top"> <th scope="row"><?php _e('Community image url:', 'ljusers'); ?></th> <td> <input type="text" name="community_url" size="80" value="<?php echo $community_url; ?>" /> </td> </tr> </table> <input type="hidden" name="action" value="update" /> <input type="hidden" name="page_options" value="ljusers_userinfo,ljusers_community" /> <p class="submit"> <input type="submit" name="submit" value="<?php _e('Save Changes') ?>" /> </p> </form> </div> <? } Функция admin_form() по сути состоит из двух частей. Первая часть - ветвь оператора if, когда значение isset($_POST['submit']) истинно (то есть, если на эту страницу мы попали уже после нажания кропки submit). Вторая часть - смесь кода PHP и HTML для создания формы. Сначала разберем вторую часть, в которой создается форма, следуя рекомендациям документации, благодаря чему внешний вид окон настроек всех плагинов одинаков и хорошо вписывается в оформление всей панели администрирования. Итак, мы создаем форму с именем ljusers, которая будет передаваться методом POST. Обрабатывать эту форму будет наш же файл. Если вы посмотрите адрес страницы настроек нашего плагина, то увидите, что он выглядит примерно так: http://.../wp-admin/options-general.php?page=ljusers.php. Кроме того в конец этого адреса мы добавляем параметр updated=true, который нужен только для того, чтобы после изменения настроек выводилось сообщение "Настройки сохранены". Потом мы добавляем в форму два скрытых поля, которые в дальнейшем помогут определить, что форма была заполнена со страницы настройки, а не подделана кулхацкерами. Работу по вставке скрытых полей берет на себя функция wp_nonce_field(). Чтобы избежать ошибок, мы предварительно проверяем существует ли эта функция. wp_nonce_field() принимает один параметр, который будет обозначать нашу форму. В коде мы использовали для этого строку ljusers_form. Затем идет таблица, внутри которой располагаются строки ввода для параметров и их описания. Сам HTML-код взят из документации. В ней лучше ничего не менять, что касается оформления, а с полями ввода, думаю, вопросов не возникнет. После таблицы располагаются еще два скрытих поля, смысл которых можно обозначить как "шаманство". В одном из них, скрытом поле с именем page_options, в строке-значении атрибута value необходимо через запятую перечислить имена параметров в базе данных, которые будут обновляться. После этих скрытых полей располагается кнопка для сохранения изменений. Первая часть функции admin_form(), отвечающая за сохранение параметров, очень простая. Сначала с помощью функции движка current_user_can() мы проверяем, что у пользователя достаточно прав для изменения настроек. Затем вызываем функцию check_admin_referer(), с помощью которой проверяется, что пользователь перешел на текущую страницу с одной из страниц администрирования. В противном случае выполнение скрипта прерывается. В качестве параметра этой функции надо передавать ту же текстовую строку, которая передавалась до этого в функцию wp_nonce_field(). Ну а после этих двух проверок настройки сохраняются с помощью функции update_option(), которую мы рассматривали в самом начале статьи. Теперь мы можем можем изменять настройки. Нам осталось только немного подправить функции, реагирующие на shortcodes таким образом, чтобы они использовали эти настройки. Здесь, думаю, все будет понятно без комментариев: function user_shortcode ($atts, $content = null) { $userinfo_url = get_option ('ljusers_userinfo'); return "<span style='white-space: nowrap; display: inline !important;'> <a href='http://$content.livejournal.com/profile'> <img src='$userinfo_url' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;vertical-align:middle; margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0;' /></a> <a href='http://$content.livejournal.com/'> <b>$content</b></a></span>"; } function community_shortcode ($atts, $content = null) { $community_url = get_option ('ljusers_community'); return "<b><span style='white-space: nowrap;'> <a href='http://community.livejournal.com/$content/profile'> <img src='$community_url' alt='[info]' width='17' height='17' style='vertical-align: middle; border: 0; padding-right: 1px; margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0;' /></a> <a href='http://community.livejournal.com/$content'> <b>$content</b></a></span></b>"; } Все, теперь наш плагин имеет страницу настроек. Скачать исходные тексты плагина вы можете здесь. В архиве прилагаются два набора картинок, которые можно ставить перед пользователем и сообществом - исходные картинки, которые используются на сервере ЖЖ и они же, но только немного перекрашенные. Их можно куда-нибудь сохранить и использовать в дальнейшем. Вот как, например, теперь может выглядеть ссылка на пользователей ЖЖ и сообщества: ![]() Хотя думаю, что для повседневного использования можно найти или нарисовать картинки посимпатичнее. ЗаключениеОсталось кратко вспомнить все действия, которые мы проделали в этой статье. Для того, чтобы плагин имел страницу настроек необходимо:
* При обработке данных в целях безопасности не забыть про использование функций current_user_can() и check_admin_referer().
* В коде HTML для формы не забыть вставиь невидимые поля.
Продолжение следует... Пожалуйста, оцените материал
|