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!