Создаём страницу настроек для WordPress плагина
Продолжим разговор о том, как написать свой плагин для WordPress.
В прошлый раз мы рассмотрели вопрос предустановленные настройки wordpress плагина, а сегодня попробуем написать его административную страницу. Для начала приведу функцию создания этой страницы, а затем на некоторых моментах остановлюсь подробней. В принципе основные сведения были даны в предыдущей части руководства, здесь же достаточно просто кода с комментариями.
Функция создания страницы настроек для плагина WordPress
function myplugin_options_page() { //Функция создания и обработки страницы настроек плагина
global $wpdb, $myplugin_prefs_table;
$myplugin_options = array( //Создаём массив с настройками плагина
'myplug_modify_title',
'myplug_modify_content',
);
$cmd = $_POST['cmd']; //Обработка пользовательского ввода
foreach ($myplugin_options as $myplugin_opt) {
$$myplugin_opt = get_option($myplugin_opt);
}
if ($cmd == "del_prefs") { //Если нажато "удалить фразы" - очищаем таблицу настроек плагина
$sql = "TRUNCATE TABLE $myplugin_prefs_table";
$wpdb->query( $sql );
?>
<div class="updated"><p><strong> <?php echo __('All phrases are removed from the database','example_plugin'); ?></strong></p></div> /* Сообщаем пользвателю об успешной очистке. */
<?php
}
if ($cmd == "add_prefs" && $_POST['prefs_base']) { //Если введены новые фразы в соотв. поле - обработаем их
$lines = explode("\n", $_POST['prefs_base']); //Ввод разбивается на строки и кладётся в массив, разделитель - перевод строки
foreach($lines as $line){ //Перебираем массив со строками
$line = trim($line); //Обрезка каждой строки от переводов
if (!$line) continue; //Если строка отстутствует - переходим к следующей итерации
list($title, $body) = explode("|", $line); //Разделение строки на две подстроки
//Кладём подстроки в таблицу плагина.
$sql = "INSERT INTO $myplugin_prefs_table (title, body) VALUES('$title','$body')";
$wpdb->query($sql);
}
?>
<div class="updated"><p><strong> <?php echo __('Phrases added to the database','example_plugin'); ?></strong></p></div> /*Сообщаем пользователю об успешной обработке*/
<?php
}
if ($cmd == "myplugin_save_opt") { //Обработка нажатия "Сохранить настройки"
foreach ($myplugin_options as $myplugin_opt) { //Перебор массива с настройками
$$myplugin_opt = $_POST[$myplugin_opt]; //Каждому элементу массива присваиваем введённое пользователем занчение
}
foreach ($myplugin_options as $myplugin_opt) { //Обновляем настройки плагина в таблице настроек wordpress
update_option($myplugin_opt, $$myplugin_opt);
}
?>
<div class="updated"><p><strong> <?php echo __('Settings saved','example_plugin'); ?></strong></p></div>
<?php
}
?>
<div class="wrap">
<h2>My Plugin</h2> /*Заголовок страницы настроек плагина*/
<h3><?php echo __('Settings','example_plugin'); ?></h3> /*Название раздела настроек*/
/*Начало формы для обработки настроек. Форма содержит 2 чекбокса, включающих или отключающих соответствующие функции плагина*/
<form method="post" action="<? echo $_SERVER['REQUEST_URI'];?>">
<table class="form-table">
<tr>
<th colspan=2 scope="row"> /*Первый чекбокс - будет ли плагин обрабатывать заголовки записей*/
<input name="myplug_modify_title" type="checkbox" <?if($myplug_modify_title)echo "checked";?>> <?php echo __('Add random phrase to post title','example_plugin'); ?>
</th>
</tr>
<tr>
<th colspan=2 scope="row"> /*Второй чекбокс - будет ли плагин обрабатывать тело записей*/
<input name="myplug_modify_content" type="checkbox" <?if($myplug_modify_content)echo "checked";?>> <?php echo __('Add random phrase to post content','example_plugin'); ?>
</th>
</tr>
</table>
<input type="hidden" name="cmd" value="myplugin_save_opt"> /*"Функциональная" часть кнопки сохранения настроек*/
<p class="submit">
<input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" /> /*Вывод кнопки сохранения настроек в браузер. Стандартная функция WordPress*/
</p>
</form> /*Конец формы обработки настроек*/
/*Вывод информации о плагине. Например - кем разработан*/
<h3><?php echo __('Plugin developed','example_plugin'); ?></h3>
<table class="form-table">
<tr><th>
<ul>
<li><?php echo __('By: <a href="https://dimio.org/" target="_blank">dimio</a>','example_plugin'); ?></li>
</ul>
</th></tr></table>
/*Блок ввода новых фраз в таблицу настроек плагина. Сначала идёт справка для пользователя*/
<h3><?php echo __('Adding phrases','example_plugin'); ?></h3>
/*Начало формы ввода. Форма содержит текстовое поле для ввода шириной 80 символов и высотой 12 строк*/
<table class="form-table" width="300px">
<tr>
<td>
<?php echo __('Format phrases: Title|Body','example_plugin'); ?><br />
<form method="post" action="<? echo $_SERVER['REQUEST_URI'];?>">
<textarea cols=80 rows=12 name="prefs_base"></textarea> /*Поле для ввода новых фраз*/
</td>
</tr>
</table>
/*Кнопка для сохранения фраз. По аналогии с кнопкой сохранения настроек, но без применения стандартной ф-и WordPress*/
<input type="hidden" name="cmd" value="add_prefs">
<p class="submit">
<input type="submit" name="Submit" value="<?php echo __('Add phrases','example_plugin'); ?>" />
</p>
</form>
/*Форма, содержащая единственную кнопку - очистки таблицы настроек плагина*/
<form method="post" action="<? echo $_SERVER['REQUEST_URI'];?>">
<input type="hidden" name="cmd" value="del_prefs">
<input type="submit" name="Submit" value="<?php echo __('Remove all phrases from the database','example_plugin'); ?>" />
</form>
</div>
<?php
//Конец функции создания и обработки страницы настроек.
}
?>
Я постарался прокомментировать в коде все ключевые моменты, для глубокого понимания в любом случае стоит читать про html и CGI-программирование в целом. Хотя в принципе – здесь всё интуитивно понятно, а если будет необходимость добавить новые элементы на страницу настроек – обращайтесь, как минимум – подскажу, в какую сторону копать.
В следующем выпуске я перейду к рассмотрению функциональной части плагина для WordPress. Расскажу, как написать для плагина функции, получающие данные из базы и модифицирующие wordpress-публикации.
Затем займёмся русификацией плагина (внимательные должны были обратить внимание на вызовы вида Add phrases
– это как раз задел для будущего грамотного перевода (фактически – интернационализации) плагина).
А в заключение – расскажу, как отправить свой плагин для проверки и последующей публикации в репозитории WordPress на wordpress.org.
Не пропустите! 🙂
P.S. По-прежнему доступен для скачивания файл плагина, уже обновлённый.
Другие заметки по созданию плагина для WordPress
<-- Часть 3. Подготовка к созданию страницы настроек плагина |
Часть 5. Функциональная составляющая плагина WordPress –> |
Общее оглавление к циклу заметок по созданию плагина для WordPress |
Вообще клёвое описание. Но впредь рекомендую использовать либо “case” – либо конструкцию “if…ifelse…else”
Почему? Ну чисто для восприятия.
Понятно что у тебя обработка переменной $cmd идёт – но знаешь, более понятно будет если эти все обработки будут единым целым, а не отдельными условиями. Кстати тут ещё есть один момент: производительность
Потому как в твоём случае код барыбыр (всё равно) будет проверять все условия. Но применив предложенную конструкцию код, достигнув нужного результата, просто прекратит дальнейший поиск соответствия. А это сокращение процессорного времени. Ещё один плюс. Это читабельность. Когда ты смотришь конструкцию case или “if…ifelse…else” ты понимаешь что это единая обработка, и тут либо либо. И можешь банально забить на этот блок до нужного момента 🙂
Извини за несколько невнятный текст : говорить никогда нормально не умел.
Мысль ясна в принципе. Переписать в виде if {} elsif {} будет разумно.
Чтобы добиться сокращения процессорного времени, нужно варианты перебора выстроить в наиболее вероятной последовательности, а не так, как они сейчас стоят.
В том числе.
Ну ты реально жжош! Столько кода, да ещё и без нормальных объяснений!!! 🙂 Пока 3+ это максимум 🙂 Совет: пиши так, чтобы ЛЮДЯМ было понятно и интересно, а не только тебе, дорогой аффтар!
Зря. Я согласен что не самый оптимальный код – но комментарии предельно понятные.
Ну не то, чтобы код плохой, нет! Просто как-то в него слишком резко въехали, что называется, без предварительных ласк 🙂 . Нужно было в предыдущих постах как-то расшарить эту информацию, чтобы даже чайнику (коим я уже не являюсь) было всё понятно. А вот у меня вопросы и вопросы…
Конечно, только автор в самом начале оговорился о том, что он изучил php именно на из-за желания написать плагин. I.M.H.O. для малоопытного программиста – статья ничего.
Сделал все по примерам, до создания страницы. Решил проверить. При активации плагина появляется сообщение: “Плагин произвёл при активации 292 символов неожиданного вывода. …”
Notepad++, UTF-8 без BOM
WP 3.1.1
3.1.1 у меня нет. Последнее, на чём проверял – 2.9.2.
В процессе написания этих заметок я делал плагин, который у меня сейчас работает на версии 3.1. ([ссылка]). Можете с ним сравнить, будет ошибка или нет.
Все проще. CR LF после ?>
Внимательнее надо быть