Ticker

6/recent/ticker-posts

Ad Code

Responsive Advertisement

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

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.

 
¿Aún con dudas?, en el siguiente video se detallan los puntos anteriores.

Suscríbete a DecodeCMS:  

 

La entrada Restringir productos por país en WooCommerce a través de código es un artículo reciente del sitio DecodeCMS.

Enregistrer un commentaire

0 Commentaires