Requirements
| WordPress | 5.6 or higher |
|---|---|
| PHP | 7.4 or higher |
| API Keys | None. Geo lookups use free public APIs out of the box with automatic failover across four providers |
| External Dependencies | None to install. The interactive world map is bundled locally (no external requests) |
Installation
- Download the ZIP file from your account
- Go to Plugins → Add New → Upload Plugin
- Upload the ZIP and click Install Now
- Click Activate
Uninstalling
Deactivate and delete from the Plugins screen. Scheduled cron events are cleared on deactivation. Options stored under bsas_* in the wp_options table and the wp_bsas_logs table remain in your database; remove them manually for a completely clean removal.
Quick Start
- Open Geoblocker (Paid) in your WordPress admin sidebar
- On the General tab, confirm Enable Geoblocking is on (it is by default)
- Go to the Countries tab and check the countries or continents you want to block
- Click Save
- Optionally set up regions, redirect rules, schedules, IP lists, and a custom block page on the other tabs
Visitors from the selected locations immediately see a “403 Access Restricted” block page. Customize it on the Block Page tab.
Core Settings (General Tab)
| Enable Geoblocking | Master on/off switch. When off, no visitors are blocked regardless of other settings |
|---|---|
| Allow Search Crawlers | When on, recognized search engines (Google, Bing, and others) bypass blocking. Crawlers are verified by forward-confirmed reverse DNS, not just the user-agent string, so spoofed bots can't slip through. Recommended on for SEO |
| Block VPNs & Data Centers | Block visitors from known VPN services, hosting providers, and data-center IPs even when their country is allowed |
| Block REST API Access | Apply blocking rules to /wp-json/ REST API requests. Off by default |
Log Mode
| Log everything | Records both blocked and allowed visitors |
|---|---|
| Log blocked only | Records only blocked visitors (recommended) |
| Log allowed only | Records only allowed/bypassed visitors |
| Disable logging | No access logs are written. Reduces database writes on high-traffic sites |
Unknown Location Policy
| Allow access | If a visitor's country can't be determined, they are allowed through (recommended) |
|---|---|
| Block access | If a visitor's country can't be determined, they are blocked. Use for strict compliance |
Blocking Mode
| Blocklist | Default. Everyone is allowed except the countries, continents, and regions you select |
|---|---|
| Allowlist | Reverses the logic: everyone is blocked except the locations you select. Use this when you only serve a small number of countries |
/wp-admin/ login always stays reachable.Behind a Proxy / CDN
By default the plugin trusts the direct connection IP, which is the safe choice and prevents IP-spoofing bypasses.
| Trust proxy headers | Enable only if your site sits behind Cloudflare or another reverse proxy. When on, the plugin reads the real visitor IP from headers like CF-Connecting-IP and X-Forwarded-For |
|---|
AI Scrapers & Bots
| Block AI training & scraper bots | Blocks known AI crawlers regardless of their country — including GPTBot, ClaudeBot, CCBot, Google-Extended, PerplexityBot, Bytespider, and more |
|---|
Use this to keep your content out of AI training datasets and to cut crawler bandwidth. Legitimate search-engine crawlers are unaffected when “Allow Search Crawlers” is on.
Hosting, VPN & Network Blocking
| Block hosting providers & datacenters | Blocks visitors whose IP belongs to a hosting/datacenter network (a common source of bots and abuse) |
|---|---|
| Custom network / ASN blocklist | One keyword or ASN per line, matched against the visitor's network name. Example entries: AS13335, DigitalOcean. Lines are matched case-insensitively |
Test an IP Address
Right on the General tab you can enter any IP and see exactly how the plugin would handle it against your current settings — the detected country/region, the decision (blocked, allowed, or bypassed), and the reason. A dedicated IP Tester is also available on the Tools tab.
Admin Access & URL Allow List
WordPress Admin Access
The WordPress admin area and login page are never blocked by default, so you can't lock yourself out. An optional Block WordPress admin area toggle is available if you specifically want geo rules applied to /wp-admin/ as well.
Never Block These URLs
Enter URLs or path fragments (one per line) that should always bypass blocking — for example a webhook endpoint, a health-check URL, or a public landing page you want reachable from everywhere.
Live World Map
The General tab includes an interactive world map (bundled locally, no external requests) that color-codes every country by its current status:
| Allowed, receiving traffic | Allowed countries that have recent visitors |
|---|---|
| Allowed, no traffic | Allowed countries with no recent visitors |
| Blocked, receiving traffic | Blocked countries that are actively being turned away |
| Blocked, no traffic | Blocked countries with no recent hits |
Above the map, live counters show total blocked, last 24h, and last 7d so you can see your blocking activity at a glance.
Countries & Continents (Countries Tab)
Block Countries
A searchable grid of 250+ countries and territories. Use the search box to find a country fast, or the Select All / Deselect All buttons for bulk actions. Checked entries are affected according to your Blocking Mode.
Block Continents
Block entire continents with one checkbox: Africa, Antarctica, Asia, Europe, North America, Oceania, and South America. Continent selections stack with individual country selections.
Regions / States (Regions Tab)
Block at a sub-country level for seven countries:
| United States | All 50 states plus DC, Puerto Rico, Guam, and U.S. Virgin Islands |
|---|---|
| Canada | All 13 provinces and territories |
| United Kingdom | England, Scotland, Wales, and Northern Ireland |
| Australia | All 8 states and territories |
| Germany | All 16 Bundesländer |
| India | All 36 states and union territories |
| China | All 31 provinces, municipalities, and autonomous regions |
Rules Tab
Redirect Rules
Instead of showing the block page, send visitors from a specific location to a custom URL (302 redirect). Each rule has a Type (Country, Continent, US State, CA Province, UK Region, AU State, DE State, IN State, or CN Province), a Value (the location to match), and a URL. Click + Add Rule for more. Redirect rules are checked before the normal block page; the first match wins and is independent of your blocked list.
Blocking Schedules
Create time-based profiles, each with a name, the days it's active, and a start/end hour (24-hour format, overnight spans supported). Blocking is active when any enabled schedule matches the current day and time; if no schedules are enabled, blocking runs 24/7. Times follow your WordPress timezone.
Page-Level Blocking
Restrict blocking to specific pages instead of the whole site. Add pages from the selector, then choose Block ONLY these pages or Block all EXCEPT these pages (handy for keeping a landing page or legal notice open to everyone).
Automation Tab
Auto-Block Repeat Offenders
Automatically blacklist IPs that keep hitting the block page. Set a Threshold (number of blocked hits) and a Period (Per Hour or Per Day). When an IP exceeds the threshold within the period it's added to the IP blacklist automatically.
WooCommerce Integration
| Prevent Checkout | Visitors from blocked locations are stopped from completing checkout |
|---|---|
| Prevent Cart Access | Visitors from blocked locations see the block page when opening the cart |
IP Lists Tab
IP Whitelist
IPs or ranges that always bypass blocking, regardless of location. Whitelisted visitors are logged as “bypassed.”
IP Blacklist
IPs or ranges that are always blocked, regardless of location, with no geo lookup.
Both fields accept IPv4, IPv6, and CIDR notation, one entry per line — e.g. 192.168.1.1, 2001:db8::1, 192.168.1.0/24. Lines starting with # are treated as comments.
Block Page Tab
Redirect (Optional)
Enter a URL to send all blocked visitors to instead of showing the block page. When set, the design settings below are ignored.
Block Page Colors
| Background | Page background color (default dark navy #0f172a) |
|---|---|
| Text | Text color |
| Accent | Icon gradient / accent color |
Block Page Content
| Heading | Main title (default “Access Restricted”) |
|---|---|
| Message Body | Description text below the heading |
Custom CSS
Add CSS to further style the block page. Available classes include .bsas-block-body, .bsas-panel, .bsas-icon, plus h1 and p.
Live Preview
A real-time preview shows exactly how your block page looks as you adjust colors and text.
Logs Tab
A paginated table of access log entries, newest first. Each row shows the detected country and region, the decision (Blocked, Allowed, Bypassed, or Error), the reason (e.g. country_blocked, region_blocked, whitelisted, vpn_datacenter, ai_bot, redirect_rule), the requested URI, and the timestamp.
Log Retention Settings
| Retention Days (0 = forever) | How many days to keep entries. Default 30. A daily cron job removes older rows |
|---|---|
| Max Entries (0 = unlimited) | Cap on stored entries. When exceeded, the oldest are deleted first |
Log export is available on the Tools tab and the CSV is sanitized against spreadsheet formula injection.
Tools Tab
Export Settings
Download all plugin settings as a single JSON file — handy for backups or copying a configuration to another site.
Import Settings
Upload a previously exported JSON file to restore or clone your configuration.
IP Tester
Enter any IP address to preview the exact decision the plugin would make for it against your live rules — the same tester that appears on the General tab.
Support Tab
The Support tab links to priority support and help resources. For account or licensing questions, visit plugins-for-wp.com.
How Blocking Works
On each frontend request the plugin runs checks roughly in this order:
- Admin / cron / AJAX? — admin, WP-CLI, cron, and AJAX requests skip blocking entirely
- Plugin enabled? — if the master toggle is off, everyone is allowed
- REST API —
/wp-json/is excluded unless Block REST API is on - Bypass cookie — a recent allowed visitor passes through without a re-check
- IP whitelist / blacklist — whitelisted IPs are allowed; blacklisted IPs are blocked with no geo lookup
- Crawler check — verified search crawlers are allowed when that setting is on
- AI & bot check — AI scraper bots are blocked when that setting is on
- Schedule check — if no active schedule matches, blocking is paused
- Resolve visitor IP — the connection IP is used by default; proxy headers are only read if you've enabled them
- Geo lookup — country/region from cache or the free provider chain
- Unknown location — the allow/block policy applies if the country can't be determined
- Redirect rules — a matching rule 302-redirects the visitor
- Mode evaluation — the country/continent/region is evaluated against your Blocklist or Allowlist selections
- Hosting / VPN / ASN check — datacenter and custom-network rules apply
- Page-level check — if enabled, only the targeted pages are affected
- Allowed — a short bypass cookie is set so the next page load skips the work
Geo Lookup
The plugin determines a visitor's country and region from four free providers, in failover order, with no API keys:
- ipwhois.is
- ip-api.com
- ipapi.co
- ipinfo.io
All outbound lookups verify TLS certificates. Successful results are cached per IP so repeat visitors trigger no further calls, and failed lookups are cached only briefly — so a temporary provider outage clears quickly instead of lingering for a full day.
Privacy & Data
IP Hashing
Visitor IP addresses are stored as hashes by default, so raw IPs aren't kept. This supports GDPR and general privacy compliance.
What's Stored
wp_bsas_logs | Access logs: hashed IP, country code, region code, decision, reason, request URI, timestamp |
|---|---|
bsas_* options | All plugin settings in wp_options |
| Transients | Cached geo lookup results per visitor IP |
| Cookie | A short-lived bypass cookie set on allowed visitors to avoid repeated lookups |
External Connections
The only data sent off-site is the visitor IP, to the geolocation providers listed above (over verified TLS). Optional, voluntary deactivation feedback is sent to plugins-for-wp.com only if you submit the form. No tracking scripts or third-party cookies are loaded.
Performance
- Geo lookups are cached per IP — repeat visitors cause no extra API calls
- Allowed visitors get a short bypass cookie, skipping the whole check on later page loads
- Failed providers are skipped automatically and retried; failed lookups are cached only briefly
- Outbound requests use short timeouts so a slow provider can't drag your site down
- Admin, cron, AJAX, and (by default) REST API requests are always excluded
- The world map and its assets are bundled locally and only load in the admin
- A daily cron job trims logs by retention days and max-entry limits
Troubleshooting
Visitors from blocked countries are getting through
- Confirm Enable Geoblocking is on (General tab)
- Check the country, its continent, or the visitor's region is selected for your current Blocking Mode
- The visitor may be on a VPN — enable Block VPNs & Data Centers
- If using schedules, verify the current day/time falls in an active schedule
- Cached geo results from before your change clear on their own shortly
- A recent allowed visitor with a bypass cookie won't be re-checked for a little while
I'm blocking myself
/wp-admin/is never blocked — log in there to change settings- Add your IP to the IP Whitelist on the IP Lists tab
- If you enabled Allowlist mode, make sure your own country is on the allow list
- Locked out of the frontend entirely? Rename the plugin folder via FTP/file manager to deactivate it
Region / state blocking isn't working
- Region data depends on the provider returning subdivision info, which varies by provider and country
- Check the Region column on the Logs tab to see whether region codes are detected
- Some mobile and satellite ISPs don't resolve to an accurate region
My site is behind Cloudflare and everyone looks like the same IP
- Enable Trust proxy headers on the General tab so the plugin reads the real visitor IP from
CF-Connecting-IP/X-Forwarded-For - Only enable this when you actually run a proxy/CDN — otherwise it opens an IP-spoofing bypass
The logs table is getting large
- Lower Retention Days (default 30)
- Set a Max Entries cap
- Switch Log Mode to Log blocked only or Disable logging
- The daily cron job handles cleanup automatically
Scheduled cleanup isn't running on time
- WordPress cron depends on traffic; low-traffic sites may fire late
- Consider a real server cron hitting
wp-cron.phpon a schedule - Check that
DISABLE_WP_CRONisn't set inwp-config.php