Эффективный способ сохранения настроек плагина

10 авг. 2012 г., 09:44:37
Просмотры: 15.6K
Голосов: 5

Я рассматриваю варианты сохранения настроек для разрабатываемого плагина. Первый очевидный кандидат - таблица wp_options.

Читая книгу "Pro WP Plugin Development", я наткнулся на следующее:

Каждая сохранённая настройка добавляет новую запись в таблицу опций WordPress. Вы можете просто хранить несколько настроек сразу в одном массиве: это предотвращает захламление базы данных и обновляет значения одним MySQL-запросом для большей эффективности и скорости.

С другой стороны, я предполагаю, что если у плагина много настроек, хранение всего в одном массиве может ухудшить производительность. Имеет ли смысл в таких случаях разделять настройки на отдельные записи?

Третий вариант, который я рассматриваю - создание кастомных таблиц для хранения настроек плагина, так как некоторые плагины поступают именно так.

Какие существуют правила/рекомендации для выбора подходящего способа?

0
Все ответы на вопрос 2
2

Используйте 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.

10 авг. 2012 г. 10:43:38
Комментарии

Спасибо, я уже видел это, но мой вопрос больше сосредоточен на том, как лучше хранить настройки, а не на том, как создать и сохранить страницу настроек.

urok93 urok93
10 авг. 2012 г. 13:13:57

не забудьте закрыть ваш return $args с помощью ;

AO_ AO_
18 июл. 2014 г. 14:36:54
2

Храните настройки в одном массиве и разрабатывайте свой плагин в виде класса. Загружайте настройки в конструкторе и сохраняйте их как переменную-член класса — так у вас будет доступ к ним в любом месте плагина.

10 авг. 2012 г. 10:06:55
Комментарии

Как это отвечает на мой вопрос?

urok93 urok93
10 авг. 2012 г. 13:12:45

Это предложение о том, как минимизировать обращения к базе данных. С этим решением вы загрузите массив с настройками только один раз для каждого экземпляра плагина.

pbd pbd
10 авг. 2012 г. 14:19:48