Главная » WordPress » Статьи Wordpress » WordPress: создание плагина, как правильно хранить настройки в базе данных?
Распечатать статью

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

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

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи