Tutorial WordPress: Convertir la paginación “Anterior/Siguiente” en botones con CSS

·

·

Introducción

En este tutorial detallado veremos cómo convertir la paginación clásica de WordPress que muestra enlaces tipo “Anterior / Siguiente” en botones visuales y accesibles usando únicamente CSS (y pequeñas mejoras en el HTML/PHP cuando sea necesario). Cubriremos desde cómo identificar la salida de paginación en tu tema, cómo envolverla con clases útiles, ejemplos prácticos de PHP para modificar la salida y varias hojas de estilo CSS para transformar los enlaces en botones con estados, iconografía, accesibilidad y comportamiento responsive.

Requisitos previos

Concepto

La mayoría de los temas simples usan funciones como previous_posts_link() y next_posts_link() que imprimen enlaces con el texto “Anterior” / “Siguiente”. La idea es:

  1. Modificar la salida HTML para añadir contenedores y clases CSS coherentes (si el tema no las tiene).
  2. Escribir CSS que convierta esos enlaces en botones (estética) y gestione estados (hover, focus, disabled).
  3. Asegurar la accesibilidad: roles, atributos aria, rel prev/next, foco visible y soporte para lectores de pantalla y RTL.

1) Localizar la paginación en tu tema

Busca en archivos como index.php, archive.php, home.php, single.php o template-parts la llamada a previous_posts_link/next_posts_link o a paginate_links(). Un ejemplo típico que encontrarás:

lt?php if ( get_next_posts_link()  get_previous_posts_link() ) : ?gt
  ltdiv class=nav-linksgt
    ltdiv class=nav-previousgtlt?php previous_posts_link( Anterior ) ?gtlt/divgt
    ltdiv class=nav-nextgtlt?php next_posts_link( Siguiente ) ?gtlt/divgt
  lt/divgt
lt?php endif ?gt

2) Mejorar la salida HTML (añadir clases y roles)

Si tu tema no añade clases útiles, cambia el template para añadir clases y atributos accesibles. Ejemplo sencillo que añade roles, rel y aria-label:

lt?php if ( get_next_posts_link()  get_previous_posts_link() ) : ?gt
  ltnav class=pagination-wrap role=navigation aria-label=Paginación del sitiogt
    ltdiv class=pagination-buttonsgt
      lt?php
        // Envolver los links y añadir clases
        if ( get_previous_posts_link() ) {
          echo lta class=page-btn page-btn--prev href= . esc_url( get_previous_posts_page_link() ) .  rel=prevgtAnteriorlt/agt
        } else {
          echo ltspan class=page-btn page-btn--prev is-disabled aria-disabled=truegtAnteriorlt/spangt
        }
        if ( get_next_posts_link() ) {
          echo lta class=page-btn page-btn--next href= . esc_url( get_next_posts_page_link() ) .  rel=nextgtSiguientelt/agt
        } else {
          echo ltspan class=page-btn page-btn--next is-disabled aria-disabled=truegtSiguientelt/spangt
        }
      ?gt
    lt/divgt
  lt/navgt
lt?php endif ?gt

Nota: get_previous_posts_page_link() y get_next_posts_page_link() pueden no estar disponibles en todas las versiones. Si prefieres mantener previous_posts_link() y next_posts_link() puedes filtrar su salida o envolver las funciones como prefieras. Lo importante es obtener un enlace a con clases y, cuando no hay enlace, un elemento no interactivo (span) con clase de deshabilitado y aria-disabled.

3) Uso de paginate_links para paginación avanzada

Si usas paginate_links() y quieres controlar prev/next como botones, pide que genere un tipo list y luego reestilízalo. Ejemplo:

lt?php
big = 999999999 // necesidad por paginate_links
pages = paginate_links( array(
  base      =gt str_replace( big, %#%, esc_url( get_pagenum_link( big ) ) ),
  format    =gt ?paged=%#%,
  current   =gt max( 1, get_query_var(paged) ),
  total     =gt wp_query-gtmax_num_pages,
  type      =gt array,
  prev_text =gt lt Anterior,
  next_text =gt Siguiente gt,
) )
if ( is_array( pages ) ) {
  echo ltnav class=pagination-wrap role=navigation aria-label=Paginacióngtltul class=pagination-listgt
  foreach ( pages as page ) {
    echo ltli class=pagination-itemgt . page . lt/ligt
  }
  echo lt/ulgtlt/navgt
}
?gt

Con type =gt array obtienes cada elemento ya envuelto en ltagt o span. Luego aplicas CSS para convertir los enlaces de esa lista en botones.

4) CSS: convertir enlaces “Anterior/Siguiente” en botones

A continuación tienes una hoja de estilos completa y comentada que transforma enlaces con la clase .page-btn en botones modernos, accesibles y responsivos. Ajusta colores y variables a tu sistema de diseño.

:root{
  --btn-bg: #f3f4f6
  --btn-color: #111827
  --btn-bg-accent: #1f8ef1
  --btn-color-on-accent: #ffffff
  --btn-border-radius: 8px
  --btn-padding: 0.6rem 1rem
  --btn-gap: 0.5rem
  --btn-shadow: 0 2px 6px rgba(16,24,40,0.06)
}

/ Contenedor: centrar y repartir /
.pagination-buttons{
  display: inline-flex
  gap: var(--btn-gap)
  align-items: center
  justify-content: center
  flex-wrap: wrap
}

/ Estilo base de los botones (enlaces y spans) /
.page-btn,
.pagination-list .page-numbers {
  display: inline-flex
  align-items: center
  gap: 0.5rem
  padding: var(--btn-padding)
  background: var(--btn-bg)
  color: var(--btn-color)
  text-decoration: none
  border-radius: var(--btn-border-radius)
  box-shadow: var(--btn-shadow)
  font-weight: 600
  border: 1px solid rgba(15,23,42,0.06)
  transition: transform .08s ease, box-shadow .12s ease, background .12s ease
  cursor: pointer
}

/ Estilo para el botón Siguiente (por ejemplo con color de acento) /
.page-btn--next {
  background: var(--btn-bg-accent)
  color: var(--btn-color-on-accent)
}

/ Iconos con pseudo-elementos: flechas /
.page-btn--prev::before,
.page-btn--next::after {
  font-weight: 700
  font-size: 1rem
  color: inherit
  display: inline-block
  line-height: 1
}

/ Flecha izquierda antes del Prev /
.page-btn--prev::before {
  content: ‹
  margin-right: 0.35rem
}

/ Flecha derecha después del Next /
.page-btn--next::after {
  content: ›
  margin-left: 0.35rem
}

/ Hover / Focus /
.page-btn:hover,
.page-btn:focus{
  transform: translateY(-2px)
  box-shadow: 0 6px 18px rgba(16,24,40,0.12)
  text-decoration: none
  outline: none
}

/ Focus visible accesible /
.page-btn:focus-visible{
  outline: 3px solid rgba(30,120,240,0.18)
  outline-offset: 3px
}

/ Estado deshabilitado /
.page-btn.is-disabled,
.page-btn[aria-disabled=true]{
  opacity: 0.45
  cursor: default
  pointer-events: none
  transform: none
  box-shadow: none
}

/ Tamaño pequeño en móviles (apilar) /
@media (max-width: 520px){
  .pagination-buttons{
    width: 100%
    gap: 0.5rem
    justify-content: space-between
  }
  .page-btn{
    flex: 1 1 48%
    text-align: center
  }
}

/ Estilos si usas paginate_links y una lista /
.pagination-list{
  display: inline-flex
  gap: var(--btn-gap)
  list-style: none
  padding: 0
  margin: 0
  align-items: center
}
.pagination-list .page-numbers{
  / convierte los enlaces del paginate_links en botones coherentes /
  padding: 0.45rem 0.75rem
  background: transparent
  border-radius: 6px
  box-shadow: none
  border: 1px solid transparent
  color: var(--btn-color)
  font-weight: 600
}
.pagination-list .current{
  background: var(--btn-bg-accent)
  color: var(--btn-color-on-accent)
  border-color: rgba(0,0,0,0.06)
}

5) Accesibilidad y atributos recomendados

6) Soporte RTL y flechas correctas

Para soportar idiomas RTL (árabe, hebreo…) puedes invertir las flechas mediante selectores que detecten el atributo dir. Ejemplo CSS:

/ Si el documento está en RTL /
[dir=rtl] .page-btn--prev::before { content: › }
[dir=rtl] .page-btn--next::after  { content: ‹ }

/ También puedes adaptar el orden visual si quieres que el Prev aparezca a la derecha /
[dir=rtl] .pagination-buttons { direction: rtl }

7) Ejemplos de variaciones visuales

8) Consejos finales y buenas prácticas

  1. Usa un tema hijo para no perder cambios cuando actualices el tema original.
  2. Prueba la paginación en varios navegadores y en dispositivos móviles para confirmar comportamiento responsive.
  3. Si tu tema usa bloques (Gutenberg) y renderiza la paginación mediante funciones internas, investiga si existe un filtro o hook que permita modificar clases en la salida para no editar directamente plantillas del tema.
  4. Comprueba con herramientas de accesibilidad (como Lighthouse o WAVE) que tu paginación cumple los criterios de contraste y navegación por teclado.

Ejemplo completo (PHP CSS resumido)

A continuación un ejemplo mínimo funcional que combina la plantilla y el CSS ya presentado (usa este ejemplo como punto de partida).

/ PHP: insertar en tu template donde quieras la paginación /
lt?php if ( get_next_posts_link()  get_previous_posts_link() ) : ?gt
  ltnav class=pagination-wrap role=navigation aria-label=Paginación del sitiogt
    ltdiv class=pagination-buttonsgt
      lt?php
        if ( get_previous_posts_link() ) {
          previous_posts_link( ltspan class=page-btn page-btn--prevgtAnteriorlt/spangt )
        } else {
          echo ltspan class=page-btn page-btn--prev is-disabled aria-disabled=truegtAnteriorlt/spangt
        }
        if ( get_next_posts_link() ) {
          next_posts_link( ltspan class=page-btn page-btn--nextgtSiguientelt/spangt )
        } else {
          echo ltspan class=page-btn page-btn--next is-disabled aria-disabled=truegtSiguientelt/span
        }
      ?gt
    lt/divgt
  lt/navgt
lt?php endif ?gt

Sustituye las llamadas o adapta la estructura al tipo de paginación que use tu tema. Con el CSS ya mostrado transformarás los enlaces en botones visuales con buenos estados y accesibilidad.

Resumen

Convertir “Anterior / Siguiente” en botones consiste en: añadir clases/roles adecuados en la salida HTML/PHP del tema, aplicar CSS que dé apariencia de botón (y gestione hover, focus, disabled), y garantizar accesibilidad (aria, rel, foco visible). Aplica los snippets mostrados y ajústalos al sistema de diseño de tu sitio.



Leave a Reply

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