Introducción
Este tutorial explica, paso a paso y con ejemplos prácticos, cómo destacar el primer resultado de búsqueda en WordPress usando una tarjeta CSS. Verás varias aproximaciones: modificación del loop de búsqueda (PHP), uso de un filtro en functions.php, y una alternativa 100% CSS cuando la estructura del tema lo permite (por ejemplo, ul/li o bloques del editor). También incluimos estilos CSS detallados para la tarjeta destacada, consideraciones de accesibilidad y recomendaciones de rendimiento.
Requisitos previos
- Tener acceso a los archivos del tema (mejor si es un tema hijo).
- Conocimientos básicos de PHP y CSS.
- Copias de seguridad antes de editar archivos del tema.
Resumen de la idea
La idea es identificar el primer elemento del loop de búsqueda y añadirle una clase específica (por ejemplo, first-result). Esa clase permitirá aplicar estilos CSS distintos que conviertan ese primer resultado en una tarjeta visualmente destacada: mayor imagen, fondo, sombras, y más espacio para contenido.
Método 1 — Modificar el loop de búsqueda (search.php o template part)
Edite el archivo search.php o el template part que genera cada resultado (por ejemplo content-search.php). Añada un contador y condicione la clase en función del índice. Ejemplo mínimo de loop:
lt?php
// Dentro de search.php o del template part
search_index = 0
if ( have_posts() ) :
while ( have_posts() ) : the_post()
search_index
// Clase adicional si es el primer resultado
extra_class = ( search_index === 1 ) ? first-result :
?gt
ltarticle id=post-lt?php the_ID() ?gt class=search-itemlt?php echo esc_attr( extra_class ) ?gtgt
ltheader class=search-item-headergt
lth2 class=search-item-titlegtlta href=lt?php the_permalink() ?gtgtlt?php the_title() ?gtlt/agtlt/h2gt
lt/headergt
ltdiv class=search-item-thumbgt
lt?php
if ( has_post_thumbnail() ) {
the_post_thumbnail( medium )
}
?gt
lt/divgt
ltdiv class=search-item-excerptgtlt?php the_excerpt() ?gtlt/divgt
lt/articlegt
lt?php
endwhile
endif
?gt
En este ejemplo usamos la clase first-result para el primer resultado. El markup real (etiquetas) dependerá de tu tema, pero el patrón es el mismo: asignar la clase condicionalmente.
Método 2 — Añadir la clase con un filtro en functions.php
Si prefieres no tocar el loop del tema, puedes usar un filtro que añada una clase al primer post en búsquedas. Este método mantiene limpio el template y centraliza la lógica.
lt?php
// Añadir a functions.php del tema hijo
add_filter( post_class, mi_post_class_primer_resultado, 10, 3 )
function mi_post_class_primer_resultado( classes, class, post_id ) {
if ( is_search() ) {
// Usamos una variable estática para contar durante el loop
static search_counter = 0
if ( did_action( loop_start ) ) {
// Reiniciar si se vuelve a ejecutar en otra consulta
}
search_counter
if ( 1 === search_counter ) {
classes[] = first-result
}
}
return classes
}
?gt
Este enfoque usa post_class para inyectar la clase. Ten cuidado si hay loops anidados o queries personalizados en esos casos conviene resetear el contador cuando finaliza la consulta.
Método 3 — Solo CSS (si la estructura lo permite)
Si el HTML genera una lista ordenada o un contenedor con elementos consecutivos (por ejemplo ltulgtltligt o bloques de posts con contenedor padre), puedes seleccionar el primer hijo con :first-child o :first-of-type y aplicar estilos especiales sin tocar PHP.
/ Ejemplo cuando los resultados están dentro de .search-results (ul > li) /
.search-results li:first-child {
grid-column: 1 / -1 / en un grid podría ocupar todo el ancho /
background: linear-gradient(180deg, #ffffff, #fbfbfe)
box-shadow: 0 6px 24px rgba(16,24,40,.12)
border-radius: 12px
padding: 24px
display: flex
gap: 20px
}
.search-results li:first-child .thumb {
flex: 0 0 280px
max-width: 280px
border-radius: 8px
overflow: hidden
}
.search-results li:first-child .content {
flex: 1 1 auto
}
Este método es el más simple y seguro siempre que el HTML tenga el orden esperado y no existan wrappers intermedios.
Estilos CSS detallados para la tarjeta destacada
A continuación un conjunto completo de estilos para convertir el primer resultado en una tarjeta atractiva, con imagen destacada, título, meta y extracto. Ajusta colores, tipografías y tamaños a tu identidad.
/ Estilos base para los items de búsqueda /
.search-item {
display: block
padding: 12px
border-bottom: 1px solid rgba(0,0,0,0.06)
transition: transform .18s ease, box-shadow .18s ease
}
/ Estilos para el primer resultado (tarjeta destacada) /
.search-item.first-result {
display: grid
grid-template-columns: 320px 1fr
gap: 24px
padding: 28px
margin-bottom: 20px
background: linear-gradient(180deg,#fff #fbfbfe)
border-radius: 14px
box-shadow: 0 10px 40px rgba(15,23,42,0.08)
border: 1px solid rgba(16,24,40,0.04)
align-items: start
}
/ Imagen y contenedor /
.search-item.first-result .search-item-thumb img {
width: 100%
height: auto
display: block
border-radius: 10px
object-fit: cover
}
/ Contenido textual /
.search-item.first-result .search-item-title a {
font-size: 1.35rem
line-height: 1.15
color: #0b2b40
text-decoration: none
font-weight: 700
}
.search-item.first-result .search-item-excerpt {
margin-top: 10px
color: #334155
font-size: .98rem
line-height: 1.6
}
.search-item.first-result .search-meta {
display: flex
gap: 12px
color: #64748b
font-size: .9rem
margin-top: 12px
}
/ Hover sutil para interactividad /
.search-item.first-result:hover {
transform: translateY(-6px)
box-shadow: 0 18px 52px rgba(15,23,42,0.12)
}
/ Responsive: en pantallas pequeñas, stack vertical /
@media (max-width: 760px) {
.search-item.first-result {
grid-template-columns: 1fr
padding: 18px
}
.search-item.first-result .search-item-thumb {
order: -1 / mostrar la imagen arriba /
}
}
Markup de ejemplo (fragmento) usado con los estilos
ltarticle class=search-item first-resultgt
ltdiv class=search-item-thumbgt
ltimg src=https://ejemplo.com/wp-content/uploads/2025/01/imagen.jpg alt=Título del postgt
lt/divgt
ltdiv class=search-item-bodygt
lth2 class=search-item-titlegtlta href=https://ejemplo.com/mi-postgtTítulo destacado del resultadolt/agtlt/h2gt
ltdiv class=search-metagt
ltspan class=meta-dategt10 de enero, 2025lt/spangt
ltspan class=meta-authorgtpor Autorlt/spangt
lt/divgt
ltdiv class=search-item-excerptgtExtracto breve que resume el contenido del post y convence al usuario a hacer clic.lt/divgt
lt/divgt
lt/articlegt
Cómo hacerlo en el editor de bloques (Query Loop)
Si usas el Query Loop Block del editor (Gutenberg), el bloque renderizará posts con una clase de contenedor padre. Puedes seleccionar el primer post con CSS si la estructura es consistente. Ejemplo para bloque de posts:
/ Selector ejemplo para el primer post dentro del Query Loop /
.wp-block-post-template > .wp-block-post:first-child {
/ mismos estilos de tarjeta aquí /
}
Si el Query Loop genera marcados distintos, inspecciona el DOM y ajusta el selector para alcanzar el primer elemento.
Tabla comparativa: métodos
| Método | Pros | Contras |
|---|---|---|
| Modificar loop (PHP) | Control absoluto sobre la clase y el marcado | Requiere editar templates, riesgo si no se usa tema hijo |
| Filtro post_class | No tocar templates, centralizado | Puede requerir manejo extra para loops anidados |
| Solo CSS (:first-child) | Sin tocar PHP, rápido | Funciona solo si el DOM está en orden y sin wrappers inesperados |
Accesibilidad y buenas prácticas
- Asegúrate de que la imagen tenga alt descriptivo.
- No uses solo color para distinguir la tarjeta añade sombra o texto adicional para lectores de pantalla.
- Mantén el contraste entre texto y fondo según WCAG mínimo (4.5:1 para texto normal cuando sea posible).
- Si usas transform/hover para efectos, prueba que la interacción sea usable en dispositivos táctiles.
Rendimiento y caché
Evita cargar imágenes enormes en la tarjeta destacada usa tamaños de imagen adaptativos (srcset) o tamaños registrados con add_image_size y the_post_thumbnail( mi-size ). Si tu sitio usa caché (plugins o CDN), limpia la caché después de implementar cambios para verlos reflejados.
Ejemplo avanzado: imagen más grande en desktop y lazy-loading
lt?php
// Dentro del template: usar tamaño personalizado y attribute loading=lazy
if ( has_post_thumbnail() ) {
the_post_thumbnail( large, array( loading =gt lazy, alt =gt get_the_title() ) )
} else {
// fallback: imagen por defecto
echo ltimg src=https://ejemplo.com/placeholder.jpg alt=Imagen por defecto loading=lazygt
}
?gt
Pruebas y despliegue
- Haz los cambios en un tema hijo o entorno de staging.
- Comprueba la apariencia en varios tamaños de pantalla y navegadores.
- Verifica que el primer resultado se destaque solo en búsquedas (is_search()).
- Revisa accesibilidad (lectores de pantalla, contraste).
- Despliega al sitio en producción y limpia caché/preview.
Conclusión
Destacar el primer resultado de búsqueda en WordPress aporta dinamismo y puede aumentar la tasa de clics hacia contenido clave. Las tres aproximaciones presentadas (modificar el loop, usar filter en functions.php o aplicar CSS puro) se adaptan a distintas necesidades y niveles de acceso al tema. Utiliza la que mejor encaje con tu flujo de trabajo y recuerda probar en móviles y revisar accesibilidad.
Fin del artículo.
Leave a Reply