Contents
Introducción
Este tutorial explica paso a paso cómo crear una página de opciones en WordPress usando la Settings API en PHP. Está pensado para desarrolladores que quieran proporcionar una interfaz de administración limpia y segura para configurar un plugin o tema. Incluye ejemplos prácticos, callbacks de renderizado, sanitización, recuperación de valores y mejores prácticas.
Qué es la Settings API
La Settings API es un conjunto de funciones de WordPress que facilita el registro, presentación y guardado de opciones en la base de datos. Permite definir:
- Settings: registros que agrupan opciones y controlan la validación/sanitización.
- Sections: secciones visibles en la pantalla de administración para agrupar campos.
- Fields: campos individuales que se muestran y almacenan, cada uno con su callback de renderizado.
Conceptos clave
- register_setting(): registra un setting y la función de sanitización.
- add_settings_section(): añade una sección dentro de la página de ajustes.
- add_settings_field(): añade un campo dentro de una sección.
- settings_fields(), do_settings_sections() y submit_button(): ayudan a construir el formulario de la página de opciones correctamente (nonces, campos ocultos, etc.).
Paso 1: Crear el plugin básico y la página en el admin
Primero crea un plugin simple con su cabecera y añade una página al menú de administración donde se mostrarán las opciones.
lt?php
/
Plugin Name: Mi Plugin de Opciones
Description: Ejemplo de Settings API.
Version: 1.0
Author: Autor Ejemplo
/
if ( ! defined( ABSPATH ) ) {
exit
}
add_action( admin_menu, mpo_add_admin_menu )
add_action( admin_init, mpo_register_settings )
function mpo_add_admin_menu() {
add_options_page(
Mi Plugin de Opciones, // Título de la página
Mi Plugin, // Texto del menú
manage_options, // Capacidad requerida
mpo-options, // Slug del menú
mpo_options_page_html // Callback para mostrar la página
)
}
?gt
Paso 2: Registrar settings, secciones y campos
Registra un setting que será un array de opciones, añade una sección y varios campos dentro de esa sección.
lt?php
function mpo_register_settings() {
// Registra el setting: mpo_options es el option_name en la tabla wp_options
register_setting(
mpo_options_group, // Grupo (se usará en settings_fields)
mpo_options, // Nombre de la opción
array(
type => array,
sanitize_callback => mpo_sanitize_options,
default => array(
text_field => ,
checkbox_field => 0,
select_field => option1,
textarea_field =>
),
)
)
// Añade una sección
add_settings_section(
mpo_main_section, // ID
Ajustes principales, // Title visible
mpo_main_section_cb, // Callback para texto descriptivo
mpo-options // Página donde aparece (slug)
)
// Añade campos
add_settings_field(
mpo_text_field, // ID
Campo de texto, // Título
mpo_text_field_cb, // Callback de renderizado
mpo-options, // Página
mpo_main_section, // Sección
array( label_for => mpo_text_field )
)
add_settings_field(
mpo_checkbox_field,
Activar opción,
mpo_checkbox_field_cb,
mpo-options,
mpo_main_section,
array( label_for => mpo_checkbox_field )
)
add_settings_field(
mpo_select_field,
Selector,
mpo_select_field_cb,
mpo-options,
mpo_main_section,
array( label_for => mpo_select_field )
)
add_settings_field(
mpo_textarea_field,
Área de texto,
mpo_textarea_field_cb,
mpo-options,
mpo_main_section,
array( label_for => mpo_textarea_field )
)
}
?gt
Callbacks de sección
lt?php
function mpo_main_section_cb() {
echo ltpgtAquí puedes configurar las opciones principales de Mi Plugin.lt/pgt
}
?gt
Callbacks de renderizado de campos
Cada campo debe leer el valor actual con get_option y mostrar el control HTML adecuado. Usa las funciones de escape de WordPress al imprimir valores.
lt?php
function mpo_get_options() {
opts = get_option( mpo_options )
if ( ! is_array( opts ) ) {
opts = array()
}
return opts
}
function mpo_text_field_cb( args ) {
opts = mpo_get_options()
value = isset( opts[text_field] ) ? opts[text_field] :
printf(
ltinput type=text id=%1s name=mpo_options[text_field] value=%2s class=regular-text /gt,
esc_attr( args[label_for] ),
esc_attr( value )
)
}
function mpo_checkbox_field_cb( args ) {
opts = mpo_get_options()
checked = ! empty( opts[checkbox_field] ) ? checked :
printf(
ltinput type=checkbox id=%1s name=mpo_options[checkbox_field] value=1 %2s /gt,
esc_attr( args[label_for] ),
checked
)
}
function mpo_select_field_cb( args ) {
opts = mpo_get_options()
value = isset( opts[select_field] ) ? opts[select_field] : option1
options = array(
option1 =gt Opción 1,
option2 =gt Opción 2,
option3 =gt Opción 3
)
echo ltselect id=. esc_attr( args[label_for] ) . name=mpo_options[select_field]gt
foreach ( options as key =gt label ) {
printf(
ltoption value=%1s %2sgt%3slt/optiongt,
esc_attr( key ),
selected( value, key, false ),
esc_html( label )
)
}
echo lt/selectgt
}
function mpo_textarea_field_cb( args ) {
opts = mpo_get_options()
value = isset( opts[textarea_field] ) ? opts[textarea_field] :
printf(
lttextarea id=%1s name=mpo_options[textarea_field] rows=5 cols=50gt%2slt/textareagt,
esc_attr( args[label_for] ),
esc_textarea( value )
)
}
?gt
Paso 3: Construir el formulario en la página de administración
Usa settings_fields(), do_settings_sections() y submit_button() para renderizar el formulario correctamente con nonces y control de guardado.
lt?php
function mpo_options_page_html() {
if ( ! current_user_can( manage_options ) ) {
return
}
// Mensajes de error/éxito
settings_errors( mpo_messages )
?gt
ltdiv class=wrapgt
lth1gtConfiguración de Mi Pluginlt/h1gt
ltform action=options.php method=postgt
lt?php
// Imprime los campos ocultos, nonce y el option_group definido en register_setting
settings_fields( mpo_options_group )
// Imprime las secciones y sus campos para la página especificada
do_settings_sections( mpo-options )
// Botón de enviar estándar de WP
submit_button( Guardar opciones )
?gt
lt/formgt
lt/divgt
lt?php
}
?gt
Paso 4: Sanitización y validación
La función de sanitización recibe los datos enviados y debe limpiar/validar cada campo antes de guardarlo. A continuación un ejemplo que procesa distintos tipos de campos dentro de un mismo array.
lt?php
function mpo_sanitize_options( input ) {
output = array()
// Campo de texto: limpiar etiquetas HTML
if ( isset( input[text_field] ) ) {
output[text_field] = sanitize_text_field( input[text_field] )
}
// Checkbox: forzar 1 o 0
output[checkbox_field] = ! empty( input[checkbox_field] ) ? 1 : 0
// Select: validar que esté entre las opciones permitidas
allowed = array( option1, option2, option3 )
if ( isset( input[select_field] ) in_array( input[select_field], allowed, true ) ) {
output[select_field] = input[select_field]
} else {
output[select_field] = option1
}
// Textarea: permitir algunos tags básicos si lo deseas, o sanear completamente
if ( isset( input[textarea_field] ) ) {
// Ejemplo: permitir sólo tags básicos
output[textarea_field] = wp_kses_post( input[textarea_field] )
}
add_settings_error(
mpo_messages,
mpo_saved,
Opciones guardadas.,
updated
)
return output
}
?gt
Paso 5: Recuperar y usar las opciones en tu plugin o tema
Una vez guardadas, recupera las opciones con get_option y utiliza los valores de forma segura (escapando al imprimir en frontend).
lt?php // Obtener el array de opciones opts = get_option( mpo_options, array() ) // Uso en el plugin (ejemplo) text = isset( opts[text_field] ) ? opts[text_field] : enabled = ! empty( opts[checkbox_field] ) // Mostrar en el frontend (ejemplo dentro de un template) echo ltdiv class=mi-plugin-textgt . esc_html( text ) . lt/divgt ?gt
Buenas prácticas y recomendaciones
- Prefija todo: usa un prefijo único (por ejemplo mpo_) para evitar colisiones con otros plugins.
- Opciones como array: agrupar opciones en un solo item en wp_options reduce consultas pero para opciones muy cambiantes puede convenir opciones independientes.
- Sanitiza siempre: todas las entradas deben pasar por funciones de sanitización apropiadas (sanitize_text_field, absint, wp_kses_post, etc.).
- Escapa al mostrar: usa esc_html, esc_attr, esc_textarea, esc_url según corresponda al imprimir en frontend o backend.
- Control de capacidades: solo usuarios con capability apropiada (manage_options) deberían acceder a la página.
- Usa settings_errors(): para comunicar errores y confirmaciones al usuario tras guardar las opciones.
- Valores por defecto: proporciona defaults en register_setting para evitar valores no definidos.
- Internacionalización: marca cadenas para traducción si vas a distribuir el plugin.
Ejemplo completo integrado
A continuación un ejemplo completo que reúne lo explicado. Puedes copiarlo como un plugin único (archivo PHP) y activarlo en tu instalación de WordPress.
lt?php
/
Plugin Name: Mi Plugin de Opciones
Description: Ejemplo completo de Settings API.
Version: 1.0
Author: Autor Ejemplo
/
if ( ! defined( ABSPATH ) ) {
exit
}
add_action( admin_menu, mpo_add_admin_menu )
add_action( admin_init, mpo_register_settings )
function mpo_add_admin_menu() {
add_options_page(
Mi Plugin de Opciones,
Mi Plugin,
manage_options,
mpo-options,
mpo_options_page_html
)
}
function mpo_register_settings() {
register_setting(
mpo_options_group,
mpo_options,
array(
type => array,
sanitize_callback => mpo_sanitize_options,
default => array(
text_field => ,
checkbox_field => 0,
select_field => option1,
textarea_field =>
),
)
)
add_settings_section( mpo_main_section, Ajustes principales, mpo_main_section_cb, mpo-options )
add_settings_field( mpo_text_field, Campo de texto, mpo_text_field_cb, mpo-options, mpo_main_section, array( label_for => mpo_text_field ) )
add_settings_field( mpo_checkbox_field, Activar opción, mpo_checkbox_field_cb, mpo-options, mpo_main_section, array( label_for => mpo_checkbox_field ) )
add_settings_field( mpo_select_field, Selector, mpo_select_field_cb, mpo-options, mpo_main_section, array( label_for => mpo_select_field ) )
add_settings_field( mpo_textarea_field, Área de texto, mpo_textarea_field_cb, mpo-options, mpo_main_section, array( label_for => mpo_textarea_field ) )
}
function mpo_main_section_cb() {
echo ltpgtAquí puedes configurar las opciones principales de Mi Plugin.lt/pgt
}
function mpo_get_options() {
opts = get_option( mpo_options )
if ( ! is_array( opts ) ) {
opts = array()
}
return opts
}
function mpo_text_field_cb( args ) {
opts = mpo_get_options()
value = isset( opts[text_field] ) ? opts[text_field] :
printf(
ltinput type=text id=%1s name=mpo_options[text_field] value=%2s class=regular-text /gt,
esc_attr( args[label_for] ),
esc_attr( value )
)
}
function mpo_checkbox_field_cb( args ) {
opts = mpo_get_options()
checked = ! empty( opts[checkbox_field] ) ? checked :
printf(
ltinput type=checkbox id=%1s name=mpo_options[checkbox_field] value=1 %2s /gt,
esc_attr( args[label_for] ),
checked
)
}
function mpo_select_field_cb( args ) {
opts = mpo_get_options()
value = isset( opts[select_field] ) ? opts[select_field] : option1
options = array(
option1 =gt Opción 1,
option2 =gt Opción 2,
option3 =gt Opción 3
)
echo ltselect id=. esc_attr( args[label_for] ) . name=mpo_options[select_field]gt
foreach ( options as key =gt label ) {
printf(
ltoption value=%1s %2sgt%3slt/optiongt,
esc_attr( key ),
selected( value, key, false ),
esc_html( label )
)
}
echo lt/selectgt
}
function mpo_textarea_field_cb( args ) {
opts = mpo_get_options()
value = isset( opts[textarea_field] ) ? opts[textarea_field] :
printf(
lttextarea id=%1s name=mpo_options[textarea_field] rows=5 cols=50gt%2slt/textareagt,
esc_attr( args[label_for] ),
esc_textarea( value )
)
}
function mpo_sanitize_options( input ) {
output = array()
if ( isset( input[text_field] ) ) {
output[text_field] = sanitize_text_field( input[text_field] )
}
output[checkbox_field] = ! empty( input[checkbox_field] ) ? 1 : 0
allowed = array( option1, option2, option3 )
if ( isset( input[select_field] ) in_array( input[select_field], allowed, true ) ) {
output[select_field] = input[select_field]
} else {
output[select_field] = option1
}
if ( isset( input[textarea_field] ) ) {
output[textarea_field] = wp_kses_post( input[textarea_field] )
}
add_settings_error( mpo_messages, mpo_saved, Opciones guardadas., updated )
return output
}
function mpo_options_page_html() {
if ( ! current_user_can( manage_options ) ) {
return
}
settings_errors( mpo_messages )
?gt
ltdiv class=wrapgt
lth1gtConfiguración de Mi Pluginlt/h1gt
ltform action=options.php method=postgt
lt?php
settings_fields( mpo_options_group )
do_settings_sections( mpo-options )
submit_button( Guardar opciones )
?gt
lt/formgt
lt/divgt
lt?php
}
?gt
Resumen final
La Settings API es la forma recomendada para crear páginas de opciones robustas en WordPress: centraliza validación, nonce y presentación de campos. Siguiendo los pasos anteriores tendrás una estructura clara: registro del setting, definición de secciones y campos, renderizado del formulario y sanitización de los datos. Aplica las buenas prácticas (prefijos, escape, sanitización y capacidades) para asegurar compatibilidad y seguridad.
|
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |
