phpwordpresswoocommerceproductip-geolocation

Change add to cart button based on IP-adress (GeoLocation) in Woocommerce


I have a question about a WooCommerce shop I am currently working on. The shop only contains only two languages, Dutch and English.

Is it possible when somebody from Poland visits the English version of the webshop and then navigates to the WooCommerce Products page it does not show the "Add to Cart" option but displays a different button with another link based on IP-adres (Geo-Location)?

EDIT

Ok, I managed to get it to work but not with your example:

    // Wijzigingen Links en teksten knoppen toevoegen
function custom_product_button(){
    // GEOLocatie aanroepen en verschillende distrubiteurs toevoegen
    $geoip = geoip_detect2_get_info_from_current_ip();
    $country = $geoip->raw[ 'country' ][ 'iso_code' ];
    $button_text = __( "To distributor's website", "woocommerce" );
    $button_usa = 'https://google.com';
    $button_singapore = 'https://www.google.com.sg';

    // Tonen van buttons met verschillende linkjes
    ?>
    <form class="cart">
    <input type="submit" value="<?php echo $button_text; ?>" onClick="window.open('<?php if ( 'US' === $country )  {echo $button_usa;}if ( 'SG' === $country )  {echo $button_singapore;}?>');"class="single_add_to_cart_button button alt">
    </form>
    <?php
}

// Vervangen van de button op single product pagina
add_action( 'woocommerce_single_product_summary', 'replace_single_add_to_cart_button', 1 );
function replace_single_add_to_cart_button() {
    global $product;
      $geoip = geoip_detect2_get_info_from_current_ip();
      $country = $geoip->raw[ 'country' ][ 'iso_code' ];
      if ( 'US' === $country || 'SG' === $country)
      {
            remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
            add_action( 'woocommerce_single_product_summary', 'custom_product_button', 30 );
      }
}

// Vervangen van de button op loop pagina en categorie / archief pagina
add_filter( 'woocommerce_loop_add_to_cart_link', 'replace_loop_add_to_cart_button', 10, 2 );
function replace_loop_add_to_cart_button( $button, $product  ) {
      $geoip = geoip_detect2_get_info_from_current_ip();
      $country = $geoip->raw[ 'country' ][ 'iso_code' ];
      if ( 'US' === $country || 'SG' === $country)  {
        $button_text = __( "View product", "woocommerce" );
        $button = '<a class="button" href="' . $product->get_permalink() . '">' . $button_text . '</a>';
    }

    return $button;
}

Maybe not the best coded piece but it is working in combination with the Plug-in GeoIP Detection.

Your coding looks much better but doen't seem te work. No errors just always the add to cart button.


Solution

  • Updated: on April 21th, 2018

    Woocommerce has a geolocation enabled tool (and WC_Geolocation related class) by default.

    The first below uses that geolocation in a custom conditional function, where you will defined the related countries that are going to enabled your demo button.
    In that function you will set all the related country codes in the array (I have defined 'US' and 'SG' just for testing purpose).

    The code:

    // Updated: check for the defined country codes based over user IP geolocation country code
    function country_geo_ip_check(){
        // ==> HERE define the countries codes in the array
        $non_allowed_countries = array('US', 'SG');
    
        // Get an instance of the WC_Geolocation object class
        $geolocation_instance = new WC_Geolocation();
        // Get user IP
        $user_ip_address = $geolocation_instance->get_ip_address();
        // Get geolocated user IP country code.
        $user_geolocation = $geolocation_instance->geolocate_ip( $user_ip_address );
    
        return in_array( $user_geolocation['country'], $non_allowed_countries ) ? false : true;
    }
    
    // Shop and other archives pages (replacing add to cart by a linked button to the product)
    add_filter( 'woocommerce_loop_add_to_cart_link', 'replace_loop_add_to_cart_button', 10, 2 );
    function replace_loop_add_to_cart_button( $button, $product  ) {
        if ( country_geo_ip_check() ) return $button;  // Exit for non defined countries
    
        if ( $product->is_type( 'variable' ) ) return $button; // Excluding variable products
    
        $button_text = __( "View product", "woocommerce" );
        $button_link = $product->get_permalink();
        return '<a class="button" href="' . $button_link . '">' . $button_text . '</a>';;
    }
    
    // Single producct pages
    add_action( 'woocommerce_single_product_summary', 'replace_single_add_to_cart_button', 1 );
    function replace_single_add_to_cart_button() {
        global $product;
    
        if ( country_geo_ip_check() ) return;  // Exit for non defined countries
    
        // For variable product types (keeping attribute select fields)
        if( $product->is_type( 'variable' ) ) {
            remove_action( 'woocommerce_single_variation', 'woocommerce_single_variation_add_to_cart_button', 20 );
            add_action( 'woocommerce_single_product_summary', 'custom_demo_button', 20 );
        }
        // For all other product types
        else {
            remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
            add_action( 'woocommerce_single_product_summary', 'custom_demo_button', 30 );
        }
    }
    
    // Your custom button replacement
    function custom_demo_button() {
        global $post, $product;
    
        $style = 'style="padding-right: 0.75em;padding-left: 0.75em;margin-left: 8px; background-color: #0ebc30;"';
        $button_text = __("View Demo", "woocommerce");
    
        // Get demo Url
        if( function_exists('get_field') )
            $url_demo = get_field( "url_demo" );
    
        if( ! isset($url_demo) ){ // If the Url is not defined
            $button_text = __("Missing URL", "woocommerce");
            $style = 'style="color: red; background-color: white; border: solid 1px red"';
            $url_demo = '#';
        }
    
        // Output
        echo '<a href="'.$url_demo.'" target="_blank" class="button demo_button"'.$style.'>'.$button_text.'</a>';
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and work.

    enter image description here