Tutorial WordPress: Crear chips de filtros en archivos usando CSS y HTML

·

·

Introducción

En este tutorial detallado aprenderás a crear chips de filtros (etiquetas filtrables estilo píldora) para páginas tipo archivos en WordPress usando HTML y CSS, con ejemplos de PHP y JavaScript para integrarlos en tu tema. Los chips permiten mostrar filtros activos, activarlos/desactivarlos con enlaces y mejorar la experiencia de navegación en listados de posts, productos o cualquier archivo que use parámetros en la URL.

Requisitos y consideraciones

Concepto y estructura HTML

Un chip consiste en un elemento visual compacto que muestra la etiqueta del filtro y, opcionalmente, un icono de cierre para quitarlo. Es importante que los chips sean enlaces (a) para que funcionen sin JavaScript y mantengan accesibilidad y SEO.

Estructura HTML de ejemplo

Marcado simple para un chip que actúa como enlace para activar/desactivar un filtro:

ltdiv class=filter-chipsgt
  lta href=lt?php echo esc_url( url_con_filtro ) ?gt class=chipgt
    ltspan class=chip-labelgtNombre del filtrolt/spangt
    lti class=chip-close aria-hidden=truegt×lt/igt
  lt/agt
lt/divgt

Generar chips dinámicamente en WordPress (PHP)

Ejemplos para:

1) Mostrar todos los términos (chips disponibles)

Este fragmento genera una lista de chips para una taxonomía llamada categoria_producto (cámbiala por la tuya):

lt?php
terms = get_terms( array(
  taxonomy => categoria_producto,
  hide_empty => false,
) )

if ( ! is_wp_error( terms )  ! empty( terms ) ) : ?>
  ltdiv class=filter-chipsgt
  lt?php foreach ( terms as term ) :
    // Construimos una URL que añade el filtro por slug de término
    url = add_query_arg( categoria_producto, term->slug, home_url( add_query_arg( array(), wp->request ) ) )
  ?gt
    lta href=lt?php echo esc_url( url ) ?gt class=chipgt
      ltspan class=chip-labelgtlt?php echo esc_html( term->name ) ?gtlt/spangt
    lt/agt
  lt?php endforeach ?gt
  lt/divgt
lt?php endif ?gt

2) Mostrar chips activos y permitir su eliminación

Cuando un filtro está activo (por ejemplo ?categoria_producto=slug), mostramos un chip con estilo activo y un enlace que elimina ese parámetro de la URL usando remove_query_arg().

lt?php
current = isset( _GET[categoria_producto] ) ? sanitize_text_field( wp_unslash( _GET[categoria_producto] ) ) : 

if ( current ) :
  // Intentamos obtener el término para mostrar el nombre legible
  term = get_term_by( slug, current, categoria_producto )
  label = term ? term->name : current

  // URL para quitar el filtro
  url_quitar = remove_query_arg( categoria_producto )

  ?gt
  ltdiv class=filter-chips active-chipsgt
    lta href=lt?php echo esc_url( url_quitar ) ?gt class=chip chip--active aria-pressed=truegt
      ltspan class=chip-labelgtlt?php echo esc_html( label ) ?gtlt/spangt
      lti class=chip-close aria-hidden=truegt×lt/igt
    lt/agt
  lt/divgt
lt?php endif ?gt

CSS: estilo detallado para chips

Un CSS completo con variantes: normal, hover, activo, removible, responsive y con transiciones suaves.

/ Contenedor /
.filter-chips {
  display: flex
  flex-wrap: wrap
  gap: 8px
  margin: 12px 0
  align-items: center
}

/ Chip base /
.chip {
  display: inline-flex
  align-items: center
  gap: 8px
  padding: 6px 10px
  border-radius: 999px / píldora /
  background: #f1f3f5
  color: #333
  text-decoration: none
  font-size: 0.95rem
  line-height: 1
  border: 1px solid rgba(0,0,0,0.06)
  transition: background .18s ease, transform .08s ease, box-shadow .12s ease
}

/ Hover y foco /
.chip:hover,
.chip:focus {
  background: #e9eef8
  transform: translateY(-1px)
  box-shadow: 0 4px 10px rgba(16,24,40,0.06)
  outline: none
}

/ Label dentro del chip /
.chip .chip-label {
  display: inline-block
  max-width: 200px
  white-space: nowrap
  overflow: hidden
  text-overflow: ellipsis
}

/ Icono de cierre (se puede ocultar si no se quiere visualmente) /
.chip .chip-close {
  display: inline-block
  font-style: normal
  font-weight: 600
  color: rgba(0,0,0,0.45)
  margin-left: 4px
}

/ Chip activo /
.chip--active {
  background: #2b6cb0
  color: #fff
  border-color: rgba(0,0,0,0.08)
}
.chip--active .chip-close {
  color: rgba(255,255,255,0.9)
}

/ Variante pequeña para contenedores densos /
.chip--small {
  padding: 4px 8px
  font-size: 0.82rem
}

/ Responsive: adaptamos tamaño en móviles /
@media (max-width: 480px) {
  .filter-chips { gap: 6px }
  .chip { padding: 6px 8px font-size: 0.9rem }
}

Mejoras con JavaScript (opcional)

Con JavaScript puedes interceptar la eliminación de chips para actualizar la lista sin recarga (AJAX) o para añadir animaciones. Aquí un ejemplo mínimo que evita la navegación si el enlace tiene data-remove=1 y hace un fetch para recargar el listado (requiere adaptar a tu endpoint).

// Añadir este código en un archivo JS encolado en WordPress
document.addEventListener(click, function(e) {
  var el = e.target.closest  e.target.closest(.chip[data-remove=1])
  if (!el) return

  e.preventDefault()
  var url = el.getAttribute(href)

  // Ejemplo: petición fetch para obtener nuevo fragmento HTML del listado (AJAX)
  fetch(url, { headers: { X-Requested-With: XMLHttpRequest } })
    .then(function(res){ return res.text() })
    .then(function(html){
      // Debes adaptar el selector para tu listado de posts
      var parser = new DOMParser()
      var doc = parser.parseFromString(html, text/html)
      var nuevoListado = doc.querySelector(.posts-list)
      var contenedor = document.querySelector(.posts-list)
      if (nuevoListado  contenedor) {
        contenedor.innerHTML = nuevoListado.innerHTML
        // También actualizar chips: podrías volver a insertar el bloque de chips
        var nuevoChips = doc.querySelector(.filter-chips)
        var contChips = document.querySelector(.filter-chips)
        if (nuevoChips  contChips) contChips.innerHTML = nuevoChips.innerHTML
      } else {
        // Si no se encuentra, recargamos la página como fallback
        window.location.href = url
      }
    })
    .catch(function(){ window.location.href = url })
})

Encolar el script en functions.php

function tema_enqueue_chips_scripts() {
  wp_enqueue_script( theme-filter-chips, get_stylesheet_directory_uri() . /js/filter-chips.js, array(), 1.0, true )
  // Si usas AJAX con admin-ajax o rutas, puedes pasar datos:
  // wp_localize_script( theme-filter-chips, filterChips, array( ajax_url => admin_url( admin-ajax.php ) ) )
}
add_action( wp_enqueue_scripts, tema_enqueue_chips_scripts )

Construcción robusta de URLs (añadir/quitar parámetros)

Para evitar errores y mantener compatibilidad con permalinks y paginación, usa add_query_arg() y remove_query_arg() de WordPress. Ejemplo práctico que añade varios filtros y preserva la paginación con saneamiento:

// Supongamos filtros: categoria_producto, color
base_url = remove_query_arg( paged ) // quitamos paginación al cambiar filtros

// Añadir filtro
url_add = add_query_arg( array(
  categoria_producto => mi-slug,
), base_url )

// Quitar filtro
url_remove = remove_query_arg( categoria_producto, base_url )

Buenas prácticas y accesibilidad

Ejemplo completo (resumen práctico)

Plantilla parcial que muestra chips de términos y chips activos, lista mínima de posts filtrados y estilos. Integra los fragmentos mostrados anteriormente para tener una solución funcional y progresiva.

Tabla resumen de clases y su propósito

Clase Propósito
.filter-chips Contenedor de los chips, maneja flexbox y separación.
.chip Estilo base del chip (píldora, padding, color).
.chip–active Estado visual activo para chips seleccionado.
.chip-close Icono de cierre / eliminación dentro del chip.

Conclusión técnica

Con este enfoque tienes una solución accesible y progresiva: los chips funcionan sin JavaScript (enlaces con parámetros), se estilizan con CSS para una UX moderna y pueden mejorarse con JavaScript para interacciones AJAX. Integra los fragmentos PHP en tus plantillas de archivo o en plantillas parciales, añade el CSS en tu tema hijo y, si necesitas, encola el JS con la API de WordPress para mantener buenas prácticas.



Leave a Reply

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