{"id":395264,"date":"2026-11-02T10:06:03","date_gmt":"2026-11-02T10:06:03","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/wplocation\/"},"modified":"2026-11-02T10:05:49","modified_gmt":"2026-11-02T10:05:49","slug":"wplocation","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/wplocation\/","author":23595521,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.8","requires_php":"7.4","requires_plugins":null,"header_name":"WPLocation - Geolocation and Country Rules","header_author":"WPLocation","header_description":"Show country-specific content using a locally configured geolocation database.","assets_banners_color":"49647a","last_updated":"2026-11-02 10:05:49","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wplocation.com\/","header_author_uri":"https:\/\/wplocation.com\/about\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":118,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"wplocation","date":"2026-11-02 10:05:49","revision":3779487}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3779487,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3779487,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3779487,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3779487,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"wplocation\/country-content":{"name":"wplocation\/country-content","title":"Country visibility"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3779487,"resolution":"1","location":"assets","locale":"","width":1220,"height":911},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3779487,"resolution":"2","location":"assets","locale":"","width":1229,"height":781}},"screenshots":{"1":"Select the countries that can see a WordPress page and review the resulting audience.","2":"Check whether the private country database is ready and when it was built."}},"plugin_section":[],"plugin_tags":[3751,4124,4169,6309],"plugin_category":[49],"plugin_contributors":[290244],"plugin_business_model":[],"class_list":["post-395264","plugin","type-plugin","status-publish","hentry","plugin_tags-country","plugin_tags-geolocation","plugin_tags-geotargeting","plugin_tags-visibility","plugin_category-maps-and-location","plugin_contributors-wplocation","plugin_committers-wplocation"],"banners":{"banner":"https:\/\/ps.w.org\/wplocation\/assets\/banner-772x250.png?rev=3779487","banner_2x":"https:\/\/ps.w.org\/wplocation\/assets\/banner-1544x500.png?rev=3779487","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wplocation\/assets\/icon-128x128.png?rev=3779487","icon_2x":"https:\/\/ps.w.org\/wplocation\/assets\/icon-256x256.png?rev=3779487","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wplocation\/assets\/screenshot-1.png?rev=3779487","caption":"Select the countries that can see a WordPress page and review the resulting audience."},{"src":"https:\/\/ps.w.org\/wplocation\/assets\/screenshot-2.png?rev=3779487","caption":"Check whether the private country database is ready and when it was built."}],"raw_content":"<!--section=description-->\n<p>WPLocation is a country visibility plugin for WordPress. Set an audience for posts, pages or categories, use the country visibility block or [wplocation_target] shortcode, and display a detected country with [wplocation_country]. The admin menu includes Settings, Diagnostics and a private activity log. Pro and optional add-ons are distributed separately; no paid feature code is bundled or locked inside this plugin. Pro 1.4.4 or newer recognizes this directory edition as a compatible Free base; Pro itself requires PHP 8.3.<\/p>\n\n<p>The plugin needs a current, licensed GeoLite2 Country MMDB. It does not bundle location data. You can select a private server file or use your own MaxMind account ID and license key to download one from Settings. Automatic updates are opt in and off by default. When enabled, the updater contacts MaxMind for an authorized download and follows its signed Cloudflare R2 file URL. The providers receive your site's server IP and MaxMind receives the account credentials. Visitor IPs remain on your server during local lookups and are not sent by the updater. See https:\/\/dev.maxmind.com\/geoip\/geolite2-free-geolocation-data\/, https:\/\/www.maxmind.com\/en\/geolite\/eula, https:\/\/www.maxmind.com\/en\/privacy-policy and https:\/\/www.cloudflare.com\/privacypolicy\/.<\/p>\n\n<p>Saved MaxMind credentials are non-autoloaded WordPress options, not encrypted at rest; they may appear in database backups. For stronger secret management, define WPLOCATION_MAXMIND_ACCOUNT_ID and WPLOCATION_MAXMIND_LICENSE_KEY in wp-config.php. Those constants take priority. The plugin does not display saved keys or record them in its activity log.<\/p>\n\n<p>Store the MMDB outside the public web root. Automatic updates save validated copies beside the configured source, select them atomically and retain the last working file on failure. Recorded unchanged retired copies can be removed after two days; configured and untracked files remain the site's responsibility. WordPress cron needs traffic or a server cron. Follow MaxMind's database update and deletion requirements. This product can use GeoLite Data created by MaxMind, available from https:\/\/www.maxmind.com\/.<\/p>\n\n<p>Geolocation is approximate and these rules are for personalization, not access control for confidential content. When a country cannot be determined, restricted content is hidden. Caches and CDNs can serve the wrong country or bypass WordPress altogether. While Free is active, the plugin requests no-store responses for frontend HTML and country-aware post, page and search REST reads because targeted content can appear in posts, blocks and secondary queries. It purges WP Super Cache when its API is present, but you must configure and test any shared cache. Forwarded IP headers are not trusted by default; verified infrastructure can provide an address with the wplocation_verified_client_ip filter.<\/p>\n\n<p>WPLocation's older standalone 1.0.0 plugin cannot be replaced safely without preparation: its old bundled database disappears when WordPress replaces the plugin folder, and that database is outdated. This first directory release uses version 1.0.0 so WordPress does not offer it as an automatic update to existing standalone 1.0.0 installations. Do not manually overwrite the old plugin. Back up the site and rules, prepare a current licensed database outside the old plugin folder, deactivate and remove the old plugin, then install this release. Replace legacy [locationtarget] shortcodes with [wplocation_target] in content before removing the old plugin. The legacy settings use the same option names, so review and test every rule after migrating. A future version above 1.0.0 requires a separate, tested upgrade path.<\/p>\n\n<p>The combined plugin is GPLv3 or later and contains third-party libraries under their own licenses, including Apache-2.0 MaxMind libraries. See THIRD-PARTY-NOTICES.txt and vendor license files.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>If migrating from the standalone WPLocation plugin, back up the site and follow the migration steps above before removing it.<\/li>\n<li>Install and activate WPLocation.<\/li>\n<li>In WPLocation &gt; Settings, select an existing private GeoLite2 Country MMDB or save your own MaxMind credentials and download one. Alternatively define WPLOCATION_GEOIP_DB_PATH in wp-config.php; this constant takes priority. Illustrated setup: https:\/\/wplocation.com\/documentation\/maxmind-geolite2-country-setup\/.<\/li>\n<li>In Diagnostics, verify the database date and run a private IP lookup. Create a country rule and test the page with your actual cache and CDN configuration.<\/li>\n<li>If you enable automatic updates, monitor WordPress cron and the update status. Purge external page and CDN caches after plugin, data or rule changes.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20without%20a%20maxmind%20account%3F\"><h3>Does it work without a MaxMind account?<\/h3><\/dt>\n<dd><p>Yes, if you already have a current, licensed GeoLite2 Country MMDB that you can maintain. The in-plugin GeoLite download requires your own MaxMind account and license key.<\/p><\/dd>\n<dt id=\"does%20it%20secure%20confidential%20content%3F\"><h3>Does it secure confidential content?<\/h3><\/dt>\n<dd><p>No. IP location is approximate. Other APIs, feeds, queries and caches may expose content. Use WordPress access controls for confidential material.<\/p><\/dd>\n<dt id=\"is%20every%20page%20cache%20or%20cdn%20compatible%3F\"><h3>Is every page cache or CDN compatible?<\/h3><\/dt>\n<dd><p>No. A cache can serve an existing response before this plugin runs. Test targeted URLs from different countries and bypass or vary shared cache entries when necessary. WP Super Cache is purged on activation, updates and rule or data changes when its API is available. Other caches need their own purge or configuration.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Preserve safe form fields in conditional content while filtering unsafe HTML.<\/li>\n<li><p>Provide a compatibility marker for Pro 1.4.4 or newer without changing the migration-safe directory version number.<\/p><\/li>\n<li><p>First WordPress.org submission candidate under the wplocation slug. It shares the legacy version number to avoid offering an unattended update to standalone 1.0.0 installations.<\/p><\/li>\n<li>Validate admin inputs as they enter the plugin and document why read-only navigation needs no nonce and why the update lock uses direct SQL.<\/li>\n<li>Correct the MaxMind credential-removal checkbox layout and publish key-free GeoLite setup and data-source guides on wplocation.com.<\/li>\n<li>Add post, page and category audience rules, country visibility block, country shortcodes, Diagnostics, Activity Log and mobile admin screens.<\/li>\n<li>Support a private GeoLite2 Country MMDB and opt-in MaxMind downloads with validated file replacement, rollback and cleanup.<\/li>\n<li>Clarify migration, data licensing, privacy and cache limitations. The DB-IP source is excluded from this directory edition while its attribution requirements are reviewed.<\/li>\n<\/ul>","raw_excerpt":"Show posts, pages, categories and selected content by visitor country with a local GeoLite2 Country database.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/395264","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=395264"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wplocation"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=395264"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=395264"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=395264"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=395264"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=395264"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=395264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}