Пишем плагин для WordPress. Подготовка к созданию страницы настроек (часть 3).

Пишем-напишем плагин для вордпресс (wordpress plugin)
wp-plugin

Итак, мы уже знаем, как вызвать функцию создания настроек для плагина в процессе его установки (при помощи вызова register_activation_hook(__FILE__, 'myplugin_set_options'); , где __FILE__ будет автоматически заменено на вызов файла плагина). Теперь для того, чтобы написать WordPress плагин, нам нужно установить опции по умолчанию (создав соответствующие записи в таблице prefix_options*) и создать для него страницу настроек, на которой пользователь сможет управлять поведением плагина.
*prefix_options – таблица mySQL с настройкам wordpress. prefix задаётся в файле wp-config при установке wordpress и по умолчанию имеет занчение wp (т. е. таблица называется wp_options).

Создание и удаление настроек при написании wordpress плагина

Создание настроек по умолчанию и таблицы с настройками плагина.

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

  • Получаем префикс имён таблиц для данного wordpress-блога, чтобы написанный плагин создавал таблицу своих настроек с тем же префиксом в названии


    $myplugin_prefs_table = myplugin_get_table_handle(); # в этой переменной будет содержаться имя таблицы с настройкам написанного нами плагина wordpress
    function myplugin_get_table_handle() {
    global $wpdb; # класс wordpress для работы с БД
    return $wpdb->prefix . "myplugin_preferences"; # создаём имя таблицы настроек плагина
    }

  • Устанавливаем настройки плагина по умолчанию в таблице wordpress prefix_options и создаём собственную таблицу с настройками:


    function myplugin_set_options() {
    global $wpdb;
    add_option('myplug_modify_title', 0); # будет ли плагин по умолчанию обрабатывать заголовки записей. 0 - нет
    add_option('myplug_modify_content', 1); # --||-- тело записей. 1 - да

    $myplugin_prefs_table = wpsig_get_table_handle(); # вызов функции повторяется, т. к. данные действия происходят на этапе установки плагина, когда вызов в теле еще не может быть осуществлён
    $charset_collate = ''; # кодировка БД
    if ( version_compare(mysql_get_server_info(), '4.1.0', '>=') )
    $charset_collate = "DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci"; # устанавливаем уникод

    if($wpdb->get_var("SHOW TABLES LIKE '$myplugin_prefs_table'") != $myplugin_prefs_table) { # если таблица настроек плагина еще не создана - создаём
    $sql = "CREATE TABLE `" . $myplugin_prefs_table . "` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(255) NOT NULL default '',
    `body` VARCHAR(255) NOT NULL default '',
    UNIQUE KEY id (id)
    )$charset_collate";
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); # обращение к функциям wordpress для
    dbDelta($sql); # работы с БД. создаём новую таблицу
    }
    }

Раз мы пишем плагин, мы должны знать, как в дальнейшем работать с его опциями:
add_option — функция wordpress, создающая новые записи в таблице prefix_options;
get_option – функция, извлекающая значение настроек;
update_option служит для обновления записей (настроек), а
delete_option используется для их удаления.

Удаление настроек плагина при деинсталляции


function myplugin_unset_options () {
global $wpdb, $myplugin_prefs_table;
delete_option('myplug_modify_title');
delete_option('myplug_modify_content');
$sql = "DROP TABLE $myplugin_prefs_table";
$wpdb->query($sql);
}

Создание и вывод страницы настроек плагина.

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

Размещение ссылки на страницу настроек плагина.

Во-первых, необходимо решить, где мы разместим ссылку на страницу с настройками нашего wordpress плагина. Возможные варианты — разместить её в главном административном меню wordpress (например, после пункта “Настройки”, делать так рекомендуется лишь в том случае, если ваш плагин вносит какие-то значительные изменения в функционал wordpress и отдельное меню для него необходимо), или же разместить страницу настроек внутри пункта “Настройки” (именно так мы и поступим). Напишем в плагине следующий код:

function myplugin_admin_page() {
add_options_page('MyPlugin', 'MyPluginButton', 8, __FILE__, 'myplugin_options_page');
}

Поясню, что же здесь происходит:
add_options_page — вызывается стандартная функция wordpress для установки страницы настроек.
MyPlugin — заголовок страницы настроек плагина;
MyPluginButton — название кнопки в меню, служащей для перехода к странице настроек;
8 — уровень прав доступа пользователя, которому будет видна кнопка (в данном случае — не ниже администратора), чем больше цифра — тем выше должны быть права;
__FILE__ – вызов файла с нашим плагином (если функции, отвечающие за работу со страницей настроек, находятся не в основном файле скрипта, необходимо указать путь к файлу с ними). Для больших плагинов со сложной структурой может потребоваться.
myplugin_options_page — имя функции, занимающейся созданием страницы настроек и дальнейшей работой с ней.

Формирование страницы с настройками

С размещением кнопки-ссылки на страницу настроек мы определились, продолжаем писать плагин.
Сейчас я лишь кратко перечислю основные принципы и способы создания страницы настроек, поскольку функция её создания — самая большая (по объему кода) в нашем тестовом плагине и она достойна разбора с подробными комментариями в рамках отдельной, следующей части руководства на тему “Как написать плагин wordpress“.

Итак, страница настроек плагина в wordpress представляет собой обыкновенную html страницу (вот так вот банально устроен мир 🙂 ), внутри которой создаются различные поля для ввода пользовательских данных. Чтобы понимать структуру этой страницы, необходимо быть знакомым с cgi-программированием в целом (кому интересно – ищите книги по cgi-программированию в “Библиотеке“). Если объяснять на пальцах, это выглядит следующим образом:

  • вывод общей информации (заголовок, описание, справка и т. п.);
  • создание формы (вся работа с пользовательским вводом организуется путем вывода форм и дальнейшего получения их параметров);
  • создание внутри формы полей для пользовательского ввода (переключатели-чекбоксы, радиокнопки, выпадающие меню в виде списков, поля для ввода текста и т. п.);
  • получение из формы введённых пользователем данных;
  • обработка полученных данных (проверка на соответствие неким критериям, выполнение действий над данными и т. д.)
  • возврат пользователю результатов обработки введённых им данных (в нашем случае — отмеченный галочкой чекбокс, надпись “Настройки сохранены” и т. п.)

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

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

Всем успехов!

Другие заметки по созданию плагина для WordPress

<-- Часть 2. Общая теория по создания плагинов к WordPress
Часть 4. Создание страницы настроек плагина в админке WordPress –>
Общее оглавление к циклу заметок по созданию плагина для WordPress

16 мыслей о “Пишем плагин для WordPress. Подготовка к созданию страницы настроек (часть 3).”

  1. Огромное спасибо автору за проделанную работу! Реальное пособие для написания плагинов, хотя конечно вопросы будут возникать, особенно если уровень программирования не велик. Ждите наших вопросов!

  2. При активации плагина получаю сообщение об ошибке –
    Call to undefined function wpsig_get_table_handle() in wp\wp-content\plugins\example_plugin.php on line 21

  3. dimio пишет::

    myplugin_get_table_handle

    я тоже так подумал и заменил wpsig_get_table_handle() на myplugin_get_table_handle()

    Но в итоге:
    Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, ‘wpsignaturer_admin_page’ was given in E:\!web\!!www\wp\wp-includes\plugin.php on line 339

    Если не трудно, то протестируйте свой пример, ссылку на который вы даёте.
    Буду очень благодарен, если вы поправите ошибки, очень уж хочется разобраться, но при этом не понимаешь где косяк… 🙂

  4. Спасибо, посмотрю.
    Не подскажите каким образом в плагине добавить возможность добавления индивидуальных данных в конкретный пост. Т.е. когда у плагина есть своё поле в разделе редактирования поста?

    1. Если я правильно понял вопрос – это надо делать через “произвольные поля (custom fields)”. Почитайте тут например: [ссылка]
      Создаются они фунецией wordpress add_post_meta[ссылка] (англ.)
      И самая исчерпывающая информация (тоже на англ.): [ссылка]

  5. Ну вот, с каждым постом всё лучше и лучше 🙂 И уже не хочу желать тебе, о dimio, аффтар, выпей йаду! 🙂 Но если серьёзно, то советую в постах давать какой-либо пример написания плагина. То есть по ходу этого мини-подкурса сам аффтар, т.е. ты рассказываешь как написать тот или иной плагин, напр., плагин постраничной навигации или капчи 🙂 Ну а если таланта к php нет, то можно хотябы посточно разбирать какой-либо уже готовый плагин 🙂 Жги, аффтар!

  6. Всё хорошо написано, автор молодец! Но в тексте логическая ошбика, если я не ошибся!
    Вот это wpsig_get_table_handle() Должно быть myplugin_get_table_handle() если следовать логике.

    1. wpsig – это сокращенное название плагина у автора. wpsig нужно заменить на myplugin, если наш плагин – myplugin. Вместо myplugin можете поставить произвольное сокращенное название вашего плагина

  7. У кого ошибка “Call to undefined function wpsig_get_table_handle() in …”

    Вы забыли определить функцию:

    function myplugin_get_table_handle() {
    global $wpdb; # класс wordpress для работы с БД
    return $wpdb->prefix . “myplugin_preferences”; # создаём имя таблицы настроек плагина
    }

    И потом уже вызывайте ее:

    $myplugin_prefs_table = myplugin_get_table_handle();

    Вместо `myplugin` можете использовать свой вариант

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *