: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/wfIpLocation.php';
use Wordfence\MmdbReader\Database;
use Wordfence\MmdbReader\Exception\MmdbThrowable;
const SOURCE_BUNDLED = 0;
const DATABASE_FILE_NAME = 'GeoLite2-Country.mmdb';
private static $instances = array();
private function __construct($database, $preferred) {
$this->database = $database;
$this->preferred = $preferred;
public function isPreferred() {
private static function logError($message) {
if (class_exists('wfUtils'))
wfUtils::check_and_log_last_error('ip_locator', 'IP Location Error:', $message, 0);
public function locate($ip) {
if ($this->database !== null) {
$record = $this->database->search($ip);
return new wfIpLocation($record);
catch (MmdbThrowable $t) {
self::logError('Failed to locate IP address: ' . $t->getMessage());
public function getCountryCode($ip, $default = '') {
$record = $this->locate($ip);
return $record->getCountryCode();
public function getDatabaseVersion() {
if ($this->database !== null) {
return $this->database->getMetadata()->getBuildEpoch();
catch (MmdbThrowable $t) {
self::logError('Failed to retrieve database version: ' . $t->getMessage());
private static function getDatabaseDirectory($source) {
case self::SOURCE_BUNDLED:
case self::SOURCE_BUNDLED:
private static function initializeDatabase($preferredSource, &$isPreferred) {
if ($preferredSource !== self::SOURCE_BUNDLED)
$sources[] = $preferredSource;
$sources[] = self::SOURCE_BUNDLED;
foreach ($sources as $source) {
$directory = self::getDatabaseDirectory($source);
$path = $directory . '/' . self::DATABASE_FILE_NAME;
if (file_exists($path)) //Preemptive check to prevent warnings
return Database::open($path);
catch (MmdbThrowable $t) {
self::logError('Failed to initialize IP location database: ' . $t->getMessage());
public static function getInstance($preferredSource = null) {
if ($preferredSource === null)
$preferredSource = self::SOURCE_WFLOGS;
if (!array_key_exists($preferredSource, self::$instances)) {
$database = self::initializeDatabase($preferredSource, $isPreferred);
self::$instances[$preferredSource] = new wfIpLocator($database, $isPreferred);
return self::$instances[$preferredSource];