Эффективный способ сохранения настроек плагина
Я рассматриваю варианты сохранения настроек для разрабатываемого плагина. Первый очевидный кандидат - таблица wp_options.
Читая книгу "Pro WP Plugin Development", я наткнулся на следующее:
Каждая сохранённая настройка добавляет новую запись в таблицу опций WordPress. Вы можете просто хранить несколько настроек сразу в одном массиве: это предотвращает захламление базы данных и обновляет значения одним MySQL-запросом для большей эффективности и скорости.
С другой стороны, я предполагаю, что если у плагина много настроек, хранение всего в одном массиве может ухудшить производительность. Имеет ли смысл в таких случаях разделять настройки на отдельные записи?
Третий вариант, который я рассматриваю - создание кастомных таблиц для хранения настроек плагина, так как некоторые плагины поступают именно так.
Какие существуют правила/рекомендации для выбора подходящего способа?

Используйте API настроек. Это потрясающе! Вот как это делается шаг за шагом.
<?php
/*
* Добавляем страницу в админку
*/
add_action('admin_menu', 'wpse61431_admin_page');
function wpse61431_admin_page(){
add_menu_page('Настройки wpse61431', 'wpse61431', 'administrator', 'wpse61431-settings', 'wpse61431_admin_page_callback');
}
/*
* Регистрируем настройки
*/
add_action('admin_init', 'wpse61431_register_settings');
function wpse61431_register_settings(){
//это сохранит настройки в таблице wp_options как 'wpse61431_settings'
//третий параметр - функция для валидации введенных значений
register_setting('wpse61431_settings', 'wpse61431_settings', 'wpse61431_settings_validate');
}
function wpse61431_settings_validate($args){
//$args содержит значения, отправленные из формы настроек, можно валидировать - запретить пробелы, спецсимволы или проверять email и т.д.
if(!isset($args['wpse61431_email']) || !is_email($args['wpse61431_email'])){
//добавляем ошибку, если email невалидный, и очищаем поле формы, чтобы пользователь мог ввести снова
$args['wpse61431_email'] = '';
add_settings_error('wpse61431_settings', 'wpse61431_invalid_email', 'Пожалуйста, введите корректный email!', $type = 'error');
}
//обязательно возвращаем $args
return $args;
}
//Отображаем ошибки валидации и сообщения об обновлении
/*
* Админ-уведомления
*/
add_action('admin_notices', 'wpse61431_admin_notices');
function wpse61431_admin_notices(){
settings_errors();
}
//Разметка страницы настроек плагина
function wpse61431_admin_page_callback(){ ?>
<div class="wrap">
<h2>Настройки wpse61431</h2>
<form action="options.php" method="post"><?php
settings_fields( 'wpse61431_settings' );
do_settings_sections( __FILE__ );
//получаем предыдущие значения (не сработает при первом запуске)
$options = get_option( 'wpse61431_settings' ); ?>
<table class="form-table">
<tr>
<th scope="row">Email</th>
<td>
<fieldset>
<label>
<input name="wpse61431_settings[wpse61431_email]" type="text" id="wpse61431_email" value="<?php echo (isset($options['wpse61431_email']) && $options['wpse61431_email'] != '') ? $options['wpse61431_email'] : ''; ?>"/>
<br />
<span class="description">Пожалуйста, введите корректный email.</span>
</label>
</fieldset>
</td>
</tr>
</table>
<input type="submit" value="Сохранить" />
</form>
</div>
<?php }
?>
Это рабочий код, разметка может быть любой, главное сохраните вызовы settings_fields
и do_settings_sections
! Имена полей ввода также должны быть такими, как указано.
Для подробной информации читайте эту отличную серию статей на wp tutsplus.
