Introducción
Este tutorial explica con todo lujo de detalles cómo alinear logos de partners en una rejilla responsive para WordPress. Incluye alternativas (CSS Grid, Flexbox), prácticas recomendadas para imágenes (retina, srcset, lazy loading), ejemplos de PHP para obtener logos desde un Custom Post Type o un shortcode, y consideraciones de accesibilidad y rendimiento. Todos los ejemplos de código están incluidos en bloques listos para copiar.
Requisitos previos
- Tener un sitio WordPress (idealmente usar un child theme si vas a modificar archivos de tema).
- Conocer cómo añadir un Custom Post Type (CPT) o usar campos personalizados (ACF) / imágenes destacadas para los logos.
- Acceso para editar functions.php y los estilos CSS del tema (o añadir un archivo CSS propio y enlazarlo).
Concepto general y estructura HTML recomendada
La estructura que recomiendo es una lista semántica (ul > li) donde cada item contiene la imagen del logo y, opcionalmente, un enlace al partner. La lista es ideal para accesibilidad porque representa una colección de elementos relacionados.
Ejemplo de estructura (marcada como ejemplo en el bloque de código):
ltul class=partners-gridgt
ltli class=partner-itemgt
lta href=https://partner.example title=Partner Agt
ltimg src=logo-partner-a.png alt=Logo Partner Agt
lt/agt
lt/ligt
ltli class=partner-itemgt
ltimg src=logo-partner-b.png alt=Logo Partner Bgt
lt/ligt
lt!-- más items --gt
lt/ulgt
Enfoque CSS — Opciones para una rejilla responsive
Dos aproximaciones sólidas: CSS Grid (la más potente para rejillas) o Flexbox (sencilla y compatible). Ambas mantienen los logos centrados, con tamaño uniforme y respetando la relación de aspecto.
1) CSS Grid — auto-fit / minmax (recomendado)
Ventajas: control sencillo de columnas, gaps consistentes, buena respuesta a distintos anchos.
/ Variables para ajustar rápidamente /
:root{
--partner-min: 120px / ancho mínimo del logo /
--partner-gap: 20px
}
/ Contenedor de la rejilla /
.partners-grid{
display: grid
grid-template-columns: repeat(auto-fit, minmax(var(--partner-min), 1fr))
gap: var(--partner-gap)
align-items: center
list-style: none
margin: 0
padding: 0
}
/ Cada celda /
.partner-item{
display: flex
align-items: center
justify-content: center
padding: 12px / espacio alrededor de cada logo /
background: transparent / o color si lo deseas /
}
/ Asegurar que la imagen se adapte sin recortarse /
.partner-item img{
max-width: 100%
max-height: 60px / controla la altura visual de todos los logos /
width: auto
height: auto
object-fit: contain / mantiene proporciones dentro del contenedor /
display: block
margin: 0 auto
transition: transform .25s ease, filter .25s ease
}
/ Opcional: efecto hover /
.partner-item a:hover img,
.partner-item:hover img{
transform: scale(1.03)
filter: none
}
/ Ajustes para pantallas muy pequeñas /
@media (max-width: 480px){
:root{ --partner-min: 90px --partner-gap: 12px }
.partner-item img{ max-height: 48px }
}
2) Flexbox — alternativa simple
.partners-grid{
display: flex
flex-wrap: wrap
gap: 20px
align-items: center
justify-content: center
padding: 0
margin: 0
}
.partner-item{
flex: 1 1 140px / crece, encoge y base mínima /
display: flex
align-items: center
justify-content: center
padding: 10px
min-width: 100px
max-width: 220px
}
.partner-item img{
max-width: 100%
max-height: 60px
object-fit: contain
}
Controlar la altura y la apariencia uniforme
Para que todos los logos tengan una altura visual coherente, usar max-height en la imagen y object-fit: contain. Si quieres recuadros exactos (misma altura/anchura) puedes envolver la imagen en un contenedor con un aspect-ratio fijo o usar padding hacks.
/ Contenedor cuadrado para logos con fondo transparente centrado /
.partner-logo-box{
width: 100%
aspect-ratio: 3 / 1 / navegador moderno /
display: flex
align-items: center
justify-content: center
padding: 8px
}
.partner-logo-box img{ max-height: 100% max-width: 100% object-fit: contain }
Optimización de imágenes en WordPress (srcset, retina, lazy load)
- Usa add_image_size para crear tamaños específicos para logos y así servir imágenes optimizadas.
- Cuando uses wp_get_attachment_image, WordPress generará automáticamente el atributo srcset para retina y distintos tamaños.
- WordPress moderno añade loading=lazy por defecto en las imágenes de contenido, pero comprueba que tu output lo tenga.
- Convertir a WebP y servir versiones optimizadas mejora tiempos. Plugins de optimización pueden automatizarlo.
Ejemplos prácticos en PHP para WordPress
1) Registrar un tamaño de imagen y encolar estilos
// functions.php (child theme)
add_action(after_setup_theme, function(){
// tamaño personalizado para logos
add_image_size(partner-logo, 400, 200, false) // no crop, mantener proporciones
})
add_action(wp_enqueue_scripts, function(){
wp_enqueue_style(partners-styles, get_stylesheet_directory_uri() . /css/partners.css, array(), 1.0)
})
2) Bucle PHP: obtener logos de un Custom Post Type partner
Asumo que creaste un CPT llamado partner y que usas la imagen destacada para el logo. El siguiente código genera la lista semántica con clases esperadas por los estilos CSS anteriores.
// template o shortcode
query = new WP_Query(array(
post_type => partner,
posts_per_page => -1,
orderby => menu_order,
order => ASC,
))
if(query->have_posts()):
echo ltul class=partners-gridgt
while(query->have_posts()): query->the_post()
link = get_post_meta(get_the_ID(), partner_url, true) // si tienes campo URL
alt = get_the_title()
echo ltli class=partner-itemgt
if(link){
echo lta href= . esc_url(link) . title= . esc_attr(alt) . gt
echo wp_get_attachment_image( get_post_thumbnail_id(), partner-logo, false, array(alt => esc_attr(alt)) )
echo lt/agt
} else {
echo wp_get_attachment_image( get_post_thumbnail_id(), partner-logo, false, array(alt => esc_attr(alt)) )
}
echo lt/ligt
endwhile
echo lt/ulgt
wp_reset_postdata()
endif
3) Shortcode configurable (opcional)
Shortcode para insertar la rejilla en cualquier página y cambiar número de columnas vía atributo CSS personalizado.
// functions.php
function partners_grid_shortcode(atts){
atts = shortcode_atts(array(
min => 120px,
gap => 20px
), atts, partners_grid)
// inyecta variable CSS inline (podrías mejor manejarlo mediante clases)
style = sprintf(, esc_attr(atts[min]), esc_attr(atts[gap]))
// Reutiliza el bucle anterior (simplificado)
ob_start()
echo style
// ... (aquí incluirías el mismo bucle WP_Query mostrado arriba)
// Por brevedad, se asume que hay una función que imprime la lista: print_partners_list()
print_partners_list()
return ob_get_clean()
}
add_shortcode(partners_grid, partners_grid_shortcode)
Accesibilidad y SEO
- Siempre incluir atributo alt descriptivo en cada imagen. Si la imagen es puramente decorativa, usar alt vacío.
- Si el logo enlaza a la web del partner, añadir title y asegúrate de que el enlace tenga rel=noopener noreferrer si abre en nueva pestaña.
- Usar roles semánticos si haces markup más complejo — la lista es ya semántica y suficiente en la mayoría de casos.
Rendimiento y mejores prácticas
- Genera tamaños de imagen adecuados con add_image_size y usa las funciones de WP para output (wp_get_attachment_image).
- Habilita lazy-loading (WordPress ya lo añade a muchas imágenes) y usa formatos modernos (WebP).
- Evita cargar logos excesivamente grandes usar 2x assets para retina si no confías en srcset automático.
- Minimiza animaciones y evita sombras/gradientes pesados que afecten paint cost en mobile.
Animaciones y efectos opcionales
Animaciones ligeras (transform: scale, transition) aportan dinamismo sin penalizar mucho el rendimiento. Evitar animaciones que cambien layout o provoquen repaints masivos.
.partner-item img{
transition: transform .25s cubic-bezier(.2,.8,.2,1), filter .25s
filter: grayscale(.25)
}
.partner-item:hover img{ transform: translateY(-3px) scale(1.03) filter: grayscale(0) }
Comprobaciones y depuración
- Prueba con logos de distintas proporciones (vertical, horizontal, cuadrado) para verificar que object-fit y max-height funcionan correctamente.
- Usa herramientas de navegador para comprobar srcset y imágenes servidas en mobile/desktop.
- Verifica accesibilidad con lectores de pantalla o herramientas automáticas (axe, Lighthouse).
Ejemplo final completo
Combina lo mostrado: registra tamaño, añade CSS grid y un bucle que use wp_get_attachment_image para sacar srcset y loading automático. Este es el patrón que recomiendo en la mayoría de proyectos WordPress.
Resumen práctico
- Usa una lista (ul > li) para semántica y accesibilidad.
- Prefiere CSS Grid con repeat(auto-fit, minmax(…)) para rejillas fluidas.
- Controla la altura visual con max-height y object-fit: contain.
- Genera tamaños de imagen y usa wp_get_attachment_image para srcset/retina y lazy loading automático.
- Optimiza imágenes (WebP, compresión) y evita cargar assets innecesarios.
Notas finales
Aplicando estas técnicas lograrás una rejilla de logos de partners que se adapta a pantallas, mantiene proporciones y carga de forma eficiente. Usa los fragmentos de código provistos como punto de partida y adapta estilos y tamaños a tu diseño específico.
Leave a Reply