Thank you for using my plugin.
This plugin does nothing on regular page where the form is shown. But you may be happy if you can get the country code of your visitor in ip_validation().
How about the following code?
(I omit the IP2Location DB setting.)
// Validate Gravity Forms only if country of users is Iran
add_filter( 'gform_validation', 'ip_validation' );
function ip_validation( $validation_result ) {
$whitelist = array(
'IR',
);
$validation_result["is_valid"] = true;
if ( class_exists( 'IP_Geo_Block' ) ) {
$validation_result["is_valid"] = false;
$geolocation = IP_Geo_Block::get_geolocation( $_SERVER['REMOTE_ADDR'] );
if ( !empty( $geolocation['countryCode'] ) {
foreach ( $whitelist as $country ) {
if ( $country === $geolocation['countryCode'] ) {
$validation_result["is_valid"] = true;
break;
}
}
}
}
return $validation_result;
}
add_filter( 'gform_validation_message', 'change_validation_message', 10, 2 );
function change_validation_message( $message, $form ) {
return "<div class='validation_error'>You can't submit this form outside of Iran. Thank you</div>";
}
Dear tokkonopapa
thank you for your answer & sorry for my late reply.
I tried your code.
after this line :
$geolocation = IP_Geo_Block::get_geolocation( $_SERVER['REMOTE_ADDR'] );
when i print_r($geolocation), it successfully returns an array like this:
Array
(
[ip] => 2.176.231.191
[auth] => 1
[time] => 0.0028219223022461
[provider] => Cache
[errorMessage] => not in the cache
)
but $geolocation[‘countryCode’] returns NULL. so it doesn’t work as expected.
> thank you for your answer & sorry for my late reply.
That’s OK! I appreciate you that you are kindly giving me a chance to improve this plugin.
I think there’s some problems related to IP address database settings. Please check followings on this plugin page.
1. Go to the ‘Settings‘ tab. Check ‘IP2Location‘ in ‘API selection and key settings‘. If you can’t find ‘IP2Location‘, then this plugin can’t find the DB.
2. Go to the ‘Search‘ tab. Select ‘IP2Location‘ in ‘Geolocation service‘ and search your IP address. If something is wrong, you will see ‘errorMessage’ on the map.
And please try to use another DB, at least Maxmind.
3. Go to the ‘Settings‘ tab. Check ‘Maxmind‘ in ‘API selection and key settings‘. Then push ‘Download now‘ in ‘Maxmind GeoLite settings‘. If something is wrong, you will see an error message.
I strongly recommend to use multiple DBs. If you find any errors, please report here.
Thanks.
Additional Info.
If all of DBs are not available, this plugin will return the followings.
Array
(
[ip] => xxx.xxx.xxx.xxx
[auth] => 1
[time] => 0.000348091125488
[provider] => Cache
[errorMessage] => not in the cache
)
or
Array
(
[ip] => xxx.xxx.xxx.xxx
[auth] => 1
[time] => 0.000137090682983
[provider] => Cache
[countryCode] => ZZ
)
A [countryCode] => ZZ means ‘unknown’ IP address.
I’m sorry about your trouble but my sample.php was not good.
Could you try following codes to set the DB for ip2location-tags?
function my_ip2location_path( $path ) {
return WP_CONTENT_DIR . '/plugins/ip2location-tags/IP2LOCATION-LITE-DB5.BIN';
}
add_filter( 'ip-geo-block-ip2location-path', 'my_ip2location_path' );
You may need the plugins.
hi.
thanks for your time.
i replaced your new code. now in IP Geo Block Setting & Search Tabs, i can access ip2location db and it works great.
but in functions.php, when i try this:
<?php
function my_ip2location_path($path) {
return WP_CONTENT_DIR . '/plugins/ip2location-tags/IP2LOCATION-LITE-DB5.BIN';
}
add_filter('ip-geo-block-ip2location-path', 'my_ip2location_path');
if (class_exists('IP_Geo_Block')) {
$geolocation = IP_Geo_Block::get_geolocation($_SERVER['REMOTE_ADDR']);
print_r($geolocation);
}
?>
it still returns an array without country code.
Array
(
[ip] => xxx.xxx.xxx.xxx
[auth] => 1
[time] => 0.000348091125488
[provider] => Cache
[errorMessage] => not in the cache
)
I also tried to set Number of entries & Expiration time in Cache Settings to 0 to disable Cache. but didn’t work.
Sorry but I found a bug and fixed not in the cache issue.
Please update to the version 2.0.4 and try following codes.
<?php
// Adding IP2Location DB for IP Geo Block
function my_ip2location_path( $path ) {
return WP_PLUGIN_DIR . '/ip2location-tags/IP2LOCATION-LITE-DB5.BIN';
}
add_filter( 'ip-geo-block-ip2location-path', 'my_ip2location_path' );
// Validate Gravity Forms only if country of users is Iran
add_filter( 'gform_validation', 'ip_validation' );
function ip_validation( $validation_result ) {
$whitelist = array(
'IR',
);
$validation_result["is_valid"] = true;
if ( class_exists( 'IP_Geo_Block' ) ) {
$validation_result["is_valid"] = false;
// default IP address is $_SERVER['REMOTE_ADDR']
$geolocation = IP_Geo_Block::get_geolocation();
// if found
if ( empty( $geolocation['errorMessage'] ) {
if ( in_array( $geolocation['code'], $whitelist ) ) {
$validation_result["is_valid"] = true;
}
}
// if not found
else {
$validation_result["is_valid"] = true; // or false
}
}
return $validation_result;
}
add_filter( 'gform_validation_message', 'change_validation_message', 10, 2 );
function change_validation_message( $message, $form ) {
return "<div class='validation_error'>You can't submit this form outside of Iran. Thank you</div>";
}
?>
Thank you for your trying so many times!
Dear tokkonopapa
Thank you very much for your amazing support!
I installed latest version and now everything works like a charm (Also Gravity Forms Save/Update issue is now fixed) 🙂
Array
(
[ip] => xxx.xxx.xxx.xxx
[auth] => 1
[time] => 0.004810094833374
[provider] => IP2Location
[code] => IR
)
best wishes to you.