Como leer y actualizar opciones con get_option y update_option en WordPress

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 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *