Personalizaciones Avanzadas en Shopify Online Store 2.0 Usando Solo Liquid

Descubre cómo implementar personalizaciones avanzadas en Shopify Online Store 2.0 usando solo Liquid. Aprende a mostrar contenido según el cliente, usar snippets reutilizables, metacampos (metafields) y plantillas de producto personalizadas, todo sin apps externas ni Shopify Plus.
Personalizaciones Avanzadas en Shopify Online Store 2.0 Usando Solo Liquid
Contenido del Artículo
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading
TOC Heading

Condicionales con etiquetas de cliente ( customer.tags )

Una forma potente de personalizar una tienda Shopify es mostrar u ocultar contenido según el tipo de cliente. Shopify permite asignar etiquetas a cada cliente (por ejemplo, VIP, mayorista, distribuidor, etc.) desde el panel de administración. Con Liquid, podemos usar estas etiquetas mediante customer.tags para condicionar qué contenido ve cada usuario.

Por ejemplo, supongamos que quieres mostrar un mensaje o sección especial solo a clientes con la etiqueta "mayorista". Podemos lograrlo con una simple condición en Liquid:

{% if customer and customer.tags contains 'mayorista' %}
  <!-- Contenido visible solo para clientes etiquetados como "mayorista" -->
  <div class="mensaje-mayorista">
    <p>Bienvenido, cliente mayorista. Aquí tienes acceso a ofertas exclusivas.</p>
  </div>
{% endif %}

En este fragmento de código, el bloque <div> con el mensaje de bienvenida solo se renderiza si el objeto customer existe (es decir, si alguien ha iniciado sesión) y si entre las etiquetas de ese cliente ( customer.tags) se encuentra 'mayorista'. Para clientes sin esa etiqueta o visitantes no autenticados, este bloque no aparece en absoluto.

Cómo funciona: customer.tags devuelve una cadena con todas las etiquetas asignadas al cliente. Usando Liquid, comprobamos con contains si esa cadena incluye la etiqueta deseada. Es recomendable incluir la verificación customer al inicio de la condición para evitar evaluar etiquetas cuando no hay ningún usuario autenticado.

Caso de uso: Las condicionales por etiquetas permiten crear experiencias personalizadas. Por ejemplo, puedes etiquetar ciertos clientes como "VIP" y mostrarles un banner de agradecimiento especial o acceso anticipado a productos. O etiquetar clientes como "distribuidor" para mostrarles información de precios al por mayor que el público general no debería ver. Todo esto sin necesidad de apps adicionales: el tema Liquid controla la lógica de presentación de contenido según las etiquetas de cliente.

Mostrar precios solo a clientes registrados (logueados)

Otro escenario común de personalización es restringir información sensible solo a clientes registrados. Un ejemplo típico en tiendas B2B es ocultar los precios de los productos a usuarios anónimos, mostrando los precios únicamente cuando el cliente ha iniciado sesión. Con Liquid podemos lograr esto fácilmente comprobando si existe un objeto customer (lo que indica que hay sesión iniciada).

Imaginemos que queremos que los visitantes sin cuenta no vean el precio de un producto, sino un mensaje invitándolos a registrarse o iniciar sesión. Podríamos modificar la plantilla de producto o el snippet que muestra el precio así:

{% if customer %}
  <!-- Mostrar el precio solo a clientes con sesión iniciada -->
  <span class="producto-precio">{{ product.price | money }}</span>
{% else %}
  <!-- Mensaje para visitantes no registrados -->
  <span class="login-aviso">Inicia sesión para ver el precio</span>
{% endif %}

En este código, usamos {% if customer %} para verificar si hay un cliente autenticado. Si es así, dentro del <span> mostramos el precio del producto usando la variable product.price formateada con el filtro money. Si no hay cliente (es decir, customer es nil), entramos en el {% else %} y en lugar del precio mostramos un mensaje de aviso.

Dónde implementarlo: Puedes envolver la sección de precio en esta condicional dentro de la plantilla de producto ( product.liquid en un tema Vintage o la sección principal de producto en Online Store 2.0) o incluso en la plantilla de la cuadrícula de productos para colecciones. De este modo, en toda la tienda los precios solo serán visibles para usuarios registrados.

Personalización adicional: Este mismo patrón if customer/else se puede usar para cualquier elemento que quieras mostrar únicamente a usuarios logueados. Por ejemplo, un botón de "Añadir al carrito" que solo aparezca tras iniciar sesión, o un bloque de contenido premium visible tras autenticarte. Con Liquid, tienes control total sobre qué ven o no ven los visitantes anónimos versus los clientes con cuenta.

Creación de snippets reutilizables para contenido avanzado

Los snippets en Shopify son fragmentos de código Liquid reutilizables que podemos insertar en distintas plantillas. Son ideales para bloques de información complejos o repetitivos, ya que evitan duplicar código y facilitan el mantenimiento. En lugar de copiar y pegar el mismo HTML/Liquid en múltiples archivos de plantilla, creamos un snippet y luego lo incluimos donde sea necesario. Esto también ayuda a mantener el código organizado en una tienda Shopify personalizada.

Cómo crear un snippet:

1. Definir el snippet: En el editor de código de tu tema, crea un nuevo archivo en la carpeta Snippets. Por ejemplo, podríamos crear promobar.liquid para un banner promocional reutilizable.

2. Agregar contenido al snippet: Escribe el código Liquid/HTML que conformará ese bloque. Por ejemplo, nuestro snippet promobar.liquid podría contener un mensaje de envío gratuito:

<!-- snippets/promobar.liquid -->
<div class="promo-banner">
  <p>⭐ Envío gratuito en pedidos superiores a 100 € ⭐</p>
</div>

Este snippet genera un simple banner destacando una promoción.

3. Incluir el snippet en plantillas: Donde quieras que aparezca este bloque, usa la etiqueta Liquid {% render 'promobar' %} para renderizar el snippet. Por ejemplo, podrías insertarlo en la plantilla de producto justo debajo del título, y también en la página de inicio. Cada vez que uses {% render %}, el contenido del snippet se inserta allí.

Una vez configurado, si necesitas actualizar el mensaje promocional, solo tienes que editar promobar.liquid una vez, y el cambio se reflejará en todos los lugares donde esté incluido. Esto es especialmente útil para bloques de información avanzada que podrían aparecer en varias páginas: políticas especiales, advertencias de producto, tablas de medidas, beneficios de un programa de fidelidad, etc.

Ejemplo práctico: Supongamos que deseas destacar en cada página de producto si ese producto tiene envío gratuito o alguna garantía especial. En lugar de escribir ese HTML en cada plantilla, puedes crear un snippet info-garantia.liquid con el contenido estructurado (iconos, texto de garantía, etc.) y luego incluirlo con {% render 'info-garantia' %} en la sección de descripción de producto. Así, cualquier ajuste en la presentación de la garantía se hace en un solo lugar.

Consejo: En Shopify Online Store 2.0, la etiqueta recomendada para estos fragmentos es {% render 'snippet-name' %} en lugar de {% include %} (que se usaba en versiones antiguas). render crea un ámbito propio de variables y evita efectos secundarios, lo que lo hace más seguro y predecible. Aprovecha los snippets para mantener tu código limpio y DRY (Don't Repeat Yourself).

Mostrar contenido según tipo de producto, colección o proveedor

Otra estrategia de personalización avanzada es condicionar el contenido en base a las propiedades del producto o la colección que se está visualizando. Shopify Liquid expone muchos atributos útiles, como el tipo de producto product.type, el proveedor o marca product.vendor, las colecciones a las que pertenece un producto product.collections, o en una página de colección, el identificador de esa colección collection.handle, entre otros. Con simples condicionales podemos aprovechar estos datos para mostrar información relevante en contexto.

Por tipo de producto: Imagina que tienes distintos tipos de productos y quieres mostrar un bloque específico para uno de esos tipos. Por ejemplo, supongamos que vendes ropa y accesorios, pero solo quieres mostrar una guía de tallas en las páginas de productos cuyo tipo sea "Zapatos". Puedes hacerlo así dentro de la plantilla de producto:

{% if product.type == 'Zapatos' %}
  <!-- Contenido especial para productos de tipo "Zapatos" -->
  <div class="guia-tallas">
    <h4>Guía de Tallas</h4>
    <p>Consulta nuestra guía de tallas para encontrar tu medida perfecta antes de comprar tus zapatos.</p>
    <a href="/pages/guia-de-tallas" class="btn btn-secundario">Ver guía de tallas</a>
  </div>
{% endif %}

En este ejemplo, verificamos product.type. Si el tipo coincide exactamente con la cadena "Zapatos", se muestra un cuadro con una guía de tallas. Para productos de otros tipos, ese bloque no se mostrará. Esto permite adaptar la información en la página según la categoría de producto, ofreciendo detalles relevantes solo donde aplican.

Por proveedor (vendor): Similar al caso anterior, puede que quieras personalizar contenido según la marca o proveedor del producto. Supongamos que la marca Nike ofrece una garantía extendida, y quieres resaltarlo en la página de cualquier producto cuyo product.vendor sea "Nike". Podrías añadir:

{% if product.vendor == 'Nike' %}
  <!-- Contenido especial para productos de la marca Nike -->
  <div class="nota-vendor">
    <p><strong>Información:</strong> Este producto {{ product.vendor }} incluye 2 años de garantía oficial.</p>
  </div>
{% endif %}

Aquí comprobamos la propiedad product.vendor. Si el proveedor del producto es exactamente "Nike", se inyecta una nota informativa sobre la garantía. Para otras marcas, el snippet no aparece. Puedes aplicar esto a cualquier vendor que necesites: por ejemplo, mostrar un logo especial, un mensaje de "Producto oficial de [Marca]", o instrucciones específicas del fabricante.

Por colección: También podemos condicionar el contenido en las páginas de colección en sí, utilizando la variable collection. Por ejemplo, supongamos que tienes una colección de ofertas cuyo handle (identificador) es "ofertas". Podrías querer mostrar un banner especial solo en esa colección:

{% if template.name == 'collection' and collection.handle == 'ofertas' %}
  <!-- Banner especial para la colección de Ofertas -->
  <div class="coleccion-ofertas-banner">
    <h2>¡Ofertas Especiales!</h2>
    <p>Aprovecha descuentos únicos en esta sección de rebajas.</p>
  </div>
{% endif %}

En este fragmento, utilizamos collection.handle para verificar que la colección actual es "ofertas". También incluimos template.name == 'collection' para asegurarnos de que este código solo se evalúe en la plantilla de colección (y evitar conflictos si, por ejemplo, en la página de producto existe alguna variable de colección en contexto). El resultado es que solo en la URL de esa colección de ofertas se mostrará el banner promocional destacado.

Combinar condiciones: Puedes ser creativo y combinar múltiples condiciones según tus necesidades. Por ejemplo, usar elsif para establecer prioridades: primero checar tipo de producto, luego vendor, etc. Sin embargo, muchas veces es más claro mantener condiciones separadas para cada caso, como en los ejemplos anteriores, para facilitar la lectura y mantenimiento del código.

Con estas técnicas, tu tienda puede mostrar información contextual muy específica: mensajes de categoría, promos por marca, instrucciones especiales según el producto, todo de forma automática. Esto mejora la experiencia del usuario porque ve información relevante sin que tú tengas que actualizar manualmente cada página.

Uso de metacampos (metafields) para contenido personalizado

Los metacampos (metafields) permiten almacenar datos personalizados para distintos recursos de Shopify (productos, variantes, colecciones, clientes, etc.) más allá de los campos estándar. En Shopify Online Store 2.0, los metacampos se han vuelto muy accesibles: puedes definirlos fácilmente desde el administrador (en Configuración > Datos personalizados) y luego asignarlos a productos o colecciones individuales. En el tema Liquid, podemos leer esos metacampos para mostrar contenido único en cada producto o sección, sin tener que hardcodear información en la plantilla.

¿Para qué usar metacampos? Imagina que quieres mostrar en la página de cada producto un dato extra que no existe por defecto en Shopify, como por ejemplo: instrucciones de cuidado, un video de instalación, ingredientes, un texto de marketing especial, etc. Con metacampos, puedes añadir ese campo adicional al producto en el admin, rellenarlo con el contenido correspondiente, y luego en la plantilla Liquid recuperarlo dinámicamente.

Ejemplo: Supongamos que deseas agregar un bloque de "Información adicional" en la página de producto, donde el contenido de ese bloque varía según el producto. Primero, crearías un metacampo para productos, por ejemplo con namespace custom y clave info_adicional (podría ser un campo de texto largo donde ingresas información HTML o texto enriquecido para cada producto). Luego, en la plantilla de producto (o sección correspondiente) incorporas algo como lo siguiente:

{% if product.metafields.custom.info_adicional != blank %}
  <!-- Bloque de información adicional personalizado por producto -->
  <div class="info-adicional-producto">
    <h4>Información adicional</h4>
    {{ product.metafields.custom.info_adicional }}
  </div>
{% endif %}

Aquí usamos product.metafields.custom.info_adicional para acceder al metacampo. La condición != blank verifica que el metacampo tenga algún valor definido para ese producto (es decir, que no esté vacío). Si tiene contenido, el tema renderiza un <div> con un título "Información adicional" y luego inserta el valor del metacampo mediante {{ }}. Así, cada producto puede mostrar un texto diferente en ese espacio, según lo que se haya guardado en su metacampo en el administrador.

Detalles técnicos: Los metacampos pueden ser de distintos tipos (texto, número, URL, archivo, referencia, etc.). En el ejemplo asumimos un texto enriquecido que se mostrará tal cual. Si fuera un metacampo de tipo imagen o archivo, podrías acceder a propiedades como product.metafields.custom.manual.url (si hubieras guardado, por ejemplo, un PDF de manual de usuario). La interfaz de Shopify 2.0 incluso permite enlazar estos metacampos a secciones sin tocar código, pero al usarlos directamente en Liquid tienes total control sobre la presentación.

Aplicaciones prácticas: Este método abre un mundo de posibilidades: mostrar un bloque de recetas en productos alimenticios, tablas de tallas específicas por producto, videos incrustados únicos por producto, mensajes promocionales diferentes en ciertas colecciones, etc. Todo almacenado en metacampos para que el equipo de contenido pueda actualizarlo fácilmente desde el admin, mientras el código Liquid simplemente lo renderiza si está disponible. La tienda resulta altamente personalizada, pero sigue siendo fácil de gestionar.

Personalización de páginas de producto con plantillas alternativas ( template.suffix )

Shopify Online Store 2.0 introdujo la capacidad de crear múltiples plantillas para un mismo tipo de página de forma nativa, lo que resulta muy útil para personalizar páginas de producto a distintos formatos. Por ejemplo, podrías tener una plantilla estándar para la mayoría de productos y otra plantilla diferente para productos de tipo "solo para distribuidores" o para una colección específica. Estas plantillas alternativas se identifican por un sufijo en su nombre de archivo, y Shopify te permite asignarlas a productos individuales desde el editor de administrador (en la sección Plantilla al editar un producto).

En Liquid, podemos identificar qué plantilla está siendo usada mediante el objeto template. En particular, template.suffix nos da el nombre del sufijo de la plantilla actual, si es que hay uno (si estás en la plantilla por defecto, el sufijo estará vacío o nil). Esto nos permite escribir código dentro de secciones o snippets que solo se ejecute para ciertas plantillas.

Ejemplo de uso: Supongamos que has creado una plantilla alternativa de producto llamada "producto.mayorista" (en términos de archivos, sería product.mayorista.json en la carpeta Templates de tu tema, asociada quizás a una sección principal de producto específica). Has asignado esta plantilla a algunos productos destinados a venta mayorista. Dentro de la sección de producto (por ejemplo, en main-product.liquid o similar en la carpeta Sections), puedes aprovechar template.suffix para introducir variaciones:

{% if template.suffix == 'mayorista' %}
  <!-- Contenido extra para la plantilla de producto "mayorista" -->
  <div class="alerta-mayorista">
    <p>Este producto es visible solo para distribuidores autorizados y requiere un pedido mínimo para su compra.</p>
  </div>
{% endif %}

En este fragmento, estamos comprobando si el sufijo de la plantilla actual es "mayorista". Si es así, se muestra un bloque de alerta específico para esos productos especiales (quizás indicando alguna condición de venta al por mayor, como en el ejemplo). Si la página de producto se está renderizando con la plantilla estándar, template.suffix estará vacío o diferente, y por tanto ese bloque no se incluirá.

Cómo crear y asignar plantillas alternas: Para dar un poco más de contexto, crear una plantilla alternativa en Online Store 2.0 es tan sencillo como duplicar una plantilla existente. En la carpeta Templates puedes crear, por ejemplo, product.mayorista.json que cargue las secciones que desees. Luego, en el admin de Shopify, al editar un producto, puedes seleccionar "producto.mayorista" como plantilla. Automáticamente, ese producto usará la nueva disposición. Con la comprobación de template.suffix dentro de las secciones, pudiste agregar comportamientos especiales sin tener que crear secciones totalmente nuevas para cada caso, manteniendo el código más centralizado.

Ventaja: Esta técnica permite controlar variaciones de diseño o contenido de forma escalable. Si mañana necesitas otra plantilla para, digamos, "producto-digital" (productos digitales con diferente info), puedes crear product.digital.json, asignarla a ciertos productos, y en el código usar {% if template.suffix == 'digital' %} ... {% endif %} para manejar diferencias. Todo sin apps ni trucos externos, simplemente aprovechando la flexibilidad nativa de Liquid y Online Store 2.0.

Ejemplo práctico: bloque solo para distribuidores

Para integrar varias de las ideas anteriores, veamos un ejemplo completo: implementar un bloque de contenido que sea exclusivo para distribuidores. Imagina que en tu tienda deseas ofrecer a tus distribuidores (mayoristas) cierta información privilegiada, como un enlace a un listado de precios al por mayor, instrucciones especiales de venta, o recursos de marketing, que no quieres mostrar al resto de clientes. Suponiendo que a los clientes distribuidores los tienes identificados con una etiqueta, por ejemplo "distribuidor", podemos crear un bloque condicional para ellos.

Este código podría incluirse en la plantilla de producto, en la página de inicio o en una sección personalizada de tu tema, según dónde necesites mostrarlo. A modo de ejemplo, lo agregaremos quizás en la sección de descripción de producto:

{% if customer and customer.tags contains 'distribuidor' %}
  <!-- Bloque visible solo para clientes distribuidores -->
  <div class="distributor-block">
    <h3>Zona exclusiva para distribuidores</h3>
    <p>Aquí puedes descargar la lista de precios al por mayor y acceder a materiales promocionales exclusivos.</p>
    <a href="/files/lista-precios-mayoristas.pdf" class="btn btn-primario" target="_blank">Descargar lista de precios</a>
  </div>
{% endif %}

Qué hace este código: Verifica primero que haya un customer logueado y que este tenga la etiqueta 'distribuidor' entre sus tags. Solo en ese caso renderiza el bloque <div class="distributor-block"> con un título, un texto descriptivo y un enlace de descarga. Puedes personalizar el contenido: en el ejemplo asumimos un PDF con la lista de precios mayoristas, pero podría ser un enlace a una página oculta, un formulario especial, imágenes de marketing, etc.

Para el resto de usuarios: Los clientes normales o visitantes anónimos no verán nada de lo anterior. El bloque permanece oculto para ellos, ya que la condición Liquid no se cumple. Esto garantiza que información sensible para distribuidores no sea accesible públicamente. Incluso si alguien inspecciona el código fuente de la página sin estar autenticado como distribuidor, no encontrará este bloque en el HTML entregado.

Mejorando la gestión: Puedes llevar esta idea un paso más allá combinándola con las plantillas alternativas. Por ejemplo, podrías crear un snippet llamado bloque-distribuidor.liquid con ese contenido, e incluirlo solo en la plantilla de producto asignada a distribuidores (usando {% render 'bloque-distribuidor' %} dentro de un {% if template.suffix == 'mayorista' %}, por ejemplo). Así mantienes el código de distribuidores aislado. Pero incluso sin usar una plantilla separada, la condición con customer.tags es suficiente para filtrar la audiencia.

Este ejemplo práctico demuestra cómo podemos unir etiquetas de cliente, lógica condicional y contenido HTMLpara crear funcionalidades típicas de portales B2B directamente en Liquid. El resultado: una tienda Shopify 2.0 con áreas de contenido completamente personalizadas para distintos segmentos de clientes, todo logrado con código en el tema y sin instalar aplicaciones adicionales.

Conclusión

Shopify Online Store 2.0, combinado con la flexibilidad de Liquid, nos brinda un amplio abanico de posibilidades para crear una tienda Shopify personalizada al máximo, sin depender de apps de terceros ni funciones exclusivas de planes superiores. A lo largo de este artículo hemos visto cómo, mediante condicionales inteligentes y el aprovechamiento de datos disponibles (etiquetas de cliente, propiedades de producto/colección, metacampos y plantillas personalizadas), es posible implementar características avanzadas directamente en el tema de la tienda.

Al utilizar solo código Liquid, mantenemos un control total sobre la presentación y lógica de negocio en el frontend de la tienda. Esto suele traducirse en un mejor rendimiento (menos dependencias externas) y en la capacidad de ajustar hasta el más mínimo detalle del diseño y la experiencia de usuario. Desde mostrar precios únicamente a usuarios registrados, hasta crear secciones exclusivas para ciertos clientes o productos, las opciones de personalización son prácticamente ilimitadas.

Por supuesto, lograr estas personalizaciones avanzadas requiere conocimientos técnicos de Liquid y del funcionamiento de los temas Shopify. Siempre es recomendable trabajar en un tema de prueba o copia de seguridad antes de aplicar cambios a tu tienda en producción. Una vez implementadas correctamente, estas mejoras harán que tu tienda destaque con una experiencia única y adaptada a tus necesidades.

En resumen, Shopify permite, con Liquid y Online Store 2.0, alcanzar un nivel de personalización equivalente a un "diseño Shopify a medida", manteniendo la facilidad de gestión de la plataforma. Esperamos que estos ejemplos te hayan inspirado a aprovechar al máximo el potencial de Liquid. Si buscas llevar aún más lejos la personalización de tu tienda o necesitas ayuda técnica, no dudes en contar con expertos para hacerlo realidad.

¿Necesitas ayuda con tu tienda Shopify?

En BESAP somos expertos en desarrollo de tiendas Shopify a medida en España. Si quieres implementar personalizaciones avanzadas como las de este artículo, sin recurrir a apps externas, nuestro equipo puede ayudarte. Contáctanos y te asesoraremos para llevar tu tienda Shopify al siguiente nivel con soluciones personalizadas y eficientes.

Articulos relacionados