Este artículo explica en profundidad cómo usar theme.json para definir estilos y presets en WordPress y cómo trabajar con esos valores desde PHP y JavaScript. Verás la estructura de theme.json, ejemplos prácticos, cómo exponer presets al editor y al front-end desde PHP, y cómo consumirlos desde JS para registrar estilos, paletas y variaciones dinámicas. Incluye fragmentos de código listos para copiar y adaptar (los ejemplos están en su propia etiqueta pre tal como pides).
Contents
Resumen rápido: qué hace theme.json
theme.json es el sistema central de WordPress (block editor / Full Site Editing) para declarar presets (paletas de color, tamaños de fuente, espacios, etc.) y estilos globales que afectan tanto al editor de bloques como al front-end. Cuando defines presets en theme.json, WordPress genera variables CSS (custom properties) y configura el editor para usar esas opciones.
Estructura básica de theme.json
Un theme.json moderno (version 2 o superior) tiene dos ramas principales: settings y styles. En settings defines presets y comportamientos en styles defines CSS por defecto usando las variables.
Ejemplo mínimo de theme.json
{
version: 2,
settings: {
color: {
palette: [
{ slug: primary, color: #0073aa, name: Primary },
{ slug: accent, color: #ffb900, name: Accent },
{ slug: background, color: #ffffff, name: Background }
],
custom: true
},
typography: {
fontSizes: [
{ slug: small, size: 13px, name: Small },
{ slug: normal, size: 16px, name: Normal },
{ slug: large, size: 32px, name: Large }
]
},
spacing: {
blockGap: 1.25rem
}
},
styles: {
root: {
color: { text: var(--wp--preset--color--primary) },
typography: { fontSize: var(--wp--preset--font-size--normal) }
}
}
}
Cómo exponer y extender presets desde PHP
Aunque theme.json se carga automáticamente desde la carpeta raíz o desde /config/theme.json, a menudo necesitas manipular o reutilizar esos datos en tiempo de ejecución (por ejemplo, para generar CSS dinámico, registrar soporte clásico o pasar datos al editor JS). El flujo habitual es:
- Leer y decodificar el JSON desde PHP.
- Generar variables CSS o llamadas a add_theme_support si necesitas compatibilidad con APIs antiguas.
- Pasar los presets al script del editor mediante wp_localize_script o wp_add_inline_script para que JS pueda registrar estilos o actualizar ajustes.
Ejemplo: Leer theme.json y generar variables CSS (front-end y editor)
Ejemplo: Registrar editor-color-palette desde PHP usando los datos de theme.json
Para compatibilidad con APIs previas a theme.json (o para code paths que aún leen add_theme_support), puedes reconstruir la paleta y llamar add_theme_support en after_setup_theme.
p[name] ?? p[slug],
slug => p[slug],
color => p[color],
)
}
}
if ( ! empty( support_palette ) ) {
add_theme_support( editor-color-palette, support_palette )
}
}
?>
Cómo consumir presets desde JS en el editor
En el editor de bloques (Gutenberg) puedes usar los presets para:
- Registrar variaciones de bloque (block styles) que usan las clases o utilidades de preset.
- Actualizar la configuración del editor (por ejemplo, la paleta visible) mediante la store core/block-editor o los métodos disponibles en la librería de bloques.
Patrón recomendado para pasar datos de PHP a JS
Encola un script para el editor y pasa los datos (por ejemplo, settings o partes del theme.json) con wp_localize_script o con wp_add_inline_script (como un objeto JS global). Así evitas lecturas de archivos desde JS y mantienes la fuente única de verdad (theme.json).
Ejemplo de JavaScript en el editor que usa MI_TEMA_PRESETS
( function ( wp ) {
const presets = window.MI_TEMA_PRESETS {}
const palette = ( presets.color presets.color.palette ) ? presets.color.palette : []
const fontSizes = ( presets.typography presets.typography.fontSizes ) ? presets.typography.fontSizes : []
wp.domReady( function () {
// 1) Registrar block styles por cada color (como ejemplo)
if ( wp.blocks wp.blocks.registerBlockStyle ) {
palette.forEach( function ( color ) {
if ( color.slug ) {
wp.blocks.registerBlockStyle( core/heading, {
name: has- color.slug -color,
label: Color ( color.name color.slug )
} )
}
} )
}
// 2) Actualizar la paleta del editor en tiempo de ejecución
if ( wp.data wp.data.dispatch ) {
const colorsForEditor = palette.map( function (c) {
return { name: c.name c.slug, slug: c.slug, color: c.color }
} )
// core/block-editor store expone updateSettings (nota: comprobar disponibilidad según WP)
try {
wp.data.dispatch( core/block-editor ).updateSettings( {
colors: colorsForEditor
} )
} catch (e) {
// Fallback: puede que en versiones antiguas la store sea diferente.
// No lanzar errores visibles en producción.
}
}
} )
} )( window.wp )
Ejemplos de uso práctico
- Generar utilidades CSS: crear clases .has-primary-background usando la variable –wp–preset–color–primary y añadir esas utilidades automáticamente en el CSS inline generado por PHP.
- Registrar estilos de bloque automáticos: basándote en la paleta, registrar block styles para heading, button, cover, etc.
- Sincronizar configuraciones: pasar la misma paleta a un panel de opciones personalizado en el editor para que el usuario vea y seleccione exactamente los presets disponibles.
Buenas prácticas y consideraciones
- Sanitizar y validar: cuando leas theme.json con PHP, valida la estructura antes de usarla (existencia de claves, tipos). Evita evaluar contenido sin control.
- Cachear lecturas: si tu theme.json es grande o haces muchas lecturas, cachea la decodificación con transients o variables estáticas para no leer archivos en cada request.
- Compatibilidad: theme.json se introdujo y evolucionó en versiones recientes de WP. Comprueba la versión mínima del CMS y proporciona fallbacks (por ejemplo add_theme_support) para compatibilidad con instalaciones anteriores.
- Variables CSS: usa siempre las variables generadas (–wp–preset–…) en tus estilos para mantener consistencia entre editor y front-end.
- Evita duplicidad: no declares presets contradictorios entre theme.json y add_theme_support. Si generas add_theme_support dinámicamente, hazlo a partir del theme.json para mantener una única fuente de verdad.
- Seguridad: al exponer datos con wp_localize_script, pasa solo lo necesario (por ejemplo settings[color][palette]) para reducir superficie de datos innecesarios.
Pequeño checklist para implementar en un tema
- Crear /config/theme.json con presets y estilos globales.
- En PHP leer y validar theme.json en after_setup_theme o en hooks de cola para generar variables CSS y compatibilidad legacy.
- Inyectar variables CSS con wp_add_inline_style para front-end y editor.
- Pasar presets importantes al editor con wp_localize_script o wp_add_inline_script.
- En JS, registrar block styles o actualizar settings con los presets recibidos.
- Probar: editor (Gutenberg) y front-end para asegurar coincidencia visual.
Conclusión
theme.json es la fuente central para presets y estilos en el ecosistema moderno de WordPress. Combinar su definición estática con pequeñas capas dinámicas en PHP y JS te permite tener un control total: generar variables CSS para el front-end, registrar compatibilidades antiguas con add_theme_support y enriquecer la experiencia del editor registrando estilos y configuraciones en tiempo de ejecución. Sigue buenas prácticas de validación y cacheo y mantén una única fuente de verdad (tu theme.json) para evitar conflictos.
|
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |
