Tutorial WordPress: Hacer una cuadrícula de iconos SVG inline con CSS utilitario

·

·

Introducción

Este tutorial muestra, paso a paso y con todo lujo de detalles, cómo crear una cuadrícula de iconos SVG inline en WordPress utilizando CSS utilitario. El enfoque se centra en: insertar los iconos como SVG inline (sprite o símbolos), exponerlos de forma segura en una plantilla o mediante un hook de WordPress, y aplicar utilidades CSS mínimas y reutilizables para construir una cuadrícula flexible, accesible y fácilmente personalizable.

Ventajas de usar SVG inline utilidades CSS

Requisitos previos

Paso 1 — Preparar los SVG

Conviene estandarizar los SVG para que funcionen bien con CSS utilitario:

Ejemplo de un icono optimizado (archivo individual o símbolo):

ltsvg viewBox=0 0 24 24 xmlns=http://www.w3.org/2000/svg aria-hidden=truegt
  ltpath fill=currentColor d=M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z/gt
lt/svggt

Paso 2 — Crear un sprite SVG inline (símbolos)

Una manera eficiente es centralizar todos los iconos dentro de un único ltsvggt en el DOM, usando ltsymbolgt para cada icono. Este bloque se puede imprimir una sola vez (por ejemplo, al inicio del ltbodygt), y luego usar ltusegt para reutilizar cada símbolo.

Formato del sprite (archivo sprite.svg o generado):

ltsvg xmlns=http://www.w3.org/2000/svg style=display:nonegt
  ltsymbol id=icon-home viewBox=0 0 24 24gt
    ltpath fill=currentColor d=M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z/gt
  lt/symbolgt

  ltsymbol id=icon-user viewBox=0 0 24 24gt
    ltpath fill=currentColor d=M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10zm0 2c-5 0-9 2.5-9 5v1h18v-1c0-2.5-4-5-9-5z/gt
  lt/symbolgt
lt/svggt

Paso 3 — Incluir el sprite en WordPress correctamente

Lo ideal es inyectar el sprite inline una sola vez en el DOM (normalmente justo tras la apertura de ltbodygt). Usaremos el hook wp_body_open cuando esté disponible. Si tu tema no lo soporta, puedes insertar el sprite en header.php inmediatamente antes del contenido.

Ejemplo de función en functions.php que imprime el sprite desde un archivo en tu tema:

/
  Inyecta el sprite SVG inline al inicio del body.
 /
function tema_insert_svg_sprite() {
  sprite_path = get_template_directory() . /assets/icons/sprite.svg
  if ( file_exists( sprite_path ) ) {
    echo file_get_contents( sprite_path )
  }
}
add_action( wp_body_open, tema_insert_svg_sprite, 5 )

Si tu tema no soporta wp_body_open, puedes usar wp_head aunque por semántica es preferible body ajustar prioridad para que se inserte antes del contenido visible.

Paso 4 — HTML de los iconos usando ltusegt

Una vez el sprite está inline, cada icono se instancia con ltsvggtltusegt. Para que el color sea controlado por CSS, el path debe usar fill=currentColor.

ltdiv class=icons-gridgt
  ltbutton class=icon-item aria-label=Iniciogt
    ltsvg class=icon role=img aria-hidden=truegt
      ltuse href=#icon-homegtlt/usegt
    lt/svggt
    ltspan class=labelgtIniciolt/spangt
  lt/buttongt

  ltbutton class=icon-item aria-label=Perfilgt
    ltsvg class=icon role=img aria-hidden=truegt
      ltuse href=#icon-usergtlt/usegt
    lt/svggt
    ltspan class=labelgtPerfillt/spangt
  lt/buttongt
lt/divgt

Nota sobre ltusegt y atributos

Usar href=#icon-id es la sintaxis actual en navegadores más antiguos puede ser necesario xlink:href. Al usar inline (sprite dentro del mismo documento) no hay problemas de CORS.

Paso 5 — CSS utilitario para una cuadrícula de iconos

Diseñaremos utilidades mínimas y reutilizables (inspiradas en enfoque utility-first). Esto permite aplicar tamaño, color, espaciado y estructura de cuadrícula con clases sencillas.

/ Contenedor de cuadrícula flexible /
.icons-grid {
  display: grid
  gap: 1rem
  grid-template-columns: repeat(auto-fit, minmax(96px, 1fr))
  align-items: center
}

/ Elemento que contiene el icono   etiqueta /
.icon-item {
  display: flex
  flex-direction: column
  align-items: center
  justify-content: center
  gap: .5rem
  padding: .75rem
  background: transparent
  border: none
  cursor: pointer
  color: #2c3e50 / color base, cambia con utilidades /
}

/ Base para el SVG: tamaño relativo a la fuente mediante em /
.icon {
  width: 2.25rem   / 36px aprox si 16px base /
  height: 2.25rem
  display: block
  flex: 0 0 auto
  fill: currentColor / importante: permite controlar color con color del contenedor /
}

/ Tamaños utilitarios /
.icon--sm  { width: 1.5rem height: 1.5rem }
.icon--md  { width: 2rem   height: 2rem }
.icon--lg  { width: 3rem   height: 3rem }

/ Colores utilitarios (ejemplo simple) /
.text-primary { color: #0a66c2 }
.text-muted   { color: #6b7280 }

/ Ajustes accesibles: indica foco visible /
.icon-item:focus {
  outline: 2px solid #2563eb
  outline-offset: 2px
  border-radius: 6px
}

Paso 6 — Ejemplo completo: cuadrícula responsiva

Este ejemplo combina sprite inline, HTML para los iconos y las utilidades CSS para generar una cuadrícula de iconos clara y responsive.

lt!-- (Sprite ya inyectado en el DOM con tema_insert_svg_sprite) --gt
ltsection class=icons-grid aria-label=Accesos rápidosgt

  ltbutton class=icon-item text-primary aria-label=Iniciogt
    ltsvg class=icon icon--md aria-hidden=truegtltuse href=#icon-homegtlt/usegtlt/svggt
    ltspan class=labelgtIniciolt/spangt
  lt/buttongt

  ltbutton class=icon-item text-muted aria-label=Perfilgt
    ltsvg class=icon icon--md aria-hidden=truegtltuse href=#icon-usergtlt/usegtlt/svggt
    ltspan class=labelgtPerfillt/spangt
  lt/buttongt

  lt!-- Repetir según necesidad --gt
lt/sectiongt

Paso 7 — Accesibilidad (a11y)

  1. Si el icono es puramente decorativo, incluye aria-hidden=true en el ltsvggt para que los lectores lo ignoren.
  2. Si el icono transmite información, añade un lttitle id=title-idgt y usa aria-labelledby=title-id en el ltsvggt o proporciona texto visible asociado (ej. la etiqueta).
  3. Si usas botones, asegúrate de que tengan atributo aria-label o texto visible que describa la acción.
  4. Ofrece indicadores de foco visibles (outline o box-shadow) para la navegación por teclado.

Paso 8 — Seguridad y consideraciones al aceptar SVG en WordPress

Paso 9 — Rendimiento y buenas prácticas

Variaciones y patrones avanzados

Ejemplo: incluir sprite desde archivo y sanitización mínima

Solo como referencia, aquí se muestra una forma sencilla (no sustituto de una sanitización completa) de inyectar el contenido de un archivo SVG existente en el theme:

function tema_get_svg_sprite( path ) {
  if ( ! file_exists( path ) ) {
    return 
  }
  svg = file_get_contents( path )
  / Limpieza mínima: eliminar posibles etiquetas ltscriptgt (no es completa) /
  svg = preg_replace(#ltscript.?lt/scriptgt#is, , svg)
  return svg
}
add_action( wp_body_open, function() {
  echo tema_get_svg_sprite( get_template_directory() . /assets/icons/sprite.svg )
}, 5 )

Problemas comunes y soluciones

Resumen

Crear una cuadrícula de iconos SVG inline con CSS utilitario en WordPress es una solución poderosa, accesible y eficiente. El flujo recomendado es:

  1. Optimizar los SVG (viewBox, fill=currentColor).
  2. Generar un sprite SVG y inyectarlo inline (ej. con wp_body_open).
  3. Usar ltsvggtltusegt para instanciar iconos.
  4. Aplicar utilidades CSS para tamaño, color y layout (grid responsive).
  5. Garantizar sanitización y seguridad si permites subir SVG.

Recursos adicionales

Puedes leer sobre: SVG accessibility, SVGO para optimización, y plugins de WordPress que manejan SVG seguros. También es buena práctica automatizar la generación del sprite con tu pipeline de build para mantener el control de versiones y optimización.



Leave a Reply

Your email address will not be published. Required fields are marked *