{"id":358829,"date":"2026-08-26T16:11:18","date_gmt":"2026-08-26T16:11:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/agewall\/"},"modified":"2026-08-26T20:46:32","modified_gmt":"2026-08-26T20:46:32","slug":"webkoding-agewall","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/webkoding-agewall\/","author":23513870,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Webkoding AgeWall \u2013 Age Verification and Age Gate","header_author":"WebKoding","header_description":"Server-side age verification and age gate for WordPress and WooCommerce. The restricted content is never sent to an unverified visitor.","assets_banners_color":"101a27","last_updated":"2026-08-26 20:46:32","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":44,"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":"webkoding","date":"2026-08-26 16:10:59","revision":3667442},"1.0.1":{"tag":"1.0.1","author":"webkoding","date":"2026-08-26 20:46:32","revision":3667785}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3667441,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3667441,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3667441,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3667441,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"agewall\/gate":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"agewall\/gate","title":"AgeWall Gate","category":"widgets","icon":"shield","description":"Withhold the inner content until the visitor verifies their age (server-side).","keywords":["age","verification","gate","restrict","18+"],"textdomain":"agewall","supports":{"html":false,"anchor":true},"attributes":{"min":{"type":"number","default":18},"method":{"type":"string","default":"confirm"}},"editorScript":"agewall-block"}},"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3667441,"resolution":"1","location":"assets","locale":"","width":2800,"height":1492},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3667441,"resolution":"2","location":"assets","locale":"","width":2120,"height":1016},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3667441,"resolution":"3","location":"assets","locale":"","width":2120,"height":1226},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3667441,"resolution":"4","location":"assets","locale":"","width":2120,"height":1226},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3667441,"resolution":"5","location":"assets","locale":"","width":2752,"height":2304},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3667441,"resolution":"6","location":"assets","locale":"","width":882,"height":1383}},"screenshots":{"1":"Server-side enforcement: an unverified visitor's page source contains no restricted markup at all. The protected text is absent from the HTTP response, not hidden with CSS.","2":"A page gated with the whole-page age gate, asking the visitor for a date of birth.","3":"A public article with one age-restricted section locked by the <code>[agewall]<\/code> shortcode. The surrounding paragraphs stay public.","4":"The AgeWall Gate block. The blocks nested inside it are rendered on the server only after the visitor verifies.","5":"Settings: minimum age, verification method, and what happens when a visitor is unverified \u2014 withhold, redirect or overlay.","6":"The \"Age restriction (AgeWall)\" box on the edit screen, setting a minimum age and method for a single page."}},"plugin_section":[],"plugin_tags":[70877,41695,5616,14361,29575],"plugin_category":[],"plugin_contributors":[277071],"plugin_business_model":[],"class_list":["post-358829","plugin","type-plugin","status-publish","hentry","plugin_tags-age-gate","plugin_tags-age-restriction","plugin_tags-age-verification","plugin_tags-compliance","plugin_tags-restricted-content","plugin_contributors-webkoding","plugin_committers-webkoding"],"banners":{"banner":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/banner-772x250.png?rev=3667441","banner_2x":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/banner-1544x500.png?rev=3667441","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/icon-128x128.png?rev=3667441","icon_2x":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/icon-256x256.png?rev=3667441","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/screenshot-1.png?rev=3667441","caption":"Server-side enforcement: an unverified visitor's page source contains no restricted markup at all. The protected text is absent from the HTTP response, not hidden with CSS."},{"src":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/screenshot-2.png?rev=3667441","caption":"A page gated with the whole-page age gate, asking the visitor for a date of birth."},{"src":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/screenshot-3.png?rev=3667441","caption":"A public article with one age-restricted section locked by the <code>[agewall]<\/code> shortcode. The surrounding paragraphs stay public."},{"src":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/screenshot-4.png?rev=3667441","caption":"The AgeWall Gate block. The blocks nested inside it are rendered on the server only after the visitor verifies."},{"src":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/screenshot-5.png?rev=3667441","caption":"Settings: minimum age, verification method, and what happens when a visitor is unverified \u2014 withhold, redirect or overlay."},{"src":"https:\/\/ps.w.org\/webkoding-agewall\/assets\/screenshot-6.png?rev=3667441","caption":"The \"Age restriction (AgeWall)\" box on the edit screen, setting a minimum age and method for a single page."}],"raw_content":"<!--section=description-->\n<p>Webkoding AgeWall adds real, server-side age verification to WordPress. Unlike simple \"click to confirm\" overlays that only hide content with CSS or JavaScript, AgeWall withholds protected content on the server: an unverified visitor never receives the restricted markup in the HTTP response, so it cannot be revealed by disabling scripts or reading the page source.<\/p>\n\n<p>Gate your whole site, or just the pages, posts and blocks that need it. Set the minimum age, choose how visitors prove it, and decide what happens when they have not \u2014 all from one settings screen.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>True server-side enforcement.<\/strong> Protected content, shortcodes and blocks are withheld before the response is sent. The gate requirement (minimum age and method) is signed and re-derived on the server, so it cannot be weakened by tampering with the request.<\/li>\n<li><strong>Whole-site gate or per-content gates.<\/strong> Gate the entire site with an overlay or a dedicated page, or gate individual pieces of content with the <code>[agewall]<\/code> shortcode and the AgeWall block.<\/li>\n<li><strong>Per-post and per-category restrictions.<\/strong> Mark any post, page, custom post type or term as age-restricted, with its own minimum age and method.<\/li>\n<li><strong>Two verification methods.<\/strong>\n\n<ul>\n<li>Confirmation (\"I am over N\") \u2014 a lightweight self-declared check.<\/li>\n<li>Date of birth (DOB) \u2014 a self-declared date, validated on the server.<\/li>\n<\/ul><\/li>\n<li><strong>Choose your enforcement.<\/strong> Withhold the content entirely (the default and the strictest), redirect to a gate page, or cover the page with an overlay when you need search engines to keep seeing it.<\/li>\n<li><strong>Search-engine friendly.<\/strong> Optionally allow known search-engine bots to bypass the gate for SEO.<\/li>\n<li><strong>Customizable gate appearance.<\/strong> Set the gate title, message and logo, and choose an overlay, modal or inline template.<\/li>\n<li><strong>No accounts, no tracking, no third-party calls.<\/strong> AgeWall stores no personal data and contacts no external service.<\/li>\n<li><strong>Translation ready.<\/strong> All strings use the <code>webkoding-agewall<\/code> text domain and a <code>languages\/webkoding-agewall.pot<\/code> template is included.<\/li>\n<\/ul>\n\n<h4>Developers<\/h4>\n\n<p>AgeWall is built to be extended. Documented hooks let you add your own verification provider (<code>agewall\/register_providers<\/code>), supply your own rule set (<code>agewall\/rules<\/code>), resolve the visitor's country (<code>agewall\/visitor_country<\/code>), observe every verification attempt (<code>agewall\/verification_attempt<\/code>), and add your own settings tabs and admin screens (<code>agewall\/settings_tabs<\/code>, <code>agewall\/admin_menu<\/code>).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>webkoding-agewall<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install the plugin through the WordPress Plugins screen.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress.<\/li>\n<li>Go to <strong>AgeWall<\/strong> in the admin menu, set your minimum age, verification method and appearance.<\/li>\n<li>(Optional) Mark individual posts, pages or terms as age-restricted from the AgeWall box on their edit screen.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20agewall%20really%20hide%20content%20from%20unverified%20visitors%2C%20or%20is%20it%20just%20a%20visual%20overlay%3F\"><h3>Does AgeWall really hide content from unverified visitors, or is it just a visual overlay?<\/h3><\/dt>\n<dd><p>It genuinely withholds the content on the server. Restricted content is never placed in the HTTP response for an unverified visitor, so it cannot be exposed by disabling JavaScript, editing CSS, or viewing the page source.<\/p>\n\n<p>This depends on the rule's action, and the difference is important: <strong>withhold<\/strong> and <strong>redirect<\/strong> are content-withholding \u2014 the protected page is never rendered or sent to an unverified visitor \u2014 and withhold is the default. <strong>Overlay<\/strong> is a soft\/SEO mode: the page still renders and is sent in the response with the gate painted over it, so use it only when you want search engines and existing rankings to keep seeing the page, not when the content must actually be withheld.<\/p><\/dd>\n<dt id=\"which%20verification%20methods%20are%20included%3F\"><h3>Which verification methods are included?<\/h3><\/dt>\n<dd><p>Confirmation (\"I am over N\") and self-declared date of birth. Both are checked on the server, and a visitor verified by the stronger method also satisfies the weaker one.<\/p><\/dd>\n<dt id=\"what%20personal%20data%20does%20agewall%20store%3F\"><h3>What personal data does AgeWall store?<\/h3><\/dt>\n<dd><p>None. AgeWall stores no personal data about your visitors, creates no database tables, and makes no third-party requests. A visitor's proof of age is held in a signed cookie that records only the scope, the minimum age and the method it was granted for \u2014 never a date of birth.<\/p><\/dd>\n<dt id=\"can%20i%20enforce%20a%20different%20age%20for%20different%20countries%3F\"><h3>Can I enforce a different age for different countries?<\/h3><\/dt>\n<dd><p>No. Every visitor is held to the same rule, which you set once in Settings. The plugin does not geolocate visitors and does not vary the minimum age by country. Developers can hook <code>agewall\/rules<\/code> and <code>agewall\/visitor_country<\/code> to match on their own criteria.<\/p><\/dd>\n<dt id=\"can%20i%20add%20my%20own%20verification%20method%3F\"><h3>Can I add my own verification method?<\/h3><\/dt>\n<dd><p>Yes. Implement <code>Agewall\\Providers\\ProviderInterface<\/code> and register it on the <code>agewall\/register_providers<\/code> action. It will appear automatically everywhere a method can be chosen.<\/p><\/dd>\n<dt id=\"is%20agewall%20translation%20ready%3F\"><h3>Is AgeWall translation ready?<\/h3><\/dt>\n<dd><p>Yes. Every user-facing string uses the <code>webkoding-agewall<\/code> text domain, and a <code>languages\/webkoding-agewall.pot<\/code> template is bundled for translators.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Renamed: the listing now says what the plugin does, not only what it is called. No functional change.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Age verification and age gate that withholds restricted content on the server \u2014 an unverified visitor never receives it.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/358829","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=358829"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/webkoding"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=358829"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=358829"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=358829"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=358829"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=358829"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=358829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}