В предыдущих частях статьи мы рассмотрели коды, определяющие работу плагина. Для определённой категории простых плагинов этого вполне достаточно. Однако действительно универсальный, настраиваемый пользователем плагин должен иметь страницу(ы) настройки, дабы реализовать свою универсальность.
Обычно плагин, предоставляющий админу блога возможность собственной настройки, имеет одну страницу параметров. Однако, в случае необходимости, в WordPress имеется возможность задать для плагина сколь угодно много страниц настройки (админ-страниц). В этой статье мы рассмотрим все предоставленные WordPress’ом возможности.
Одна страница параметров
Поскольку в качестве материала для примеров написания кодов в этой статье я использую свой плагин Multilingual Comments Number, рассмотрим как админ-страница реализована именно в этом плагине.
Классический метод
1 2 3 4 5 |
function onAdminPage() { if (function_exists('add_options_page')) { $plugin_page = add_options_page(__('Comments Numbering', 'multilingual-comments-number'), __('Comments Numbering', 'multilingual-comments-number'), 8, basename(__FILE__), array(&$this, 'printAdminPage')); } } |
Если Вы помните, функция onAdminPage была заявлена в конструкторе как action для вызова административной страницы:
1 |
add_action('admin_menu', array(&$this, 'onAdminPage')); |
Сама функция вывода страницы выглядит так:
Произошла ошибка. Попробуйте ещё раз позднее. |
Поскольку на сегодняшний день классический метод вывода параметров можно считать устаревшим, я не стану подробно разбирать функцию вывода. Отмечу лишь, что эта функция является универсальной и вместе стем избыточной. Она позволяет произвести вывод любого количества как секций параметров, так и самих параметров, при этом параметры могут быть выведены на экран как в виде текстового поля так и в виде радио-кнопок и списков выбора (select). Всё это можно задать в массиве параметров, служащем исходными данными для вывода на экран.
Современный метод
Начиня с WordPress версии 2.9 появилась возможность использовать Settings API, что позволяет разработчику более гибко обращаться с параметрами плагина.
В последней версии Multilingual Comments Number я использовал именно этот метод.
Объявляем и регистрируеем параметры плагина:
В конструкторе класса плагина добавляем action регистрации параметров:
1 |
add_action('admin_init', array(&$this, 'initSettings')); |
Пишем функцию для регистрации параметров плагина, в которой используются три функции из Settings API:
- add_settings_section – объявляет секцию параметров для их компактного отображения. Все параметры объявленные в секции будут сгруппированы в пределах этой секции. Как именно будет прорисована секция можно определить в callback-функции.
- add_settings_field – объявляет параметр, т.е. заявляет о его существовании и, с помощью callback-функции, определяет способ отображения.
- register_setting – регистрирует ранее объявленный параметр, т.е. заявляет о необходимости сохранения значения параметра в таблицу параметров WordPress. Так же объявляет функцию проверки введённого параметра, если это необходимо.
1 2 3 4 5 6 7 |
function initSettings() { add_settings_section("mcn_section", __("Comments Numbering", 'multilingual-comments-number'), array(&$this, "drawSection"), "discussion"); add_settings_field('mcnZeroString', __("Define empty comments string", "multilingual-comments-number"), array(&$this, 'drawZeroSetting'), 'discussion', 'mcn_section'); add_settings_field('mcnOneString', __("Define one comment string", "multilingual-comments-number"), array(&$this, 'drawOneSetting'), 'discussion', 'mcn_section'); register_setting('discussion', 'mcnZeroString'); register_setting('discussion', 'mcnOneString', array(&$this, 'sanitizeOneString')); } |
Как видите, в данном случае, параметры плагина будут размещены не на отдельной странице, а на странице параметров WordPress “Обсуждение”, что для этого плагина вполне логично. Для этого я задал параметр page как “discussion“, если бы я захотел иметь отдельную страницу параметров, я задал бы что-нибудь вроде “mcn-settings” …
Теперь опишем callback-функции для секции и параметров:
1 2 3 |
function drawSection() { echo __('These are settings of Multilingual Comments Number plugin. Here you can define strings for one comment and absence of comments.', 'multilingual-comments-number'); } |
На сегодняшний день, callback секции может выводить только описание секции …
1 2 3 4 5 6 7 8 9 10 11 |
function drawZeroSetting() { $option = get_option('mcnZeroString'); echo "<input type='text' class='regular-text' style='height: 22px; font-size: 11px; margin: 5px;' name='mcnZeroString' id='mcnZeroString' value='$option' />". "<span class='description'>".__("This is phrase for posts without comments.", 'multilingual-comments-number')."</span>"; } function drawOneSetting() { $option = get_option('mcnOneString'); echo "<input type='text' class='regular-text' style='height: 22px; font-size: 11px; margin: 5px;' name='mcnOneString' id='mcnOneString' value='$option' />". "<span class='description'>".__("This is phrase for posts with one comment.", 'multilingual-comments-number')."</span>"; } |
Как видно из кодов приведённых выше, callback-функции параметров задают внешний вид вывода как самого параметра так и его описания.
Функция проверки параметра довольно проста – в качестве входящего значения передаётся введённый параметр, с ним можносделать всё, что душе угодно:
1 2 3 |
public function sanitizeOneString($input) { return esc_attr($input); } |
Стоит отметить, что вывод параметров на стандартную страницу параметров будет осуществлён автоматически, с помощью встроенных методов Settings API WordPress. В том случае, когда проектируется редактирование параметров плагина на его собственной странице, необходимо эту страницу создать.
Регистрируется страница также как и в “классическом” способе:
1 2 3 4 5 |
function onAdminPage() { if (function_exists('add_options_page')) { $plugin_page = add_options_page(__('Comments Numbering', 'multilingual-comments-number'), __('Comments Numbering', 'multilingual-comments-number'), 8, basename(__FILE__), array(&$this, 'printAdminPage')); } } |
Строится такая страница с использованием встроенных методов settings_fields и do_settings_sections:
Произошла ошибка. Попробуйте ещё раз позднее. |
settings_fields – выводит скрытые поля необходимые для обслуживания страниц параметров.
do_settings_sections – прорисовывает секции и поля параметров, объявленные в коде плагина. К сожалению, вывод данных с помощью этой функции довольно примитивен. Кроме того, не позволяет использовать универсальные call-back функции для однотипных параметров – приходится использовать для каждого параметра свою call-back функцию, что является растранжириванием ресурсов. Как улучшить ситуацию мы рассмотрим в одной из следующих статей, в самое ближайшее время.
Несколько страниц параметров
Серьёзные по объёму плагины часто требуют нескольких страниц параметров, например
- собственно параметры
- параметры элементов хранимых в базе данных
- редактор элементов хранимых в базе данных
Это, по большому счёту, классическая схема. Плагины имеющие огромное количество параметров, не умещающихся на одной странице, обычно используют разбиение параметров не по страницам, а по вкладкам. Разумеется, истина, как всегда, находится где-то посередине, поэтому комбинированный метод отображения параметров (страницы + вкладки) наиболее распространён. Пример: мой плагин Simple View.
Начальные действия идентичны как для классического так и для современного методов.
Так же как и при одностраничном варианте добавляется action в конструктор:
1 |
add_action('admin_menu', array(&$this, 'regAdminPage')); |
затем описываем добавляемые страницы (пример из плагина Simple View):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function regAdminPage() { $menuPage = add_menu_page(__('Simple View Settings', 'simple-view'), __('Simple View', 'simple-view'), 8, 'simple-view-settings', array(&$this, 'svAdminPage'), WP_PLUGIN_URL.'/simple-view/images/sv-icon.png'); $svSubPage = add_submenu_page('simple-view-settings', __('Simple View Settings', 'simple-view'), __('Settings', 'simple-view'), 8, 'simple-view-settings', array(&$this, 'svAdminPage')); add_action('admin_print_scripts-'.$svSubPage, array(&$this, 'adminHeaderPluginScripts')); add_action('admin_print_styles-'.$svSubPage, array(&$this, 'addAdminHeaderPluginStyles')); $fbUploadPage = add_submenu_page('simple-view-settings', __('FloatBox Uploading and Installation', 'simple-view'), __('FloatBox Installation', 'simple-view'), 8, 'floatbox-install', array(&$this, 'fbInstall')); $fbSubPage = add_submenu_page('simple-view-settings', __('FloatBox Settings', 'simple-view'), __('FloatBox Settings', 'simple-view'), 8, 'floatbox-settings', array(&$this, 'fbAdminPage')); add_action('admin_print_scripts-'.$fbSubPage, array(&$this, 'adminHeaderScripts')); add_action('admin_print_styles-'.$fbSubPage, array(&$this, 'addAdminHeaderCSS')); $svGalPage = add_submenu_page('simple-view-settings', __('Galleries', 'simple-view'), __('Galleries', 'simple-view'), 8, 'simple-view-galleries', array(&$this, 'svGalleries')); add_action('admin_print_scripts-'.$svGalPage, array(&$this, 'adminListHeaderScripts')); add_action('admin_print_styles-'.$svGalPage, array(&$this, 'adminListHeaderStyles')); $svGalNewPage = add_submenu_page('simple-view-settings', __('Edit Gallery', 'simple-view'), __('New Gallery', 'simple-view'), 8, 'simple-view-edit-gallery', array(&$this, 'GalleryEdit')); add_action('admin_print_scripts-'.$svGalNewPage, array(&$this, 'adminEditHeaderScripts')); add_action('admin_print_styles-'.$svGalNewPage, array(&$this, 'adminEditHeaderStyles')); } |
при этом, для каждой из добавляемых страниц, можно загрузить таблицы стилей и скрипты javascript.
Для каждой страницы, разумеется, необходимо написать функцию для построения соответствующей страницы параметров Вашего плагина. Правила написания те же, что и для одной страницы параметров (см. выше).
Продолжение следует …
© 2012 – 2014, minimus. Все права защищены. При копировании и републикации статьи, ссылка на первоисточник обязательна.
Комментарии (2)