You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
2.0 KiB

<?php
/*
This file contains the code required to populate GeoIP infomration in to the database.
It is used in two different parts of the plugin; when a user manual requests the update to happen and after a new GeoIP database has been download (if the option is selected).
*/
// Include the MaxMind library and use it.
include_once( plugin_dir_path( __FILE__ ) . '../../vendor/autoload.php' );
use GeoIp2\Database\Reader;
// This function does all the work.
function wp_statistics_populate_geoip_info() {
global $wpdb;
// Find all rows in the table that currently don't have GeoIP info or have an unknown ('000') location.
$result = $wpdb->get_results("SELECT id,ip FROM `{$wpdb->prefix}statistics_visitor` WHERE location = '' or location = '000' or location IS NULL");
// Try create a new reader instance.
try {
$upload_dir = wp_upload_dir();
$reader = new Reader( $upload_dir['basedir'] . '/wp-statistics/GeoLite2-Country.mmdb' );
} catch( Exception $e ) {
return "<div class='updated settings-error'><p><strong>" . __('Unable to load the GeoIP database, make sure you have downloaded it in the settings page.', 'wp_statistics') . "</strong></p></div>";
}
$count = 0;
// Loop through all the missing rows and update them if we find a locaiton for them.
foreach( $result as $item ) {
$count++;
// If the IP address is only a hash, don't bother updating the record.
if( substr( $item->ip, 0, 6 ) != '#hash#' ) {
try {
$record = $reader->country( $item->ip );
$location = $record->country->isoCode;
if( $location == "" ) { $location = "000"; }
} catch( Exception $e ) {
$location = "000";
}
// Update the row in the database.
$wpdb->update( $wpdb->prefix . "statistics_visitor", array( 'location' => $location ), array( 'id' => $item->id) );
}
}
return "<div class='updated settings-error'><p><strong>" . sprintf(__('Updated %s GeoIP records in the visitors database.', 'wp_statistics'), $count) . "</strong></p></div>";
}
?>