Come geo localizzare un utente tramite IP con WordPress

Per geolocalizzare un indirizzo IP in WordPress utilizzeremo il database GeoLite2 di MaxMind, che è gratuito e fornisce dati di geolocalizzazione per gli indirizzi IP.

Che poi è lo stessa libreria di geolocalizzazione che utilizza WooCommerce.

Ecco come implementare la geolocalizzazione nel tuo sito WordPress utilizzando il database GeoLite2:

  • Dovrai registrarti e creare un account gratuito per usare il servizio e scaricare il database.
  • scarica nel tuo tema e plugin la libreria php necessaria di GeoLite2 tramite composer con questo comando da terminale, assicurandoti di scaricarla nel percorso del tuo tema o plugin, corretto
composer require geoip2/geoip2:~2.0

Io per comodità ho inserito tutto nella cartella /geo/ del mio tema.

Ora dobbiamo richiamare nel nostro tema o plugin la libreria PHP appena scaricata, per farlo, dobbiamo inserire nel nostro file functions.php questo codice:

require get_template_directory() . '/dist/geo/autoload.php';

Ora ci serve una funzione per prendere i dati e l’IP dell’utente:

/**
 * Prendo l'IP dell'utente
 */
function mm_get_client_ip() {
    $ip_address = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ip_address = $_SERVER['HTTP_CLIENT_IP'];
    else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if (isset($_SERVER['HTTP_X_FORWARDED']))
        $ip_address = $_SERVER['HTTP_X_FORWARDED'];
    else if (isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ip_address = $_SERVER['HTTP_FORWARDED_FOR'];
    else if (isset($_SERVER['HTTP_FORWARDED']))
        $ip_address = $_SERVER['HTTP_FORWARDED'];
    else if (isset($_SERVER['REMOTE_ADDR']))
        $ip_address = $_SERVER['REMOTE_ADDR'];
    else
        $ip_address = 'UNKNOWN';

    return $ip_address;
}

E qua creiamo una funzione PHP che ci permetta di prendere ciò che vogliamo da un indirizzo IP e con i dati che ci occorrono:

/**
 * Dati Localizzazione IP utente tramite GeoLite2
 */
function mm_get_geo_data_from_ip( $ip_address ) {

    // Cambiare la path qui per puntare al file
    $database_file = get_template_directory() . '/dist/geo/GeoLite2-City.mmdb';
    $geo_data = [];

    if (file_exists($database_file) && is_readable($database_file)) {
        $reader = new \MaxMind\Db\Reader($database_file);

        try {
            $record = $reader->get($ip_address);
            
            if ($record) {
                $geo_data['country_code'] = isset($record['country']['iso_code']) ? $record['country']['iso_code'] : '';
                $geo_data['country_name'] = isset($record['country']['names']['en']) ? $record['country']['names']['en'] : '';
                $geo_data['city'] = isset($record['city']['names']['en']) ? $record['city']['names']['en'] : '';
                $geo_data['latitude'] = isset($record['location']['latitude']) ? $record['location']['latitude'] : '';
                $geo_data['longitude'] = isset($record['location']['longitude']) ? $record['location']['longitude'] : '';
            }
        } catch (\MaxMind\Db\Reader\InvalidDatabaseException $e) {
            error_log('Invalid GeoLite2 database: ' . $e->getMessage());
        } catch (\InvalidArgumentException $e) {
            error_log('Invalid IP address: ' . $e->getMessage());
        }

        $reader->close();
    }

    return $geo_data;
}

Fatto questo possiamo usare le 2 funzioni assieme per ottenere i dati dell’utente, per esempio:

$client_ip = mm_get_client_ip();
$geo_data = mm_get_geo_data_from_ip( $client_ip );

Nel mio caso, ecco un var_dump php delle 2 variabili con il risultato finale!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *