• Saltar a la navegación principal
  • Saltar al contenido principal
  • Saltar a la barra lateral principal

DecodeCMS

Tu WordPress a otro Nivel ...

  • Acerca de
  • Contacto
  • Inicio
  • Tutoriales
    • Themes
    • Plugins
    • Core
    • Recursos
  • Cursos
  • Acceder
    • Mis cursos
    • Mi Cuenta
    • Acceder
Inicio / Tutoriales / Plugins / Restringir productos por país en WooCommerce a través de código

Restringir productos por país en WooCommerce a través de código

[ 20 septiembre 2022 ] [ Autor: Jhon Marreros Guzmán ][ Plugins - Avanzado] [ ]

funcionalidad woocommerce

Suscríbete a DecodeCMS:  

En un artículo anterior habíamos visto cómo habilitar la Geolocalización en WooCommerce, esta funcionalidad también nos servirá para comprobar si un producto puede mostrarse o no a través de código.

 

Resultado Final

Al final obtendremos algo similar a la siguiente imagen en el detalle de producto, en donde se ha ocultado el botón de añadir al carrito y se muestra un mensaje de restricción por país.

Mensaje detalle de producto, restricción por país

 

Código de funciones generales

Las siguientes funciones permiten establecer los códigos de productos por país y la detección del país actual del usuario que visita el sitio. Hay que tener en cuenta que se tiene que tener activa la Geolocalización de WooCommerce.

function get_countries_products() {
    return [
        'PE' => [24,25],
        'US' => [25]
    ];    
}

function get_current_country(){
    $location = [];
    if ( class_exists( 'WC_Geolocation' ) ){
        $location = WC_Geolocation::geolocate_ip();    
    }
    return $location['country'] ?? false;
}


function get_country_products(){
    $id_products = get_countries_products();
    return $id_products[get_current_country()] ?? false;
}
  • En la función get_countries_products() guardaremos un array asociativo con el código internacional del país y los IDs de los productos
  • La función get_current_country() obtiene el país actual desde donde se conecta el usuario, usamos la funcionalidad de Geolocalización de WooCommerce para esto
  • La función get_country_products() obtiene los productos para el país actual

 

Mensaje restricción por país en la página de producto

Mostraremos un mensaje si el producto no esta disponible para un país específico con el siguiente código:

add_action('woocommerce_before_add_to_cart_form', 'dcms_show_message_restrict_country');
function dcms_show_message_restrict_country(){
    global $product;

    if ( is_product() ) {
        $current_product = $product->get_id();
        $id_products = get_country_products();
        
        if ( $id_products && ! in_array($current_product, $id_products) ){
            echo "<div class='msg-restrict-country'>Este producto no esta disponible en tu país</div>";
        }
    }    
}
  • Para mostrar un mensaje en el detalle de producto usamos el hook woocommerce_before_add_to_cart_form que hace referencia a la función dcms_show_message_restrict_country()
  • Dentro de la función comprobamos si estamos en la página de producto y usando las funciones anteriores mostramos o no un mensaje

 
También usaremos el siguiente código CSS para darle un diseño al mensaje y ocultar el botón de añadir al carrito.

.msg-restrict-country{
    background-color:coral;
    color:white;
    text-transform: uppercase;
    padding:5px;
    text-align: center;
    margin:20px auto;
}
  
.msg-restrict-country + form.cart{
    display: none;
}

 

Sólo mostrar los productos asignados por país

Si te interesa mostrar sólo los productos asignados en la función get_current_country(), puedes evaluar el siguiente código que modifica la lista de productos.

add_action('woocommerce_product_query', 'dcms_modify_query_products');
function dcms_modify_query_products($query) {
    $id_products = get_country_products();

    if ( $id_products  ){
        $query->set( 'post__in', $id_products );
    }
}
  • Usamos el hook woocommerce_product_query, que hace referencia a la función dcms_modify_query_products()
  • Dentro de la función obtenemos los Ids de los productos asignados para el país actual
  • Si existen asignaciones entonces restringimos la consulta

 

Haciendo negaciones al código

En lugar de que los productos asignados en la función get_countries_products() sean los productos permitidos, podemos hacer que sean los productos restringidos.

Para el detalle de producto, lo haremos cambiando la negación en la condición de la función in_array():

add_action('woocommerce_before_add_to_cart_form', 'dcms_show_message_restrict_country');
function dcms_show_message_restrict_country(){
    global $product;

    if ( is_product() ) {
        $current_product = $product->get_id();
        $id_products = get_country_products();
        
        if ( $id_products && in_array($current_product, $id_products) ){
            echo "<div class='msg-restrict-country'>Este producto no esta disponible en tu país</div>";
        }
    }    
}

 
Para el listado de productos cambiamos ‘post__in’, por ‘post__not_in’, es decir el código quedaría:

add_action('woocommerce_product_query', 'dcms_modify_query_products');
function dcms_modify_query_products($query) {
    $id_products = get_country_products();

    if ( $id_products  ){
        $query->set( 'post__not_in', $id_products );
    }
}

 

Conclusión

Como has podido comprobar, es posible restringir los productos por país directamente a través de código y usando la funcionalidad de Geolocalización de WooCommerce.

 

¿Me ayudas a llegar a más gente?

Twittear Compartir LinkedIn WhatsApp

Artículos Relacionados

  • Geolocalización en WooCommerce con MaxMindGeolocalización en WooCommerce con MaxMind
  • Cambiar la caja de cantidad a una lista desplegable en WooCommerceCambiar la caja de cantidad a una lista desplegable en WooCommerce
  • Botones para el campo de cantidad en WooCommerceBotones para el campo de cantidad en WooCommerce
  • Etiqueta de Agotado en lista de productos WooCommerce sin pluginsEtiqueta de Agotado en lista de productos WooCommerce sin plugins
Valora este artículo : 1 barra2 barras3 barras4 barras5 barras (1 votos, promedio: 5,00 de 5)
Cargando...

Interacciones con los lectores

Comentarios

  1. InfoAbierta

    29 mayo, 2023

    Hola, buenas.
    Muy interesante…
    Estoy buscando algo como esto para implementarlo en mi Woocommerce, pero necesitaría que el propio cliente sea quien seleccione una localización desde un formulario o selector de provincias/localidad muy sencillo en forma de popup o así. Lo que me interesa es que este usuario después de indicar la localidad pueda navegar la tienda (y toda la web, de ser posible) y solo encuentre los productos que estén disponibles (según categorías, atributos, etiquetas o taxonomías personalizadas) en la localidad que previamente ha seleccionado, ocultando el resto de productos en la tienda…
    Por fa, sería posible hacer algo así sin que necesariamente esté supeditado a la geolocalización automática de woocommerce y WP?
    Muchas gracias
    Saludos

  2. Raul

    10 febrero, 2024

    Hola,

    Gracias por este , pero me da el siguiente error:

    Snippet automatically deactivated due to an error on line 3:
    Syntax error, unexpected ‘>’.

    Estoy utilizando codesnnipet como plugin para insertar código

    ¿Que puedo hacer?

    • Jhon Marreros Guzmán

      10 febrero, 2024

      Hola, tienes un error de sintaxis, revisa bien el código que has copiado, especialmente la parte de HTML.

  3. Marta

    4 abril, 2024

    Hola Jhon,
    Muchas gracias por compartir siempre tus conocimientos.
    En este tema tengo una duda. Quiero restringir unos productos que no podemos vender en Portugal. En España todo lo que tenemos en la web es vendible. Así que entiendo que en el Código de funciones generales sólo debo especificar PT (en el caso de Portugal) y no hace falta especificar nada para España ¿no? Quedando el inicio así:

    function get_countries_products() {
    return [
    ‘PT’ => [24,25],
    ];
    }

    ¿Es correcto?
    Gracias!
    Marta

    • Jhon Marreros Guzmán

      11 abril, 2024

      Hola, en tu caso la condición es al contrario para Portugal, por lo que tendrias que cambiar este codigo, como ves he quitado la negación ! de in_array

      if ( $id_products && in_array($current_product, $id_products) ){
      
  4. Alex

    7 febrero, 2025

    Hola y si quiereo restringir esto por ciudad como seria estoy en colombia y hay productos de que necesitan cadena de frio pero hay cuidades donde no se puede llevar y se debe restringir

    • Jhon Marreros Guzmán

      22 febrero, 2025

      En el checkout, podrías considerar que no hay método de envío para determinadas ciudades por producto, evaluaré hacer un artículo sobre eso.

Para escribir código envolver con: <pre class="language-xxx"><code> </code></pre> ,reemplaza las xxx (php, css, html)

*

* Gravatar habilitado

Barra lateral principal

Curso Decodifica WordPress

Únete a DecodeCMS

Recibirás como regalo:

Guia práctica con video:
¿Quieres agregar código a WordPress? Revisa las diferentes opciones que tienes.Ver más

Omnisend
Alojamiento Wordpress

Niveles

Básico Intermedio Avanzado

Etiquetas

accesibilidad css dashboard editor error funcionalidad herramientas imagen js librería mejoras optimización seguridad SEO social woocommerce

Populares

Crear entradas con la REST API de WordPress desde un sitio web remoto

Ajax en WordPress de manera correcta

Comprar productos de la misma categoría en WooCommerce

Subir archivos grandes a WordPress

© logo decode pie
Política de Privacidad | Política de devoluciones
Copyrigth 2026 Todos los derechos reservados