Otra de las consultas recurrentes que me llegan al buzón de correo prácticamente cada semana es sobre cómo ocultar productos en función de la ubicación del cliente, es decir, que el cliente vea unos u otros productos en la tienda en función del lugar desde el que compra.
Así que en esta entrada voy a intentar explicar cómo hacerlo mediante dos métodos, por código y usando un plugin, de forma que cada uno pueda elegir aquélla con la que se sienta más cómodo o la que mejor se adapte a su necesidad. Veamos cómo ocultar productos según el país.
Tabla de contenidos
Ocultar productos según la provincia, departamento o estado del comprador
Ya he hablado alguna vez sobre el sistema de geolocalización de WooCommerce, cómo funciona y para qué se utiliza. Puedes ver esa entrada aquí:
La base de todo el sistema es el método geolocate_ip() de la clase WC_Geolocation.
Como puedes ver en ese enlace, el método devuelve un array que incluye la información sobre country (país), state (provincia/estado/departamento), city (población) y postcode (código postal). Parece perfecto.
Sin embargo, también explique en otra entrada, que la integración de geolocalización se realiza a través de MaxMind:
Pues bien, esta base de datos geolocaliza a nivel de país. En pocas palabras, no podemos discriminar por geolocalización más allá del país.
Puntualización: Para ser precisos, algunos plugins no utilizan la geolocalización estándar de WooCommerce (la de MaxMind) sino que utilizan otras bases de datos, como las de GeoLite2 o GeoIP2, que sí permiten la geolocalización a nivel más fino que el país (incluso por ciudad).
Sin embargo, mientras que la geolocalización por país es muy eficiente y precisa, a nivel de ciudad ésta se vuelve bastante imprecisa, bajando su efectividad a valores en torno al 65% o inferiores. Es decir, que si quieres geolocalizar a nivel de ciudad estos plugins se equivocarán, de media, una de cada tres veces.
Ocultar productos por países en WooCommerce
Así que sólo podemos usar para ello la ubicación en función del país. Teniendo esto claro, las posibilidades son, como es habitual, dos: hacerlo mediante código y usando un plugin.
Ocultar productos según el país del cliente por código
Si lo que necesitas es algo sencillo (por ejemplo, ocultar uno o unos pocos productos a los usuarios de algún país determinado) y no te da miedo usar código, ésta es la solución más eficiente.
Y disponemos para ello de dos hooks de WooCommerce:
- El filtro woocommerce_product_is_visible, que decide si un producto es o no visible en el catálogo (por ejemplo, en función de su stock o de las opciones de visibilidad establecidas para el producto).
- La acción woocommerce_product_query, que se ejecuta al recuperar el listado de productos.
Usando el filtro (nuestra opción prioritaria) podemos escribir una sencilla función que nos permita hacer que el producto (o productos) que queramos no sea visible para los visitantes ubicados en un/os país/es concreto/s. Ahí va un ejemplo, que ocultaría el producto con ID 42 a los usuarios que acceden a la web desde Portugal:
add_filter ('woocommerce_product_is_visible', function ($visible, $id_producto) { $geolocalizacion = WC_Geolocation::geolocate_ip(); $pais = $gelocalizacion['country']; if ('PT' == $pais && 42 == $id_producto) { $visible = false; return $visible; }, PHP_INT_MAX, 2);
Ya ves que es un ejemplo muy sencillo, pero con un poco de PHP básico y usando algunas funciones de WordPress (como get_term) se pueden establecer limitaciones por categorías o etiquetas, si el usuario está registrado o es invitado, etcétera.
La segunda opción, la del hook de acción, es incluso más versátil, aunque hay que tener cuidado con ella, ya que actúa excluyendo productos de la query, y eso puede causar incompatibilidades con algún otro plugin si no somos cuidadosos y pasamos cosas por alto.
Como ventaja, se hace mucho más eficiente para la web, sobre todo si se trata de mayores cantidades de productos o con varias condiciones. El mismo ejemplo de antes, pero ocultando los productos con IDs 42, 422, y 4222:
add_action ('woocommerce_product_query', function ($q, $query) { if (is_admin()) //Ésta es una de las cosas con las que hay que llevar cuidado return; $geolocalizacion = WC_Geolocation::geolocate_ip(); $productos = [42, 422, 4222]; $pais = $geolocalizacion['country']; if ('PT' == $pais) $q->set('post__not_in', $productos); }, PHP_INT_MAX, 2);
Si no sabes dónde poner estos códigos, echa un vistazo a esta entrada:
Para especificar los países hay que hacerlo mediante el código ISO 3166-1 alfa-2, que es el mismo que se utiliza en la table de configuración de los impuestos de WooCommerce. Puedes encontrar los códigos ISO 3166-1 de los nombres de países en esta página de Wikipedia; el que nos interesa es el que está en la columna Código alfa-2.
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
Ocultar productos según el país del cliente usando un plugin
Si lo que buscas es un plugin gratuito, no estás de suerte. Tienes WooCommerce Geolocation Based Products, que utiliza la base de datos de GeoLite2, pero que lleva ¡4 años! sin actualizarse. Si tu tienda es un proyecto medianamente serio yo ni lo tendría en cuenta.
En cualquier caso, aquí puedes ver un vídeo que hice en su día (cuando el plugin aún se mantenía activo) por si te sirve:
Hoy por hoy, y si queremos que nuestra tienda funcione bien, la única alternativa realmente a considerar es el plugin oficial de Woo.com Country Restrictions for WooCommerce.
Lo bueno es que no hace falta más, ya que es un plugin muy completo y efectivo (por algo es el oficial) y permite no sólo ocultar productos en función del país en que esté ubicado el cliente, sino mucho más, como:
- Ocultar productos específicos o categorías completas.
- Ocultar precios o el botón añadir al carrito.
- Ocultar métodos de pago.
- Reemplazar el precio y el botón añadir al carrito por un texto o enlace personalizado.
- Mostrar un mensaje de error o redirigir al usuario a otra URL cuando intenta acceder directamente (por ejemplo, usando un enlace o un marcador) a una página restringida a su país.
- Añadir distintas restricciones para distintos países.
- Añadir restricciones producto a producto o en lotes.
En una palabra, lo que Country Restrictions for WooCommerce nos permite no es sólo ocultar productos según el país en el que está ubicado el usuario, sino crear una experiencia de compra totalmente diferente en función de su ubicación.
Stephanie dice
¿No hay algún plugin que ayude a ocultar productos y restringir la compra según el estado? Es decir que estando en México, ocultar productos para ciertos estados?