Делаем плагины для WordPress. Часть 3

Немного рекламы

Оглавление

Введение
Работа с настройками
Делаем страницу настроек
Делаем форму для изменения настроек
Заключение
Комментарии

Введение

В первой и во второй частях статьи мы научились делать плагины, использующие shortcode, и добавили пару новых кнопок на панель инструментов визуального редактора. В третьей части мы рассмотрим вопросы, касающиеся хранения настроек плагина и их изменения через веб-интерфейс.

Работа с настройками

Итак, какие же настройки будет иметь наш плагин? Мы сделаем так, чтобы с помощью настроек можно было бы изменять картинку, которая показывается перед именем ЖЖ-пользователя или сообщества.

Все настройки WordPress хранит в базе данных, таблица которой была создана при установке. У каждой настройки есть свое строковое имя, а в качестве значений настоек используются строковые значения, поэтому числовые параметры перед записью в базу данных нужно будет преобразовывать в строку.

Но перед первым использованием параметров из базы данных мы должны быть уверены, что нужный нам параметр существует. Для этого в WordPress существует функция add_option(), которая добавляет в базу данных параметр со значением по умолчанию, если такого параметра еще не было, и ничего не делает, если параметр уже существует.

У функции add_option() есть несколько аргументов:

  • name - имя параметра, по которому в дальнейшем будет осуществляться доступ для чтения или записи значения параметра. Это единственный обязательный параметр.
  • value - строковое значение по умолчанию. Если этот аргумент не указан, то в качестве значения по умолчанию используется пустая строка.
  • Третий по счету аргумент является устаревшим и его не рекомендуется использовать. Когда-то он назывался $description и предназначался для краткого описания хранимого в базе данных параметра. В WordPress 2.3 этот аргумент функции перестал использоваться и был переименован в $deprecated.
  • autoload - аргумент функции, определяющий должен ли наш параметр автоматически загружать из функции wp_load_alloptions() при каждой загрузке страницы. Возможные значения этого параметра - строка yes или no. По умолчанию используется yes.

Чтобы прочитать параметр из базы данных, используется очень простая функция get_option(), которая принимает всего один аргумент - строку с именем параметра, значение которого мы хотим получить. То есть это имя, которое до этого было передано в качестве первого аргумента $name в функцию add_option(). Функция возвращает строку-значение для запрашиваемого параметра.

Для записи параметра в базу существует функция update_option(), которая принимает два аргумента:

update_option($option_name, $newvalue)
  • 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);
  • page_title - Заголовок страницы, который будет использоваться в теге <title>, когда будет открыто окно с настройками плагина
  • menu_title - Заголовок нового пункта меню
  • access_level/capability - Уровень доступа. Это целочисленное значение, которое определяет какой тип пользователей будет иметь права за изменение этих настроек. Значение этого параметра может лежать в интервале 0 - 10. 0 - даже самые "бесправные" пользователи смогут попасть на эту страницу и изменить настройки. Обычно пользователи с 0-ым уровнем доступа могут изменять только параметры своей учетной записи. 10 - уровень админа. Для настроек плагина обычно достаточно уровня доступа 8. Пользователи с таким уровнем доступа имеют права на изменение темы, управление плагинами, создание страниц и многие другие возможности. Узнать права для каждого уровня доступа можно на этой странице документации.
  • 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&amp;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>"
;
}

Все, теперь наш плагин имеет страницу настроек. Скачать исходные тексты плагина вы можете здесь. В архиве прилагаются два набора картинок, которые можно ставить перед пользователем и сообществом - исходные картинки, которые используются на сервере ЖЖ и они же, но только немного перекрашенные. Их можно куда-нибудь сохранить и использовать в дальнейшем. Вот как, например, теперь может выглядеть ссылка на пользователей ЖЖ и сообщества:

Хотя думаю, что для повседневного использования можно найти или нарисовать картинки посимпатичнее.

Заключение

Осталось кратко вспомнить все действия, которые мы проделали в этой статье.

Для того, чтобы плагин имел страницу настроек необходимо:

  • Создать нужные настройки с помощью функции add_option().
  • Установить хук на действие admin_menu с помощью функции add_action().
  • В функции, установленной на хук add_options_page() создать страницу настроек с помощью функции add_options_page().
  • В созданной функции, которая должна отображать форму, добавить код обработки данных с формы и HTML-код для формы
* При обработке данных в целях безопасности не забыть про использование функций current_user_can() и check_admin_referer().
* В коде HTML для формы не забыть вставиь невидимые поля.
  • Для сохранения настроек использовать функцию update_option().
  • Для чтения настроек использовать функцию get_option().

Продолжение следует...

Немного рекламы

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 4.7/5. Всего 63 голос(а, ов)



Артем 09.04.2011 - 00:04

спасибо!

Jenyay, спасибо, очень подробно, просто супер!

Акф 08.06.2011 - 19:57

Спасибо большое! :)

Adam Pery 27.01.2012 - 16:47

спасибо !!

Jenyay, ждем продолжения!

makprg 05.02.2013 - 19:13

wp

отлично

Djon 18.03.2014 - 12:51

Зачётно рассказал! Освежил и дополнил свои знания)

Вася 15.05.2014 - 18:49

Как сделать кнопки вкл и выкл?

Как сдлать 2-е простые кнопки вкл и выкл плагин в настройках плагина?????confused smiley


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 661
 

Руслан 13.02.2010 - 20:34

Отлично! Спасибо за "расжеванность" !