Forma eficiente de guardar opciones de plugins
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?

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.
