Forma eficiente de guardar opciones de plugins

10 ago 2012, 09:44:37
Vistas: 15.6K
Votos: 5

Estoy considerando cómo guardar las opciones para un plugin que estoy desarrollando. El primer candidato obvio es la tabla wp_options.

Mientras leía el libro Pro WP Plugin Development me encontré con esto:

Cada opción guardada añade un nuevo registro en la tabla de opciones de WordPress. Puedes simplemente almacenar varias opciones a la vez, en un solo array: Esto evita saturar la base de datos y actualiza los valores en una sola consulta MySQL para mayor eficiencia y velocidad.

Por otro lado, también imagino que si el plugin tiene muchas configuraciones podría afectar el rendimiento almacenar todo en un array. ¿Tendría sentido entonces dividir las opciones en registros separados en esos casos?

Una tercera opción que se me ocurre es crear tablas personalizadas para almacenar las configuraciones del plugin, ya que he visto que algunos plugins hacen esto también.

¿Cuáles son las reglas/guías para decidir qué camino tomar?

0
Todas las respuestas a la pregunta 2
2

Utiliza la API de ajustes. ¡Es increíble! Aquí está cómo hacerlo paso a paso.

<?php
/*
 * Añadir la página de administración
 */
add_action('admin_menu', 'wpse61431_admin_page');
function wpse61431_admin_page(){
    add_menu_page('Ajustes wpse61431', 'wpse61431', 'administrator', 'wpse61431-settings', 'wpse61431_admin_page_callback');
}

/*
 * Registrar los ajustes
 */
add_action('admin_init', 'wpse61431_register_settings');
function wpse61431_register_settings(){
    //esto guardará la opción en la tabla wp_options como 'wpse61431_settings'
    //el tercer parámetro es una función que validará los valores de entrada
    register_setting('wpse61431_settings', 'wpse61431_settings', 'wpse61431_settings_validate');
}

function wpse61431_settings_validate($args){
    //$args contendrá los valores enviados en tu formulario de ajustes, puedes validarlos como no permitir espacios, no permitir caracteres especiales o validar emails, etc.
    if(!isset($args['wpse61431_email']) || !is_email($args['wpse61431_email'])){
        //añade un error de ajustes porque el email es inválido y deja el campo del formulario en blanco, para que el usuario pueda ingresarlo nuevamente
        $args['wpse61431_email'] = '';
    add_settings_error('wpse61431_settings', 'wpse61431_invalid_email', '¡Por favor ingresa un email válido!', $type = 'error');   
    }

    //asegúrate de retornar los args
    return $args;
}

//Mostrar los errores de validación y mensajes de actualización
/*
 * Notificaciones de administración
 */
add_action('admin_notices', 'wpse61431_admin_notices');
function wpse61431_admin_notices(){
   settings_errors();
}

//El marcado para la página de ajustes de tu plugin
function wpse61431_admin_page_callback(){ ?>
    <div class="wrap">
    <h2>Ajustes wpse61431</h2>
    <form action="options.php" method="post"><?php
        settings_fields( 'wpse61431_settings' );
        do_settings_sections( __FILE__ );

        //obtener los valores antiguos, no funcionará la primera vez
        $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">Por favor ingresa un email válido.</span>
                        </label>
                    </fieldset>
                </td>
            </tr>
        </table>
        <input type="submit" value="Guardar" />
    </form>
</div>
<?php }
?>

Este es un código funcional, el marcado puede ser el que desees, ¡asegúrate de conservar las llamadas settings_fields y do_settings_sections! Los nombres de los campos de entrada también deben ser como mencioné.

Para información detallada, lee esta increíble serie en wp tutsplus.

10 ago 2012 10:43:38
Comentarios

Gracias, me he encontrado con esto, pero mi pregunta está más enfocada en cuál es la mejor manera de almacenar los ajustes, en lugar de cómo construir y guardar la página de configuración.

urok93 urok93
10 ago 2012 13:13:57

recuerda cerrar tu return $args con un ;

AO_ AO_
18 jul 2014 14:36:54
2

Almacena las opciones en un único array y escribe tu plugin como una clase. Carga las opciones en el constructor y guárdalas como una variable miembro para tener acceso a ellas en cualquier parte del plugin.

10 ago 2012 10:06:55
Comentarios

¿Cómo responde esto a mi pregunta?

urok93 urok93
10 ago 2012 13:12:45

Es una sugerencia sobre cómo minimizar las llamadas a la base de datos. Con esta solución solo cargarás el array con las opciones una vez por instancia del plugin.

pbd pbd
10 ago 2012 14:19:48