- Все для CMS | Joomla, Drupal, phpBB, Wordpress, DLE, IPB - http://cmsart.ru -
WordPress: создание плагина, как правильно хранить настройки в базе данных?
Posted By Archi On 31.05.2012 @ 5:31 пп In Статьи Wordpress | No Comments
Замечали ли вы, что не все адекватно сохраняют свои опции в базе данных CMS? Как ни странно, но этим недостатком в некоторой степени подвержены и не очень популярные расширения, и достаточно известные (вроде Dagon Design Sitemap Generator, генератор карты сайта).
И так, пример кода для сохранения настроек плагина в базе данных, используя функции update_option и delete_option.
Конечно можно и с помощью add_option, но в Кодексе критики по поводу этого я не нашел.
Опции будут запоминаться в таблице <префикс, заданный при установке>_options.
<?php
/*
* Опции плагина, для удобства используем массив.
* Здесь задаём список полей формы
*/
$plugname = "My plugin for WordPress";
// Имя плагина, для отображения в админке
$shortname = "mypre";
// Префикс для опции в таблице wp_options
$plugoptions = array (
array( "name" => "Группа настроек №1",
"type" => "title"),
array( "name" => "Опция №1",
"desc" => "Описание опции 1.1",
"id" => $shortname."_opt11",
// В таблице БД будет поле, - mypre_opt11
"std" => "",
// Значение по умолчанию для текстовых полей
"type" => "checkbox"),
// Пусть будет "чекбоксом"
...
array( "name" => "Опция №2",
"desc" => "Описание опции 1.2",
"id" => $shortname."_opt12",
"std" => "",
"type" => "text"),
// Пусть будет однострочным текстовым полем
array( "name" => "Группа настроек №2",
"type" => "title"),
array( "name" => "Опция 2.1",
"desc" => "Описание опции 2.1",
"id" => $shortname."_opt22",
"std" => "",
"type" => "checkbox"),
); ?>
Примерный вид формы с настройками:
<?php
function my_plug_form_for_admin() {
global $plugname, $shortname, $plugoptions;
?>
<div>
<form method="post">
<!-- Данные из формы получаем методом post -->
<table>
<?php foreach ($plugoptions as $value) {
//Считываем список опций из массива
/* Заголовок */
if ($value['type'] == "title") { ?>
//Это для вывода заголовков "групп настроек",
<tr valign="top">
//никаких данных из БД здесь не получаем
<td colspan="2">
<h3 ><?php echo $value['name']; ?></h3>
</td>
</tr>
<!-- Флажок -->
<?php } elseif ($value['type'] == "checkbox") { ?>
<tr valign="top">
<th scope="row"><?php echo $value['name']; ?>:</th>
<td><? if( get_option($value['id']) ) {
//используя WP-функцию get_option,
$checked = "checked=\"checked\"";
//считываем состояние флажка из БД
} else { $checked = ""; } ?>
<input type="checkbox" name="<?php echo $value['id']; ?>"
id="<?php echo $value['id']; ?>" value="true"
<?php echo $checked; ?> />
<br />
<?php echo $value['desc'] ; ?>
//выводим описание опции, не из базы
</td>
</tr>
<!-- Текстовое поле ввода -->
<?php } elseif ($value['type'] == "text") { ?>
<tr valign="top">
<th scope="row"><?php echo $value['name']; ?>:</th>
<td><input name="<?php echo $value['id']; ?>"
id="<?php echo $value['id']; ?>"
type="<?php echo $value['type']; ?>"
value="<?php if (get_option( $value['id'] ) != "") {
echo htmlspecialchars(
get_option( $value['id'] ) );
} else { echo $value['std']; } ?>" />
<br />
<?php echo $value['desc'] ; ?>
</td>
</tr>
<?php
}
} ?>
<!-- Конец цикла считывания данных -->
</table>
<div>
<!-- Кнопки действий -->
<input name="save" type="submit" value="Сохранить" />
<input name="reset" type="submit" value="Сбросить" />
</div>
</form>
</div>
<?php
}
// Конец функции
?>
«Обработчик» данных или «Что будем делать с полученной информацией от формы?»:
function my_plug_handler() {
global $plugname, $shortname, $plugoptions;
if ( isset($_POST['save']) ) {
foreach ($plugoptions as $value) {
// Запомним настройки в таблицу wp_options
update_option( $value['id'], $_REQUEST[ $value['id'] ] );
}
echo '<div id="message"><p><strong>' .
'Настройки "'.$plugname.'" успешно сохранены.' .
'</strong></p></div>';
} else if ( isset($_POST['reset']) ) {
// При сбросе: удаляем записи опций из БД
foreach ($plugoptions as $value) {
delete_option( $value['id'] );
}
echo '<div id="message"><p><strong>' .
'Настройки "'.$plugname.'" успешно сброшены.' .
'</strong></p></div>';
}
/* Добавим в меню "Параметры" */
add_options_page($plugname.": настройки",
// Заголовок страницы с опциями плагина
"Код перед/за постом",
// Название нового пункта меню
'edit_plugins',
// Права доступа ("полномочия") пользователя
basename(__FILE__),
// Уникальное имя файла
'my_plug_form_for_admin');
// Функция с кодом формы для админки, см. выше
}
Зарегистрировать новое действие в админке WordPress можно с помощью:
<?php add_action('admin_menu', 'my_plug_handler'); ?>
Описываемый способ ориентирован прежде всего для применения в «лёгковесных» плагинах. А вот при написании «тяжеловесов» целесообразней выбрать другой подход. Например, создавая отдельные таблицы, как это сделано в WP-Polls (система опросов для WordPress).
Посмотреть всё вышесказанное в действии вы можете, скачав этот для вставки произвольного кода в начале/конце поста.
Источник: sooource.net [3]
Article printed from Все для CMS | Joomla, Drupal, phpBB, Wordpress, DLE, IPB: http://cmsart.ru
URL to article: http://cmsart.ru/wordpress/wordpress-articles/wordpress-sozdanie-plagina-kak-pravilno-hra
URLs in this post:
[1] плагины для WordPress: http://cmsart.ru/goto/http://www.sooource.net/wordpress/twpplugin
[2] плагин: http://cmsart.ru/goto/http://www.sooource.net/accip
[3] sooource.net: http://cmsart.ru/?goto=http%3A%2F%2Fwww.sooource.net
Click here to print.
Copyright © 2012 Поддержка CMS | Документация, статьи по Joomla, Drupal, phpBB. All rights reserved.