Introducción: este artículo explica con todo lujo de detalles cómo estilizar los formularios nativos de WordPress (formulario de comentarios y formulario de búsqueda) usando CSS moderno. Incluye ejemplos concretos listos para copiar/pegar, buenas prácticas de accesibilidad, trucos para integrarlo en cualquier theme (clásico o basado en bloques) y pequeños snippets en PHP para ajustar clases o atributos cuando sea necesario.
1. Entender los formularios nativos de WordPress
Antes de escribir CSS es imprescindible saber qué HTML produce WordPress por defecto. El formulario de comentarios y el de búsqueda usan clases y estructura predecibles:
2. Preparar tu CSS: reset mínimo y variables
Empieza con un reset suave para campos y define variables para colores/tamaños así mantienes coherencia y facilitas ajustes globales.
:root{
--form-bg: #ffffff
--input-bg: #fff
--input-border: #d1d5db
--input-border-focus: #2563eb
--input-radius: 8px
--input-padding: 10px 12px
--text-color: #0f172a
--muted: #6b7280
--btn-bg: #2563eb
--btn-color: #fff
--btn-radius: 8px
--transition-fast: 160ms ease
}
/ Reset básico para inputs/textarea/button /
.comment-form input,
.comment-form textarea,
.search-form .search-field,
input[type=search],
input[type=text],
input[type=email],
input[type=url],
textarea {
appearance: none
-webkit-appearance: none
font: inherit
color: var(--text-color)
background: var(--input-bg)
border: 1px solid var(--input-border)
border-radius: var(--input-radius)
padding: var(--input-padding)
transition: border-color var(--transition-fast), box-shadow var(--transition-fast)
width: 100%
box-sizing: border-box
}
3. Estilizado del formulario de comentarios
A continuación un ejemplo completo de estilos para el formulario de comentarios: distribución, labels, campos, botón y estados (hover, focus, error).
/ Contenedor del formulario /
.comment-form{
background: var(--form-bg)
padding: 18px
border-radius: 10px
box-shadow: 0 1px 2px rgba(15,23,42,0.04)
}
/ Labels más pequeños y con color neutro /
.comment-form label{
display: block
font-size: 0.9rem
color: var(--muted)
margin-bottom: 6px
}
/ Inputs y textarea con control del tamaño /
.comment-form .comment-form-author,
.comment-form .comment-form-email,
.comment-form .comment-form-url,
.comment-form .comment-form-comment{
margin-bottom: 14px
}
/ Textarea con altura controlada /
.comment-form textarea {
min-height: 120px
resize: vertical
}
/ Botón de envío principal /
.comment-form .form-submit .submit{
background: var(--btn-bg)
color: var(--btn-color)
padding: 10px 16px
border: none
border-radius: var(--btn-radius)
cursor: pointer
transition: transform 120ms ease, box-shadow 120ms ease
}
.comment-form .form-submit .submit:hover{
filter: brightness(0.95)
transform: translateY(-1px)
box-shadow: 0 4px 12px rgba(37,99,235,0.12)
}
/ Estados de foco accesibles /
.comment-form input:focus,
.comment-form textarea:focus{
outline: none
border-color: var(--input-border-focus)
box-shadow: 0 0 0 4px rgba(37,99,235,0.08)
}
/ Input con error (si JS o servidor añade clase .has-error) /
.comment-form .has-error input,
.comment-form .has-error textarea{
border-color: #dc2626
box-shadow: 0 0 0 4px rgba(220,38,38,0.06)
}
/ Campos inline para una segunda columna (responsive) /
@media (min-width: 700px){
.comment-form .two-col{
display: grid
grid-template-columns: 1fr 1fr
gap: 12px
}
}
Cómo forzar campos en una misma fila
WordPress no genera una clase por defecto para agrupar campos en dos columnas. Puedes envolver los campos desde tu template o aplicar selectores por posición con CSS. Preferible: modificar la salida para añadir una clase contenedora (ve seccion PHP abajo).
4. Estilizado del formulario de búsqueda
El formulario de búsqueda suele ser compacto y frecuentemente va en header o barra lateral. Aquí estilos para una búsqueda inline y otra con input ampliable.
/ Estilo base /
.search-form{
display: flex
gap: 8px
align-items: center
}
/ Input de búsqueda /
.search-form .search-field{
padding: 8px 10px
border-radius: 999px
border: 1px solid var(--input-border)
width: 220px
transition: width 180ms ease, border-color 120ms ease, box-shadow 120ms ease
}
/ Botón redondeado /
.search-form .search-submit{
background: var(--btn-bg)
color: var(--btn-color)
border: none
padding: 8px 12px
border-radius: 999px
cursor: pointer
}
/ Input expandible (por ejemplo en header) /
.search-form.expanded .search-field{
width: 320px
}
/ Focus accesible /
.search-field:focus{
border-color: var(--input-border-focus)
box-shadow: 0 0 0 4px rgba(37,99,235,0.06)
}
5. Accesibilidad y buenas prácticas
- Siempre conserva los labels semánticos. Si quieres ocultarlos visualmente, usa la clase .screen-reader-text (WordPress la incluye) o esta versión:
/ Visually hidden pero accesible /
.screen-reader-text,
.visually-hidden {
position: absolute !important
height: 1px width: 1px
overflow: hidden
clip: rect(1px, 1px, 1px, 1px)
white-space: nowrap
}
- Asegura un contraste suficiente entre fondo y texto (WCAG AA).
- Usa :focus-visible para mostrar foco solo cuando el usuario navega con teclado:
input:focus-visible, textarea:focus-visible, button:focus-visible {
outline: 3px solid rgba(37,99,235,0.14)
outline-offset: 2px
}
6. Personalizaciones avanzadas y compatibilidad
En algunos casos quieres añadir clases o atributos al HTML del formulario para facilitar el CSS. Aquí dos snippets PHP útiles para usar en functions.php del theme (o plugin específico).
6.1 Añadir clase al botón de envío del formulario de comentarios
/ Añade clase btn-primary al botón submit del comment form /
add_filter(comment_form_submit_field, function(submit_field){
// Reemplaza la clase por defecto por una con tus clases
submit_field = str_replace(class=submit, class=submit btn-primary, submit_field)
return submit_field
})
6.2 Añadir contenedor para agrupar campos (si tu theme lo requiere)
/ Modificar campos del comment form para envolver autor/email en un contenedor two-col /
add_filter(comment_form_defaults, function(defaults){
// Ajusta defaults[fields][author] y email donde quieras añadir wrapper
// Ejemplo simplificado: PRE- y POST-HTML para campos (usar con cuidado)
if(isset(defaults[fields][author])){
defaults[fields][author] = . defaults[fields][author]
}
if(isset(defaults[fields][email])){
defaults[fields][email] = defaults[fields][email] .
}
return defaults
})
Nota: personalizaciones que alteran HTML pueden interferir con plugins o con reCAPTCHA probar en staging antes de producción.
7. Trucos y patrones útiles
- Placeholder vs label: usa placeholder solo como ayuda adicional nunca elimines etiquetas accesibles.
- Indicadores de obligatorio: añade un mediante CSS si quieres, pero es preferible que el servidor devuelva errores claros y que tengas aria-required para lector de pantallas.
- Errores visibles: cuando el servidor devuelve error, añade .has-error al contenedor y muestra mensaje — estiliza con color y icono.
- Compatibilidad con temas oscuros: define variables alternativas o usa media query prefers-color-scheme.
/ Ejemplo: required marker usando pseudo-elemento en label /
.comment-form label.required::after{
content:
color: #dc2626
margin-left: 4px
}
/ Soporte modo oscuro /
@media (prefers-color-scheme: dark){
:root{
--form-bg: #0b1220
--input-bg: #071024
--input-border: #23334a
--text-color: #e6eef8
--muted: #94a3b8
--btn-bg: #1e40af
}
}
8. Depuración con DevTools y reglas de especificidad
- Inspecciona con DevTools para ver qué selector aplica y la especificidad. Evita usar !important salvo en casos extremos.
- Si el theme añade estilos muy específicos, aumenta especificidad con selectores contextuales (.comment-form input) o añade clases en PHP como vimos arriba.
- Para overrides rápidos en plugins que inyectan CSS, carga tu CSS al final (enqueue con dependencia o prioridad) o crea un archivo style-editor que se cargue después.
9. Performance y mantenimiento
- Mantén las reglas CSS del formulario agrupadas en un fichero parcial (_forms.css) para facilitar mantenimiento.
- Reduce el número de selectores complejos reusa variables CSS para cambios de tema y mantenimiento.
- Evita cargar fuentes o iconos innecesarios solo para los formularios.
10. Resumen práctico rápido
- Empieza por entender la salida HTML de WordPress.
- Define variables CSS y un reset ligero para inputs.
- Estiliza estados (hover, focus, error) y botones con transiciones suaves.
- Respeta la accesibilidad: labels, focus-visible, aria-required/aria-invalid.
- Usa pequeños filtros PHP para añadir clases cuando sea necesario y así simplificar CSS.
Recuerda probar siempre en distintos navegadores y dispositivos. Los ejemplos de CSS y PHP en este artículo son plantillas que puedes adaptar a tu identidad visual, añadiendo tipografías, iconos o animaciones controladas para no perjudicar la usabilidad ni la accesibilidad.
Leave a Reply