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!
