WordPress 6.9 trae una mejora largamente esperada por desarrolladores de temas y maquetadores: por primera vez se pueden definir estilos de formularios directamente desde theme.json. No es una solución completa todavía —solo afecta a ciertos campos—, pero marca el inicio de un camino muy interesante hacia formularios totalmente gestionados desde estilos globales.
A continuación se explica qué se puede hacer ya, qué sigue dependiendo de CSS clásico y cómo empezar a usarlo en proyectos reales.
theme.json para formulariosLa novedad clave es que theme.json ahora permite definir estilos globales para dos “elementos” especiales:
select: afecta a las etiquetas <select>.textInput: agrupa:
<textarea><input type="email|number|password|search|text|tel|url">Todo se configura bajo la clave:
{
"version": 3,
"styles": {
"elements": {
"select": {},
"textInput": {}
}
}
}
Lenguaje del código: JSON / JSON con comentarios (json)
Desde ahí se pueden aplicar las mismas propiedades que ya se usan para otros elementos de theme.json: bordes, colores, sombras, espaciado, etc.
<select>{
"styles": {
"elements": {
"select": {
"border": {
"color": "#d5dae2",
"style": "solid",
"width": "1px",
"radius": "0.75rem"
},
"color": {
"background": "#eceff2",
"text": "#22272f"
},
"outline": {
"color": "transparent",
"offset": "2px",
"style": "solid",
"width": "2px"
},
"shadow": "0 10px 15px -3px #0000001A, 0 4px 6px -4px #0000001A",
"spacing": {
"padding": {
"top": "var(--wp--preset--spacing--10)",
"bottom": "var(--wp--preset--spacing--10)",
"left": "var(--wp--preset--spacing--30)",
"right": "var(--wp--preset--spacing--30)"
}
}
}
}
}
}
Lenguaje del código: JSON / JSON con comentarios (json)
Ese estilo se aplicará a cualquier <select> del sitio: desplegables de categorías, archivos, formularios de plugins, etc., siempre que dichos plugins no sobrescriban agresivamente los estilos.
Como suele ocurrir en CSS, los <select>, <input> y <textarea> comparten diseño en la mayoría de interfaces modernas. WordPress 6.9 permite reutilizar el mismo bloque de estilos también en textInput:
{
"styles": {
"elements": {
"textInput": {
"border": {
"color": "#d5dae2",
"style": "solid",
"width": "1px",
"radius": "0.75rem"
},
"color": {
"background": "#eceff2",
"text": "#22272f"
},
"outline": {
"color": "transparent",
"offset": "2px",
"style": "solid",
"width": "2px"
},
"shadow": "0 10px 15px -3px #0000001A, 0 4px 6px -4px #0000001A",
"spacing": {
"padding": {
"top": "var(--wp--preset--spacing--10)",
"bottom": "var(--wp--preset--spacing--10)",
"left": "var(--wp--preset--spacing--30)",
"right": "var(--wp--preset--spacing--30)"
}
}
}
}
}
}
Lenguaje del código: JSON / JSON con comentarios (json)
Con algo así, bloques como Formulario de comentarios, Buscar, Acceder / Salir o formularios de terceros empiezan a integrarse visualmente con el resto del tema casi sin tocar CSS.
theme.json y lo que no (todavía)En esta primera iteración, el soporte es potente pero incompleto. Una buena forma de verlo es en tabla:
| Aspecto | ¿Se puede con theme.json en 6.9? | Notas |
|---|---|---|
| Bordes (color, radio, ancho) | ✅ Sí | En styles.elements.select y textInput.border |
| Colores de fondo y texto | ✅ Sí | color.background y color.text |
| Espaciado / padding | ✅ Sí | spacing.padding |
Sombras (shadow) | ✅ Sí | Soporta valores de sombra estándar |
| Outline básico (no estado) | ✅ Sí | outline.color, outline.width, etc. |
Estados :focus, :hover | ❌ No | Requiere CSS manual |
| Caret (color del cursor) | ❌ No | Sólo con CSS (caret-color) |
label, checkbox, radio | ❌ No | Siguen dependiendo de CSS |
::placeholder | ❌ No | Hay propuesta abierta en GitHub para añadirlo |
La idea del equipo de WordPress es ir ampliando el soporte en futuras versiones (WordPress 7.0 y siguientes), añadiendo más elementos y pseudoclases gestionadas desde estilos globales.
Hasta que el soporte sea completo, sigue siendo necesario añadir algo de CSS para:
:focus visibles.<label> y a controles como checkbox o radio.textarea,
input:where(
[type=email],
[type=number],
[type=password],
[type=search],
[type=text],
[type=tel],Lenguaje del código: CSS (css)
[type=url]
) { caret-color: #2770ce; }
Esto ayuda a que el cursor destaque sobre el contenido, algo muy útil en diseños con poco contraste.
Como theme.json aún no puede definir pseudoclases, el foco también va en CSS:
textarea:focus,
input:where(
[type=email],
[type=number],
[type=password],
[type=search],
[type=text],
[type=tel],Lenguaje del código: CSS (css)
[type=url]
):focus, select:focus { outline-color: #2770ce; }
La técnica recomendada es:
outline.color como transparent en theme.json.:focus vía CSS.De este modo, se mantiene la coherencia con los estilos globales sin perder accesibilidad.
<label> y casos especialesLos formularios no son sólo campos; las etiquetas bien diseñadas mejoran usabilidad y accesibilidad. Un patrón típico:
/* Estilo general de etiquetas */
label {
color: #526277;
font-size: 1rem;
}
/* Restablecer estilo con checkbox y radios */
input[type="checkbox"] + label,
input[type="radio"] + label,
label:has(input[type="checkbox"], input[type="radio"]) {
color: inherit;
font-size: inherit;
}
Lenguaje del código: CSS (css)
Aquí se hace una distinción entre etiquetas “normales” —por ejemplo, en formularios de contacto o comentarios— y las que acompañan a checkboxes o radios, que a menudo siguen una línea visual diferente.
Aunque pueda parecer una mejora pequeña, el impacto para quien mantiene muchos sitios o desarrolla temas es grande:
theme.json.theme.json, menos dependencia hay de hojas de estilo gigantes y difíciles de mantener.Eso sí, por ahora no conviene tirar todo el CSS por la borda: seguirán siendo necesarios estilos complementarios para estados, elementos no soportados y casos especiales.
select y textInput a tu theme.json--wp--preset--*) para no “quemar” valores fijos.theme.json.style.css con lo mínimo: focus, caret, labels y controles especiales.theme.json se discuten y afinan en GitHub y en la documentación oficial de desarrolladores de WordPress.Si WordPress mantiene el ritmo, las próximas versiones irán completando el puzzle: más elementos, más pseudoclases y menos dependencia de CSS imperativo. WordPress 6.9 no resuelve todo, pero por fin pone a los formularios en el mapa de theme.json y da a diseñadores y desarrolladores una base sólida sobre la que construir interfaces más consistentes y fáciles de mantener.
vía: developer.wordpress
