Tutorial WordPress: Crear etiquetas de “Gratis” o “Premium” con pseudo-elementos CSS

·

·

Introducción

En este tutorial aprenderás paso a paso a crear etiquetas visuales de “Gratis” o “Premium” para entradas, tarjetas de productos u otros elementos de tu sitio WordPress usando pseudo-elementos CSS (::before y ::after). La ventaja de esta técnica es que no necesitas añadir marcas adicionales en tu HTML de salida: basta con añadir una clase o un atributo (desde PHP o el loop) y el CSS se encarga de dibujar la etiqueta. Verás ejemplos prácticos, variantes (cinta diagonal, rectángulo, esquina), cómo añadir la clase desde WordPress (categoría, meta o filter) y consideraciones de accesibilidad y responsive.

Concepto básico

La idea es marcar tus bloques (artículos, tarjetas, product cards) con una clase o atributo como .es-gratis o .es-premium, y usar un pseudo-elemento para generar la etiqueta visual. Ejemplo conceptual del HTML que genera WordPress (simplificado):

ltarticle class=post-card es-premiumgt
  lta href=...  class=post-card__thumbgtltimg src=... alt=...gtlt/agt
  lth3 class=post-card__titlegtTítulolt/h3gt
lt/articlegt

Ejemplo CSS: etiqueta diagonal tipo cinta

Esta versión crea una “cinta” diagonal en la esquina superior izquierda. Funciona bien para tarjetas con posición relativa.

/ Reglas base: la tarjeta debe ser contenedor posicionado /
.post-card { position: relative overflow: visible }

/ Cinta genérica (se aplicará cuando exista la clase correspondiente) /
.post-card.es-premium::before,
.post-card.es-gratis::before {
  content: attr(data-label) / puede tomar texto desde data-attribute /
  position: absolute
  top: 12px
  left: -40px / ajusta según rotación y tamaño /
  transform: rotate(-45deg)
  transform-origin: 0 0
  display: inline-block
  padding: 6px 48px
  color: #fff
  font-weight: 700
  font-size: 12px
  letter-spacing: .5px
  box-shadow: 0 2px 6px rgba(0,0,0,.15)
  border-radius: 2px / opcional /
  pointer-events: none / decorativo /
  z-index: 10
}

/ Estilos por tipo /
.post-card.es-premium::before {
  background: linear-gradient(135deg,#ff7a18,#ff4e50)
}
.post-card.es-gratis::before {
  background: linear-gradient(135deg,#28c76f,#2ecc71)
  color: #0b2b17
}

Ejemplo CSS: etiqueta rectangular en la esquina

Si prefieres algo menos intrusivo que una cinta diagonal, aquí tienes un rectángulo sobre la esquina superior derecha.

.post-card { position: relative overflow: hidden }

.post-card.es-premium::before,
.post-card.es-gratis::before {
  content: attr(data-label)
  position: absolute
  top: 12px
  right: 12px
  display: inline-block
  padding: 4px 10px
  font-size: 12px
  font-weight: 600
  border-radius: 4px
  color: #fff
  box-shadow: 0 1px 4px rgba(0,0,0,.12)
  pointer-events: none
  z-index: 20
}

.post-card.es-premium::before { background: #d9534f }
.post-card.es-gratis::before  { background: #5cb85c color: #012 }

Soporte RTL y ajustes responsivos

Para entornos RTL (idiomas como árabe o hebreo) y para pantallas pequeñas, controla la posición con reglas específicas:

/ RTL: intercambia left/right para cinta o rectángulo /
html[dir=rtl] .post-card.es-premium::before {
  left: auto
  right: -40px
  transform-origin: 100% 0
  transform: rotate(45deg)
}

/ Adaptación móvil: reducir tamaño de la cinta /
@media (max-width: 480px) {
  .post-card.es-premium::before,
  .post-card.es-gratis::before {
    padding: 4px 30px
    font-size: 11px
    top: 8px
    left: -26px
  }
  html[dir=rtl] .post-card.es-premium::before {
    right: -26px
  }
}

Accesibilidad

Las pseudo-etiquetas son puramente visuales. Para usuarios de lectores de pantalla y SEO es recomendable añadir además texto semántico (visualmente oculto) o usar atributos que describan el estado. Dos alternativas:

/ Clase de ejemplo para ocultar texto visualmente pero mantenerlo accesible /
.screen-reader-text {
  position: absolute !important
  height: 1px width: 1px
  overflow: hidden clip: rect(1px, 1px, 1px, 1px)
  white-space: nowrap border: 0 padding: 0 margin: -1px
}

Cómo añadir la clase o atributo desde WordPress

A continuación verás ejemplos de cómo añadir la clase es-premium o es-gratis en la salida del loop o en tarjetas de producto. Es preferible añadir la clase en PHP y no insertar spans extra para mantener el marcado limpio y permitir que los pseudo-elementos trabajen.

1) Basado en metadato personalizado (post meta)

Supongamos que usas un meta key llamado is_premium con valor 1 para contenido premium. Puedes añadir la clase al atributo class o como data-label.

/ functions.php o en el template del loop /
post_id = get_the_ID()
is_premium = get_post_meta( post_id, is_premium, true )

classes = array( post-card )
if ( is_premium ) {
  classes[] = es-premium
  data_label = Premium
} else {
  classes[] = es-gratis
  data_label = Gratis
}

?>
ltarticle class= data-label=gt
  lt!-- resto de la card --gt
lt/articlegt

2) Usando post_class filter (añadir clase automáticamente)

Si quieres que todas las llamadas a post_class incluyan la clase, añade un filtro:

/ En functions.php /
add_filter( post_class, function( classes, class, post_id ) {
    is_premium = get_post_meta( post_id, is_premium, true )
    if ( is_premium ) {
        classes[] = es-premium
    } else {
        classes[] = es-gratis
    }
    return classes
}, 10, 3 )

3) Basado en categoría o taxonomía

Si distingues contenidos por categoría (por ejemplo categoría premium), puedes comprobar si el post pertenece a esa categoría:

/ En el loop o template /
if ( has_category( premium, get_the_ID() ) ) {
  echo ltarticle class=post-card es-premium data-label=Premiumgt
} else {
  echo ltarticle class=post-card es-gratis data-label=Gratisgt
}

4) Ejemplo con WooCommerce: marcar productos premium

Para productos WooCommerce puedes usar hooks para añadir la clase al bucle de productos. Aquí un ejemplo sencillo que imprime data-label en la plantilla del producto (sin añadir elementos extra visibles):

/ functions.php /
add_action( woocommerce_before_shop_loop_item, function() {
    global product
    if ( ! product ) return
    is_premium = get_post_meta( product->get_id(), is_premium, true )

    // Inyectar atributo data-label en el wrapper que inicia en plantilla.
    // Alternativa: filtrar la salida del wrapper con switch de template.
    // Ejemplo simple: imprimir un script data attribute para que JS/selector lo use
    if ( is_premium ) {
        echo lt!-- premium: true --gt
    } else {
        echo lt!-- premium: false --gt
    }
}, 5 )

Nota: WooCommerce estructura sus templates la forma más robusta es sobrescribir la plantilla del loop de producto o añadir tu propia clase al envolver la tarjeta del producto en tu theme child.

Variaciones visuales y consejos de diseño

  • Colores coherentes: usa variables CSS o utilidades del tema para que las etiquetas conserven estilo corporativo.
  • Sombra y contraste: asegúrate de contraste suficiente (WCAG) entre fondo y texto de la etiqueta.
  • Animaciones sutiles: usa transform/opacity para animar entradas cuando aparecen, evitando animaciones que distraigan.
  • Evita cubrir información importante: coloca la etiqueta donde no tape títulos o botones de acción.
  • Crear varias tallas: define modificadores (.post-card--sm, .post-card--lg) si tu layout usa varias card sizes.

Ejemplo completo — HTML (template), PHP y CSS combinados

Ejemplo final simplificado para una tarjeta: en tu loop de tema puedes usar algo así:

lt?php
/ Dentro del loop: /
post_id = get_the_ID()
is_premium = get_post_meta( post_id, is_premium, true )
label_class = is_premium ? es-premium : es-gratis
label_text  = is_premium ? Premium : Gratis
?gt

ltarticle class=post-card  data-label=gt
  lta class=post-card__thumb href=lt?php the_permalink() ?gtgtlt?php the_post_thumbnail(medium) ?gtlt/agt
  lth3 class=post-card__titlegtlta href=lt?php the_permalink() ?gtgtlt?php the_title() ?gtlt/agtlt/h3gt
  ltspan class=screen-reader-textgtlt?php echo esc_html(label_text) ?gtlt/spangt
lt/articlegt
/ CSS mínimo para hacer visible la etiqueta /
.post-card { position: relative padding: 12px background: #fff border-radius: 6px }

/ Cinta o rectángulo: elige tu preferido. Este ejemplo: rectángulo /
.post-card::before {
  content: attr(data-label)
  position: absolute
  top: 10px
  right: 10px
  padding: 4px 8px
  font-size: 12px
  font-weight: 700
  border-radius: 4px
  color: #fff
  z-index: 6
}

.post-card.es-premium::before { background: #c0392b }
.post-card.es-gratis::before  { background: #27ae60 color: #022 }

Pruebas y depuración

  1. Comprueba en el inspector de navegador que la clase o data-attribute se ha añadido correctamente al contenedor.
  2. Verifica contraste de color y legibilidad con herramientas como las DevTools o servicios de contraste.
  3. Prueba en diferentes tamaños de pantalla y en modo RTL si corresponde.
  4. Si usas caché, purga para ver cambios en CSS/PHP.

Consideraciones finales y buenas prácticas

  • Prefiere añadir una clase o atributo desde PHP en lugar de inyectar etiquetas extra. Los pseudo-elementos funcionan mejor con menos marcado.
  • Mantén la separación de responsabilidades: la lógica (PHP) decide si es “Premium” o “Gratis” el CSS decide cómo se pinta.
  • Usa variables CSS (--color-premium, --color-gratis) si tu tema lo soporta, así facilitas mantenimiento y theming.
  • Documenta en tu tema o child-theme los meta keys o categorías que definen el estado para que otros desarrolladores lo entiendan.

Variables CSS de ejemplo (para mantenimiento)

:root {
  --label-premium-bg: linear-gradient(135deg,#ff7a18,#ff4e50)
  --label-gratis-bg: linear-gradient(135deg,#28c76f,#2ecc71)
  --label-color-dark: #022
  --label-color-light: #fff
}

.post-card.es-premium::before { background: var(--label-premium-bg) color: var(--label-color-light) }
.post-card.es-gratis::before  { background: var(--label-gratis-bg) color: var(--label-color-dark) }

Con esta base puedes crear etiquetas visuales consistentes y accesibles para “Gratis” y “Premium”, tanto en entradas como en listados de productos. Ajusta posiciones, tamaños y tonos según el diseño de tu tema. Implementando la clase o data-attribute desde PHP lograrás una solución limpia y escalable.



Leave a Reply

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