Este artículo profundiza en cómo leer y actualizar opciones en WordPress usando las funciones nativas get_option y update_option. Encontrarás explicación de su comportamiento, ejemplos prácticos en PHP (listas para copiar y pegar), buenas prácticas de seguridad y rendimiento, y un ejemplo completo de una página de ajustes en el área de administración.
Contents
¿Qué son las opciones en WordPress?
Las opciones son pares clave/valor almacenados en la tabla wp_options de la base de datos. Se usan para guardar pequeños fragmentos de configuración del sitio: ajustes de plugins, temas, flags de características, etc. WordPress maneja automáticamente la serialización de datos complejos (arrays, objetos) cuando se usan las funciones de opciones.
get_option: cómo leer una opción
Firma básica: get_option(option, default = false)
- option: nombre (string) de la opción.
- default: valor devuelto si la opción no existe. Útil para evitar false ambiguo.
Comportamiento importante:
- Si la opción existe devuelve su valor (deserializado si procede).
- Si no existe devuelve default (por defecto false).
- Las opciones marcadas como autoload se cargan en memoria al inicio (mejor rendimiento para opciones pequeñas y necesarias).
Ejemplo básico de lectura
lt?php // Leer una opción simple con valor por defecto mi_opcion = get_option(mi_plugin_opcion, valor_por_defecto) echo esc_html(mi_opcion) ?gt
update_option: cómo actualizar una opción
Firma básica: update_option(option, value)
- Si la opción no existe, WordPress la crea (internamente hace add_option si procede).
- Si el valor nuevo es idéntico al guardado, update_option devuelve false y no fuerza escrituras innecesarias.
- WordPress serializa arrays/objetos automáticamente.
Ejemplo básico de actualización
lt?php
// Actualizar una opción simple
new_value = nuevo valor
changed = update_option(mi_plugin_opcion, new_value)
if ( changed ) {
// La opción cambió en la base de datos
} else {
// No hubo cambio (valor igual) o error (raro)
}
?gt
Trabajando con arrays y serialización
Para almacenar varias claves relacionadas es habitual guardar un array completo bajo una sola opción. WordPress lo serializa al guardarlo y lo deserializa al recuperarlo.
Ejemplo: opción como array
lt?php
// Guardar un array de ajustes
settings = array(
color =gt #007cba,
mostrar_logo =gt true,
items_por_pagina =gt 10,
)
update_option(mi_plugin_settings, settings)
// Leer y usar
settings = get_option(mi_plugin_settings, array())
color = isset(settings[color]) ? settings[color] : #000000
?gt
Buenas prácticas
- Saneamiento al guardar: Siempre valida y sanea los datos antes de llamar a update_option. No confíes en datos de _POST sin validar. Usa funciones de saneamiento como sanitize_text_field, intval, esc_url_raw, wp_kses_post según corresponda.
- Escapar al mostrar: Escapa el valor al imprimir en HTML (esc_html, esc_attr, esc_url, etc.).
- Usa nombres únicos: Prefija las opciones para evitar colisiones (ej. mi_plugin_nombre_opcion).
- Evita guardar grandes blobs en opciones autoload: Las opciones con autoload = yes se cargan en memoria en cada petición. Para datos grandes o poco usados marca autoload = no usando add_option si agregas la opción por primera vez.
- Comprueba existencia cuando necesites distinguir entre no existente y false: get_option retorna false si no existe si ese valor es válido para tu opción, usa un valor por defecto distinto o add_option en la activación del plugin.
- Atomicidad al modificar subvalores: Para cambiar solo un subcampo de un array de opciones, recupera el array, modifica la clave, y guarda el array entero con update_option para mantener coherencia.
Ejemplo: actualizar una clave dentro de un array de opciones
lt?php opts = get_option(mi_plugin_settings, array()) opts[items_por_pagina] = 20 update_option(mi_plugin_settings, opts) ?gt
Autoload y rendimiento
Cuando añades una opción por primera vez con add_option puedes establecer si es autoload (yes o no). Las opciones autoload se cargan en un array global al inicio. Esto mejora el acceso si la opción se usa en casi todas las peticiones, pero perjudica si son grandes o muchas. Para datos pesados o raramente usados, usa autoload = no.
Funciones relacionadas útiles
- add_option(option, value = , deprecated = , autoload = yes): añade una opción solo si no existe, permite especificar autoload.
- delete_option(option): elimina una opción.
- get_site_option / update_site_option: equivalentes para WordPress Multisite (opciones por red).
Ejemplo completo: página de ajustes en el admin (con nonce y saneamiento)
Ejemplo de cómo crear una simple página de ajustes en el admin que lee y actualiza opciones usando get_option y update_option. Coloca este código en el archivo principal de tu plugin o en un archivo incluido.
lt?php
// Registrar el menú de ajustes
add_action(admin_menu, function() {
add_options_page(
Ajustes Mi Plugin,
Mi Plugin,
manage_options,
mi-plugin-ajustes,
mi_plugin_render_settings_page
)
})
// Renderizar la página y procesar el formulario
function mi_plugin_render_settings_page() {
// Procesar envío
if ( isset(_POST[mi_plugin_settings_submit]) check_admin_referer(mi_plugin_settings_action, mi_plugin_settings_nonce) ) {
// Leer valores crudos
color = isset(_POST[mi_plugin_color]) ? sanitize_text_field(_POST[mi_plugin_color]) :
items = isset(_POST[mi_plugin_items]) ? intval(_POST[mi_plugin_items]) : 0
mostrar_logo = isset(_POST[mi_plugin_mostrar_logo]) ? 1 : 0
// Construir array de opciones saneadas
settings = array(
color =gt color,
items_por_pagina =gt items,
mostrar_logo =gt mostrar_logo,
)
// Guardar
update_option(mi_plugin_settings, settings)
// Mensaje de confirmación
echo ltdiv class=updatedgtltpgtAjustes guardados correctamente.lt/pgtlt/divgt
}
// Leer ajustes actuales
settings = get_option(mi_plugin_settings, array(
color =gt #007cba,
items_por_pagina =gt 10,
mostrar_logo =gt 1,
))
// Imprimir formulario (escapar valores)
color = esc_attr(settings[color])
items = intval(settings[items_por_pagina])
mostrar_logo_checked = settings[mostrar_logo] ? checked :
?gt
ltdiv class=wrapgt
lth1gtAjustes de Mi Pluginlt/h1gt
ltform method=post action=gt
lt?php wp_nonce_field(mi_plugin_settings_action, mi_plugin_settings_nonce) ?gt
lttable class=form-tablegt
lttrgt
ltth scope=rowgtltlabel for=mi_plugin_colorgtColor primariolt/labelgtlt/thgt
lttdgtltinput type=text id=mi_plugin_color name=mi_plugin_color value=lt?php echo color ?gt class=regular-text /gtlt/tdgt
lt/trgt
lttrgt
ltth scope=rowgtltlabel for=mi_plugin_itemsgtItems por páginalt/labelgtlt/thgt
lttdgtltinput type=number id=mi_plugin_items name=mi_plugin_items value=lt?php echo items ?gt /gtlt/tdgt
lt/trgt
lttrgt
ltth scope=rowgtMostrar logolt/thgt
lttdgtltinput type=checkbox id=mi_plugin_mostrar_logo name=mi_plugin_mostrar_logo value=1 lt?php echo mostrar_logo_checked ?gt /gtlt/tdgt
lt/trgt
lt/tablegt
ltp class=submitgtltinput type=submit name=mi_plugin_settings_submit id=submit class=button button-primary value=Guardar cambiosgtlt/pgt
lt/formgt
lt/divgt
lt?php
}
?gt
Notas sobre Multisite
En un entorno multisite no uses get_option/update_option para opciones que deben ser compartidas por toda la red usa get_site_option y update_site_option. Estas manejan la tabla de opciones a nivel de red y tienen semántica distinta.
Tabla comparativa rápida
| Función | Uso | Notas |
| get_option | Leer opción | Devuelve default si no existe |
| update_option | Actualizar/crear opción | Devuelve true si la base de datos cambió |
| add_option | Añadir si no existe | Permite especificar autoload |
| delete_option | Eliminar opción | Borra la entrada de la base de datos |
Resumen
get_option y update_option son las herramientas esenciales para leer y escribir configuraciones en WordPress. Aprovecha la serialización automática para estructuras complejas, siempre sanea los datos antes de guardarlos y escapa al mostrarlos. Piensa en autoload y rendimiento cuando diseñes dónde y cómo guardar datos.
Para referencia oficial consulta la documentación en el Codex y en el Developer Handbook de WordPress: https://developer.wordpress.org/reference/functions/get_option/ y https://developer.wordpress.org/reference/functions/update_option/
|
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |
