When you run ads on your WordPress site, sometimes you need to block ads being shown in certain countries. That’s what I’m doing to block visitors from some countries viewing ads to protect my Adsense account.

Google Adsense logo for WPWebHost WordPress Hosting Provider Image source: Google Adsense Blog

Traffic source from some certain countries may harm your Google Adsense account.

In this tutorial, I’ll show you how to write your own WordPress plugin to do it. I won’t try to build a complex plugin, but keep it simple; and sure, you can develop it to meet your needs. Let’s begin.

First of all, you need list of IP Ranges of the countries you need to block. For example, this is the US’ IP ranges. You can search these kinds of ranges easily on the Internet.

  3.0.0.0 - 4.17.135.31
  4.17.135.64 - 4.17.142.255
  4.17.143.16 - 4.18.32.71
  4.18.32.80 - 4.18.40.135
  ...

How it works? I’ll use WordPress Shortcode to display ads, once there are requests from these IPs, the plugin won’t show ads.

You can leave the IPs in the plugin file, but I prefer push them into database, working on database will make the plugin loads much faster.

We use  ip2long() to convert the IPs to numbers and insert them to a table in the database:

$range = "3.0.0.0 - 4.17.135.31
  4.17.135.64 - 4.17.142.255
  4.17.143.16 - 4.18.32.71
  4.18.32.80 - 4.18.40.135
 ... "; // // Paste all the IP ranges. These are just sample ranges
                 $range=str_replace(" ","",$range);
                 $range = str_replace ("-",",",$range);
                 $range = str_replace ("\n",",",$range);
                 $range = explode(",",$range);
                 for ($i=0;$i<=count($range);$i++) {
$ipaton[$i] = sprintf("%u", ip2long($range[$i]));
$ipaton[$i] = (substr($range[$i],0,3)>127) ? ((ip2long($range[$i])
               & 0x7FFFFFFF) + 0x80000000) : ip2long($range[$i]);
//The above two lines were broken to fit the theme's width!
//It's just one line
                 }
                 $i=0;
                 while ($i<count($range)) {
                                 $s = $i+1;
                                 $firstip[] = $ipaton[$i];
                                 $lastip[] = $ipaton[$s];
                                 $i=$i+1;
                                 $i++;
                 }

The $firstip[] and $lastip[] of the ranges above is now something like this:

$firstip[$i]          $lastip[$i]
 0185088                20447231
 234885120              234889215
 245366784              247463935
 249561088              251658239
 452987904              452988927
 ...

When there is a IP requests your page, the plugin will convert that IP to number using ip2long() then a function will check if the IP is between the $firstip[] and $lastip[]. Here is that function:

function blockip_check() {
 global $wpdb;
       $ip = $_SERVER['REMOTE_ADDR'];
       $ip_aton = sprintf("%u", ip2long($ip));
       $ip_aton = (substr($ip,0,3)>127) ?
                  ((ip2long($ip) & 0x7FFFFFFF) + 0x80000000)
                   : ip2long($ip);
       //The above 3 lines were broken to fit the theme's width!
       //It's just one line
       $sql = "SELECT * FROM wp_blockip
                WHERE $ip_aton >= startip
                AND $ip_aton <= endip
                ORDER BY startip DESC
                LIMIT 1";
       $row = $wpdb->get_row("$sql");
 return $row;
 }

The function return $row, if $row is empty, that means the visitor’s IP is not in the table, the plugin then display ads.

$check = blockip_check();
 if (empty($check)){
                 function ads1() {
                 return ''; //Display ads with no content!
                 }
 add_shortcode( 'ads1', 'ads1' );
           //If you have more ads spot, make a copy of ads1() here!
} else {
function ads1() {
                 return 'Ads Content 1';
                 //Replace Adsense code or any ads code here!
 }
 add_shortcode( 'ads1', 'ads1' );
// Now you can put [ads1] to your theme or widget to display ads1
// If you have more ads spot, make a copy of ads1() here!
 }

Once the plugin is activated, you can use put [ads1], [ads2]… anywhere in your theme or widget to display ads.

It’s just that simple! Let’s put all together and make a complete plugin.

  1. Create a .php file and put it under the plugins folder. For example: /plugins/blockip/blockip.php
  2. Edit the source code below to meet your needs. (Change ads code, IP ranges… )
  3. Activate the plugin through the admin board.
  4. Use WordPress Shortcode to display ads, by place [yourads] in your themes or widgets.
<?php
/*
Plugin Name: Block IP
Plugin URI: http://wordpress.com/
Description: Block ads being shown in certain countries.
Version: 1.0.0
Author: nn_bien@yahoo.com
Author URI: http://wordpress.com/
*/
    add_filter('widget_text', 'do_shortcode');

function blockip_install() {
global $wpdb;
    $table_name = $wpdb->prefix . "blockip"; //Your table name

    $range = "3.0.0.0 - 4.17.135.31
 4.17.135.64 - 4.17.142.255
 4.17.143.16 - 4.18.32.71
 4.18.32.80 - 4.18.40.135"; // These are sample ranges

         $range=str_replace(" ","",$range);
         $range = str_replace ("-",",",$range);
         $range = str_replace ("\n",",",$range);
          $range = explode(",",$range);

     for ($i=0;$i<=count($range);$i++) {
   $ipaton[$i] = sprintf("%u", ip2long($range[$i]));
   $ipaton[$i] = (substr($range[$i],0,3)>127) ?
                 ((ip2long($range[$i]) & 0x7FFFFFFF) + 0x80000000)
                 : ip2long($range[$i]);
//The above 3 lines were broken to fit the theme's width!
//It's just one line
    }
    $i=0;
    while ($i<count($range)) {
        $s = $i+1;
        $firstip[] = $ipaton[$i];
        $lastip[] = $ipaton[$s];
        $i=$i+1;
        $i++;
    }

if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name){
    $sql = "CREATE TABLE " . $table_name . " (
        startip int(11) unsigned NOT NULL default '0',
        endip int(11) unsigned NOT NULL default '0',
        KEY startip (startip)
        );";
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);

    $i=0;
while ($i<count($range)/2){
    $rows_affected = $wpdb->insert($table_name,
                            array('startip' => $firstip[$i],
                                  'endip' => $lastip[$i]));
     //The above 3 lines were broken to fit the theme's width!
     //It's just one line
     $i++;
        }
    }
}

    register_activation_hook(__FILE__,'blockip_install');

function blockip_check() {
global $wpdb;
    $ip = $_SERVER['REMOTE_ADDR'];
    $ip_aton = sprintf("%u", ip2long($ip));
    $ip_aton = (substr($ip,0,3)>127) ? ((ip2long($ip) & 0x7FFFFFFF)
               + 0x80000000) : ip2long($ip);
    //The above two lines were broken to fit the theme's width!
    //It's just one line
    $sql = "SELECT * FROM wp_blockip
            WHERE $ip_aton >= startip
            AND $ip_aton <= endip
            ORDER BY startip DESC
            LIMIT 1";
    $row = $wpdb->get_row("$sql");
return $row;
}

    $check = blockip_check();
        if (!empty($check)){
                function ads1() {
                    return '';
                    //Display ads with no content!
                }
            add_shortcode( 'ads1', 'ads1' );
                function ads2() {
                    return '';
                    //Display ads with no content!
                }
            add_shortcode( 'ads2', 'ads2' );
//If you have more ads spot, make a copy of ads2() here!
            } else {
                function ads1() {
                    return 'Your Ads Code';
            //Replace Adsense code or any ad code here!
                }
            add_shortcode( 'ads1', 'ads1' );
//Now you can put [ads1] to your theme or widget to display ads1
                function ads1() {
                    return 'Your Ads Code';
//Replace Adsense code or any ad code here!
                }
            add_shortcode( 'ads2', 'ads2' );
//Now you can put [ads2] to your themes or widgets to display ads2
//If you have more ads spot, make a copy of ads2() here!                
            }

?>

If you have any question, please leave comment. I will answer within my knowledge!

Author:

Bien is a PHP programmer, he's a fan of Wordpress. After three years running some Wordpress sites, he have some experience and he love to share it to everyone. Feel free to leave comment if you have any question or suggestion related to his posts. His newest blog is about Du Lich Thai Lan

5 Comments

  1. Why don’t you create plugin for this?

  2. New moncler Daunenjacke, warmer Kragen den letzten Schliff ist, schöner, alles ist die Offenbarung des Charakters.

  3. Really Nice and helpful post.

    Sir i am using blogger and i want to integrate above feature in my blog. Please help.

    Thanks in advance.

Leave a Comment

Feedback Form
Customer Feedback