- Все для CMS | Joomla, Drupal, phpBB, Wordpress, DLE, IPB - http://cmsart.ru -

WordPress: создание плагина, как правильно хранить настройки в базе данных?

Posted By Archi On 31.05.2012 @ 5:31 пп In Статьи Wordpress | No Comments

Замечали ли вы, что не все плагины для WordPress [1] адекватно сохраняют свои опции в базе данных 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).

Посмотреть всё вышесказанное в действии вы можете, скачав этот плагин [2] для вставки произвольного кода в начале/конце поста.

Источник:  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

Copyright © 2012 Поддержка CMS | Документация, статьи по Joomla, Drupal, phpBB. All rights reserved.