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 🙂 |