Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.
The AnonAge plugin puts an age gate in front of your WordPress content. It works immediately with
no account, no API key and no cost.
Available now from the WordPress.org plugin directory
(version 0.6.1). Self-declaration and all three enforcement levels are in this release. Verified
mode is not enabled yet; the section below describes how it will work.
Free to start
Both self-declaration modes work with no AnonAge account at all.
Cache-safe
Nothing to configure in WP Rocket, LiteSpeed, W3TC or Cloudflare.
Keeps you findable
Gate the restricted part of a page and leave the rest indexable.
No third parties
No tracking, and the QR code is generated on your own server.
In wp-admin go to Plugins → Add New, search for AnonAge Age Verification, then install
and activate it. Or download it from
wordpress.org/plugins/anonage-age-verification.
Requires WordPress 6.0 and PHP 7.4 or newer.
2
Open the settings
Everything lives under Settings → AnonAge.
3
Choose a mode and an age
Pick how visitors prove their age, set the minimum age, and save. That is enough for a working
gate.
Everything else is detail. These two settings are independent, and getting one right and not the
other achieves nothing.
How the age is checked
How strongly it is enforced
Mode
What the visitor does
API key
Cost
Self-declaration — confirm
Clicks “I am over 18”
No
Free
Self-declaration — year of birth
Types their year of birth; only asked the month, and then the day, if the year alone does not settle it
No
Free
Verified (coming soon)
Scans a QR code with the AnonAge app, or taps through on a phone
Yes
Per verification
Self-declaration is a statement by the visitor, not a check. It is what most sites run and it
is a reasonable default, but it is not “highly effective age assurance” under the UK Online
Safety Act or its equivalents. Verified mode is.
Level
What leaves your server
Indexable
Cache setup
Cover the page
Everything
Yes
None
Hide the restricted part (recommended)
The public part only
Yes, above the marker
None
Withhold the whole page
Nothing but the gate
No
CDN rule only
Cover draws the gate over the content in the browser. The content was still delivered, so
it can be recovered with developer tools — or by turning JavaScript off, which stops the
overlay existing at all. It is a courtesy notice, not a lock, and the plugin says so.Hide the restricted part is the recommended setting and what the rest of this page assumes.
Choosing Verified with Cover the page means paying for a real identity check and then
protecting the content with an overlay a visitor removes in one click. The plugin warns you when
you save that combination. It is allowed — some sites want the check without hard gating — but it
does not enforce anything.
Every page. Simple, and the right answer for a site that is entirely age-restricted — but in
“Withhold the whole page” mode it also means search engines see nothing but the gate on every
URL.
Selected pages and posts
Tick the pages to gate. The picker shows your page hierarchy, and ticking a parent covers all
of its children — child pages are marked “gated via parent” so you can see what is covered
without having to work it out. Add posts or other post types by ID.Inheritance follows the page hierarchy rather than the URL, so it still works on sites whose
permalinks are not hierarchical.
Anything under a URL path
One path per line. A path ending in a slash covers everything beneath it, so /gated/ gates
that page and every child page under it. * works as a wildcard.
/gated//shop/spirits//reviews/*-18-*
Everything you do not list stays open and indexable.
Only 13, 16, 18 and 21 are offered. These are the thresholds the AnonAge API supports, and
keeping self-declaration on the same list means switching to verified mode later never quietly
changes the age you enforce.
Session-only, 1 hour, 24 hours (default), 7 days or 30 days.
Do not set this meanly. In verified mode every re-check spends one of the visitor’s own monthly
verifications, so a 30-minute window would exhaust an entry-tier account in a day. Anything longer
than 24 hours is flagged in the settings, because some jurisdictions expect a check per session.
Backdrop colour, opacity and blur; panel, border and button colours; logo; and a full-screen background image.
Every string the gate shows. Leave a field blank and the grey placeholder is used, which adapts to the minimum age you chose.
The background image is shown to everyone who has not passed the gate — including minors and
search engines. Suggest what the site is with branding or atmosphere, but keep the image itself
suitable for all audiences.
Bypass rules, excluded URLs and roles, and debug logging.
Leave the administrator bypass on. A gate covering the editor while you are configuring it is
the single most common cause of “the plugin broke my site”.
In “Hide the restricted part” mode, you decide where each page is cut. Put your descriptive,
keyword-carrying content above the marker and the restricted material below it.Use the [anonage_gate] shortcode, or WordPress’s own More block.
The block editor. Everything above [anonage_gate] is public and indexable; everything below it never leaves the server until the visitor has proved their age.
Without a marker the whole of the page content is withheld and only the title and excerpt remain
public — which is fine, but it wastes the page’s SEO value.
With no rejection URL set, a visitor who says no reaches a dead end rather than being bounced to another site.
The QR code carries only an opaque session reference. On a phone the visitor gets a tap-through link instead, because you cannot scan the screen you are holding.
Yes — and it is worth proving rather than asserting, because most age-gate plugins only cover the
page.Here is a gated page with developer tools open. The entire <body> is the site chrome and the
gate. The page content is not in the document at all:
Developer tools on a gated page. There is no page content to reveal.
And here is the same page with position: fixed unticked — the trick that defeats a cover-only
gate. The overlay drops away, and what is underneath is the public teaser and a notice. The
restricted content is still not there:
The overlay removed by hand. The restricted content was never sent, so there is nothing to uncover.
The restricted half is released only after the server verifies a signed cookie in PHP. Nothing the
browser can be persuaded to do changes that.
There is no way to withhold content from visitors and still have that content indexed. Serving
search engines something visitors do not get is cloaking, and it is penalised. This plugin does
not do it.What you can choose is granularity:
Split the page
Title, description and everything above the marker stay indexable and do the SEO work. Only the
restricted part is withheld.
Split the site
Gate /gated/ or a set of pages, and keep landing, category and information pages open so the
site stays findable.
“Withhold the whole page” does hide those URLs from search results, because the crawler receives
the gate and nothing else. Use it only where there is nothing safe to show.
Nothing to configure. The page sent to every visitor is byte-identical: the gate is applied in
the browser, and the restricted content is fetched separately over a request that is never
cached.
Do not add the anonage_verified cookie to a “vary the cache on this cookie” list. It
would fragment your cache for no benefit.
This decision has to be made per visitor, so PHP has to run — and on a full-page cache hit it
does not. The plugin therefore marks every gated page as uncacheable, which WP Rocket, W3
Total Cache, WP Super Cache and LiteSpeed all honour automatically. The settings screen names
any it detects on your site.
A CDN in front of your site, Cloudflare included, needs its own rule to bypass the cache on
those URLs. Without it a cached copy of the real page can be served to everyone.
For a logged-in visitor the result is recorded against their account, not just their browser,
so they verify once rather than once per device.
/** * Fires when a logged-in member clears the age gate. * * @param int $user_id User ID. * @param int $age Age threshold cleared (13|16|18|21). * @param string $mode 'self_declare' or 'verified'. */add_action( 'anonage_member_verified', function ( $user_id, $age, $mode ) { // Your own record-keeping.}, 10, 3 );
The state lives in user meta as _anonage_verified_until, _anonage_verified_age and
_anonage_verified_mode. Delete those three keys to require a member to verify again.
Not in the current release. Verified mode is switched off in 0.6.x while the production API is
being set up. This section describes how it will work, so you can plan for it.
Verified mode checks the visitor’s age against a real identity check. They scan a QR code with the
free AnonAge app and your site receives a yes or no — never their name, their date of birth or
their documents.
The Connection tab. Your secret key stays on the server; the callback URL is shown so you can confirm it is reachable.
1
Create a key
In the Dashboard → API Keys, create a key. The secret
key and its signing secret are shown once — copy both.
2
Paste them into the Connection tab
The environment badge confirms whether it is a test or live key. The signing secret is what
proves a result genuinely came from AnonAge; without it every verification is rejected.
3
Check the callback URL
Shown on the same tab. AnonAge posts each signed result there.
4
Switch the mode to Verified
On the Gate tab. Pair it with “Hide the restricted part” or “Withhold the whole page”.
visitor your site (PHP) AnonAge API │ │ │ │ click Verify │ │ │───────────────►│ POST /api/age-verification/session │ │ X-API-Key + callback_url + age │ │ │─────────────────────────────────►│ │ │◄──── { session_id, nonce } ──────│ │◄── QR payload ─│ (no key, no callback URL) │ │ │ │ │ (wallet scans and presents) │ │ │◄─── signed callback POST ────────│ │ │ verify X-AnonAge-Signature │ │ poll status │ │ │───────────────►│ │ │◄── approved ───│ set signed cookie │
Your secret key never reaches the browser
The session is opened server-side. The QR code carries only { v, session_id, nonce, api_base }
— an opaque reference that is useless to anyone but the wallet presenting it.
Results are signed and replay-resistant
The callback carries X-AnonAge-Signature: t=…,v1=…, an HMAC-SHA256 over
<timestamp>.<raw body>. The plugin verifies it against the raw request body and rejects
anything outside a five-minute window. See Webhooks for the scheme.
It works even if AnonAge cannot reach you
Plenty of sites sit behind a firewall, on a staging domain or on localhost and will never
receive an inbound callback. If none arrives within about eight seconds the plugin asks AnonAge
for the result instead, up to three times. The callback is the fast path; polling is the
reliable one.
Sessions expire in five minutes
That is the handshake window, fixed server-side — not the same thing as how long a visitor
stays through the gate. The gate shows a countdown and offers a fresh code rather than leaving
a dead QR on screen.
Sessions open on click, never on page load
Opening one per pageview would spend a verification for every visitor and every crawler. There
is also a per-visitor rate limit, adjustable with the anonage_session_rate_limit filter.
Your site must be served over HTTPS. AnonAge refuses a plaintext callback URL in production.
On a local or staging install, put it behind a tunnel such as ngrok or Cloudflare Tunnel — the
settings screen tells you when this is the problem rather than reporting a generic failure.
The age threshold cleared, and when it expires. Signed with your site’s own key (wp_salt) so it cannot be forged.
_anonage_verified_* user meta
The same, for logged-in members.
No personal data, no analytics, no tracking. The self-declaration modes make no external requests
at all.
The cookie is deliberately readable by JavaScript. The gate has to decide whether to cover the page
before it paints, and it cannot ask the server without defeating full-page caching. The signature
is what prevents forgery — and the claim itself is one the visitor made about themselves.
Administrators are exempt by default. Open the site in a private window, or turn off the
administrator bypass on the Advanced tab.
AnonAge could not accept this site as a destination
Your site is not on HTTPS. Verified mode needs an https:// callback URL.
AnonAge rejected the API key
The key was truncated when copied, or it has been revoked. Create a new one — note that this
also gives you a new signing secret, which must be updated too.
Verification never completes
Check the signing secret is present on the Connection tab. Without it every result is rejected
as unsigned. Turn on debug logging on the Advanced tab to see rejections in the PHP error log.
Some visitors see the gate and some do not
A page cache is serving mixed copies. This should not happen with the plugin’s own modes, but
it will if something else on the site varies the HTML by visitor. Do not add the
anonage_verified cookie to a cache-vary list.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"AnonAge","colors":{"primary":"#0B3D91","light":"#20D9FF","dark":"#07162E"},"logo":{"light":"https://mintcdn.com/anonage/SfpQcMSxmf90JiGs/logo/light.svg?fit=max\u0026auto=format\u0026n=SfpQcMSxmf90JiGs\u0026q=85\u0026s=738fa9a67911f4f13e28b7ff473fb064","dark":"https://mintcdn.com/anonage/SfpQcMSxmf90JiGs/logo/dark.svg?fit=max\u0026auto=format\u0026n=SfpQcMSxmf90JiGs\u0026q=85\u0026s=a3bb3501e90f504826b12fe19a4407f1","href":"https://anonage.io"},"favicon":"https://mintcdn.com/anonage/SfpQcMSxmf90JiGs/favicon.svg?fit=max\u0026auto=format\u0026n=SfpQcMSxmf90JiGs\u0026q=85\u0026s=f2602e5874b34c4855911af9cf349b5d","navbar":{"links":[{"href":"https://anonage.io","label":"Main site"},{"href":"https://anonage.io/pricing","label":"Pricing"},{"href":"https://anonage.io/support","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://anonage.io/console"}},"footer":{"socials":{"website":"https://anonage.io","linkedin":"https://www.linkedin.com/company/anonage-anonymous-age-verification","facebook":"https://www.facebook.com/profile.php?id=61592255774661"},"links":[{"header":"Product","items":[{"label":"AnonAge home","href":"https://anonage.io"},{"label":"For business","href":"https://anonage.io/business"},{"label":"For individuals","href":"https://anonage.io/personal"},{"label":"Pricing","href":"https://anonage.io/pricing"}]},{"header":"Support","items":[{"label":"Support","href":"https://anonage.io/support"},{"label":"Contact","href":"https://anonage.io/contact"},{"label":"Dashboard","href":"https://anonage.io/console"},{"label":"Mastodon","href":"https://mastodon.social/@anonage"}]},{"header":"Legal","items":[{"label":"Privacy Policy","href":"https://anonage.io/privacy"},{"label":"Terms of Service","href":"https://anonage.io/terms"},{"label":"Compliance","href":"https://anonage.io/compliance"},{"label":"Jurisdictions","href":"https://anonage.io/compliance/jurisdictions"}]}]},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"anonage","hasAudioNarration":false,"actualSubdomain":"anonage","customDomains":["docs.anonage.io"],"gitSource":{"type":"github","owner":"cclambie","repo":"anonage-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6acd7825f791b292bdee981e","collectionId":"67a93b1a-7dd6-4020-b4ec-a5e1ee44366f","liveDeploymentHistoryId":"6acd7825f791b292bdee981e","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6acd7825f791b292bdee981e","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"API Reference","count":17},{"language":"default","tag":"Endpoints","count":15},{"language":"default","tag":"Guides","count":8},{"language":"default","tag":"Auth","count":7},{"language":"default","tag":"Usage","count":4},{"language":"default","tag":"Get started","count":3},{"language":"default","tag":"Plugins","count":2},{"language":"default","tag":"Integrate","count":2},{"language":"default","tag":"Verification","count":2},{"language":"default","tag":"Overview","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"plugins/wordpress","slug":"/plugins/wordpress","pageMetadata":{"title":"WordPress","description":"Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.","href":"/plugins/wordpress"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Frame,Heading,Note,OptimizedImage,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`The AnonAge plugin puts an age gate in front of your WordPress content. It works immediately with\nno account, no API key and no cost.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Available now`}),` from the `,_jsx(_components.a,{href:`https://wordpress.org/plugins/anonage-age-verification/`,children:`WordPress.org plugin directory`}),`\n(version 0.6.1). Self-declaration and all three enforcement levels are in this release. `,_jsx(_components.strong,{children:`Verified\nmode is not enabled yet`}),`; the `,_jsx(_components.a,{href:`#verified-mode`,children:`section below`}),` describes how it will work.`]})}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Free to start`,icon:`gift`,children:_jsx(_components.p,{children:`Both self-declaration modes work with no AnonAge account at all.`})}),_jsx(Card,{title:`Cache-safe`,icon:`bolt`,children:_jsx(_components.p,{children:`Nothing to configure in WP Rocket, LiteSpeed, W3TC or Cloudflare.`})}),_jsx(Card,{title:`Keeps you findable`,icon:`magnifying-glass`,children:_jsx(_components.p,{children:`Gate the restricted part of a page and leave the rest indexable.`})}),_jsx(Card,{title:`No third parties`,icon:`shield`,children:_jsx(_components.p,{children:`No tracking, and the QR code is generated on your own server.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`install`,children:`Install`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Add the plugin`,children:_jsxs(_components.p,{children:[`In wp-admin go to `,_jsx(_components.strong,{children:`Plugins → Add New`}),`, search for `,_jsx(_components.strong,{children:`AnonAge Age Verification`}),`, then install\nand activate it. Or download it from\n`,_jsx(_components.a,{href:`https://wordpress.org/plugins/anonage-age-verification/`,children:`wordpress.org/plugins/anonage-age-verification`}),`.\nRequires WordPress 6.0 and PHP 7.4 or newer.`]})}),_jsx(Step,{title:`Open the settings`,children:_jsxs(_components.p,{children:[`Everything lives under `,_jsx(_components.strong,{children:`Settings → AnonAge`}),`.`]})}),_jsx(Step,{title:`Choose a mode and an age`,children:_jsx(_components.p,{children:`Pick how visitors prove their age, set the minimum age, and save. That is enough for a working\ngate.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`the-two-decisions-that-matter`,children:`The two decisions that matter`}),`\n`,_jsxs(_components.p,{children:[`Everything else is detail. These two settings are independent, and `,_jsx(_components.strong,{children:`getting one right and not the\nother achieves nothing`}),`.`]}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`How the age is checked`,id:`how-the-age-is-checked`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Mode`}),_jsx(_components.th,{children:`What the visitor does`}),_jsx(_components.th,{children:`API key`}),_jsx(_components.th,{children:`Cost`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Self-declaration — confirm`})}),_jsx(_components.td,{children:`Clicks “I am over 18”`}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`Free`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Self-declaration — year of birth`})}),_jsx(_components.td,{children:`Types their year of birth; only asked the month, and then the day, if the year alone does not settle it`}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`Free`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Verified`}),` (coming soon)`]}),_jsx(_components.td,{children:`Scans a QR code with the AnonAge app, or taps through on a phone`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Per verification`})]})]})]}),_jsx(_components.p,{children:`Self-declaration is a statement by the visitor, not a check. It is what most sites run and it\nis a reasonable default, but it is not “highly effective age assurance” under the UK Online\nSafety Act or its equivalents. Verified mode is.`})]}),_jsxs(Tab,{title:`How strongly it is enforced`,id:`how-strongly-it-is-enforced`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Level`}),_jsx(_components.th,{children:`What leaves your server`}),_jsx(_components.th,{children:`Indexable`}),_jsx(_components.th,{children:`Cache setup`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Cover the page`})}),_jsx(_components.td,{children:`Everything`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Hide the restricted part`}),` (recommended)`]}),_jsx(_components.td,{children:`The public part only`}),_jsx(_components.td,{children:`Yes, above the marker`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Withhold the whole page`})}),_jsx(_components.td,{children:`Nothing but the gate`}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`CDN rule only`})]})]})]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Cover`}),` draws the gate over the content in the browser. The content was still delivered, so\nit can be recovered with developer tools — or by turning JavaScript off, which stops the\noverlay existing at all. It is a courtesy notice, not a lock, and the plugin says so.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Hide the restricted part`}),` is the recommended setting and what the rest of this page assumes.`]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Choosing `,_jsx(_components.strong,{children:`Verified`}),` with `,_jsx(_components.strong,{children:`Cover the page`}),` means paying for a real identity check and then\nprotecting the content with an overlay a visitor removes in one click. The plugin warns you when\nyou save that combination. It is allowed — some sites want the check without hard gating — but it\ndoes not enforce anything.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`settings`,children:`Settings`}),`\n`,_jsx(Frame,{caption:`The Gate tab: mode, minimum age, what it applies to, enforcement level, and how long a visitor stays through.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-gate.png?fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=b6f11e1debbfff71a80b69e27d70945e`,alt:`The AnonAge Gate settings tab in WordPress`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`1748`,height:`1748`,\"data-path\":`images/wordpress/settings-gate.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-gate.png?w=280\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=2e67db7fdba8db28916d72f15eea7ca7 280w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-gate.png?w=560\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=018fd8b1cebf1791d01273a72bc542e4 560w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-gate.png?w=840\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=ab1cd51081e1dc538bbb19836b72841a 840w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-gate.png?w=1100\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=808abcadbae8a553dc099f088cc5b302 1100w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-gate.png?w=1650\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=fd22ccfc91b2a59c9ac31d19b172fc26 1650w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-gate.png?w=2500\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=0120d9ec967a8e166062a7eb127057a7 2500w`})}),`\n`,_jsx(Heading,{level:`3`,id:`choosing-what-to-gate`,children:`Choosing what to gate`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`The whole site`,icon:`globe`,id:`the-whole-site`,children:_jsx(_components.p,{children:`Every page. Simple, and the right answer for a site that is entirely age-restricted — but in\n“Withhold the whole page” mode it also means search engines see nothing but the gate on every\nURL.`})}),_jsxs(Accordion,{title:`Selected pages and posts`,icon:`list-check`,id:`selected-pages-and-posts`,children:[_jsxs(_components.p,{children:[`Tick the pages to gate. The picker shows your page hierarchy, and `,_jsx(_components.strong,{children:`ticking a parent covers all\nof its children`}),` — child pages are marked “gated via parent” so you can see what is covered\nwithout having to work it out. Add posts or other post types by ID.`]}),_jsx(_components.p,{children:`Inheritance follows the page hierarchy rather than the URL, so it still works on sites whose\npermalinks are not hierarchical.`})]}),_jsxs(Accordion,{title:`Anything under a URL path`,icon:`folder-tree`,id:`anything-under-a-url-path`,children:[_jsxs(_components.p,{children:[`One path per line. A path ending in a slash covers everything beneath it, so `,_jsx(_components.code,{children:`/gated/`}),` gates\nthat page and every child page under it. `,_jsx(_components.code,{children:`*`}),` works as a wildcard.`]}),_jsx(CodeBlock,{numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`/gated/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`/shop/spirits/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`/reviews/*-18-*`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(_components.p,{children:`Everything you do not list stays open and indexable.`})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`minimum-age`,children:`Minimum age`}),`\n`,_jsxs(_components.p,{children:[`Only `,_jsx(_components.strong,{children:`13, 16, 18 and 21`}),` are offered. These are the thresholds the AnonAge API supports, and\nkeeping self-declaration on the same list means switching to verified mode later never quietly\nchanges the age you enforce.`]}),`\n`,_jsx(Heading,{level:`3`,id:`how-long-a-visitor-stays-through`,children:`How long a visitor stays through`}),`\n`,_jsx(_components.p,{children:`Session-only, 1 hour, 24 hours (default), 7 days or 30 days.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Do not set this meanly. In verified mode every re-check spends one of the `,_jsx(_components.strong,{children:`visitor’s own`}),` monthly\nverifications, so a 30-minute window would exhaust an entry-tier account in a day. Anything longer\nthan 24 hours is flagged in the settings, because some jurisdictions expect a check per session.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`appearance-and-content`,children:`Appearance and content`}),`\n`,_jsx(Frame,{caption:`Backdrop colour, opacity and blur; panel, border and button colours; logo; and a full-screen background image.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-appearance.png?fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=f273510b13ac846f6e7a7f6e83162d82`,alt:`The AnonAge Appearance settings tab`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`1292`,height:`1292`,\"data-path\":`images/wordpress/settings-appearance.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-appearance.png?w=280\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=bf57367eb398082b30434791dd4e4347 280w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-appearance.png?w=560\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=a9332a6c6e7dbc839f2d1bb076037de9 560w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-appearance.png?w=840\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=2b5264e91ca052d4521ed6b88e3854a5 840w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-appearance.png?w=1100\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=680929ac2cddadafe86eb81a802844ef 1100w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-appearance.png?w=1650\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=0f05a6aba11d07443203012915d23db8 1650w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-appearance.png?w=2500\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=522ff0d009f6b5574010eaa339bee925 2500w`})}),`\n`,_jsx(Frame,{caption:`Every string the gate shows. Leave a field blank and the grey placeholder is used, which adapts to the minimum age you chose.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-content.png?fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=a9baa72ae4262e714a7bae5ef7ebf059`,alt:`The AnonAge Content settings tab`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`1200`,height:`1200`,\"data-path\":`images/wordpress/settings-content.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-content.png?w=280\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=e1e04da4ca73bb5a81bee116211beecf 280w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-content.png?w=560\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=37d7e72e0293cd639cb95304a09d3b39 560w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-content.png?w=840\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=87646e8307a6f2466d3cc0e5e08fdf71 840w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-content.png?w=1100\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=b8374742aa6a307e8c8d09c4eb05d5de 1100w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-content.png?w=1650\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=77ec7b1519900713d0e09c0a0fd9c5a6 1650w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-content.png?w=2500\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=0897dd97d53bc4592c15f5b45761cb49 2500w`})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The background image is shown to `,_jsx(_components.strong,{children:`everyone who has not passed the gate`}),` — including minors and\nsearch engines. Suggest what the site is with branding or atmosphere, but keep the image itself\nsuitable for all audiences.`]})}),`\n`,_jsx(Frame,{caption:`Bypass rules, excluded URLs and roles, and debug logging.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-advanced.png?fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=02b07fe0aa0a9ddd600474a7891f9293`,alt:`The AnonAge Advanced settings tab`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`1200`,height:`1200`,\"data-path\":`images/wordpress/settings-advanced.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-advanced.png?w=280\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=36c58afdd437912bb14f1bd707d71a1e 280w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-advanced.png?w=560\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=aa7e917f3e82bfa98948a5c6218efe7f 560w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-advanced.png?w=840\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=b7acf2f7f47d250a8effe50666fb1c74 840w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-advanced.png?w=1100\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=1aa77a2d18e3f2d37b630f6ff63bafb5 1100w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-advanced.png?w=1650\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=53518f69f4099e4e52f6eb83b438bc01 1650w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-advanced.png?w=2500\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=d020918e155bd08e57cdb50914ee1b98 2500w`})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Leave the administrator bypass on.`}),` A gate covering the editor while you are configuring it is\nthe single most common cause of “the plugin broke my site”.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`splitting-a-page`,children:`Splitting a page`}),`\n`,_jsx(_components.p,{children:`In “Hide the restricted part” mode, you decide where each page is cut. Put your descriptive,\nkeyword-carrying content above the marker and the restricted material below it.`}),`\n`,_jsxs(_components.p,{children:[`Use the `,_jsx(_components.strong,{children:_jsx(_components.code,{children:`[anonage_gate]`})}),` shortcode, or WordPress’s own `,_jsx(_components.strong,{children:`More`}),` block.`]}),`\n`,_jsx(Frame,{caption:`The block editor. Everything above [anonage_gate] is public and indexable; everything below it never leaves the server until the visitor has proved their age.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/editor-split-marker.png?fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=e4ef9a2fc030909735f1597aa805fc9e`,alt:`A WordPress page in the block editor with the anonage_gate shortcode dividing public content from restricted content`,\"data-og-width\":`1857`,width:`1857`,\"data-og-height\":`1901`,height:`1901`,\"data-path\":`images/wordpress/editor-split-marker.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/editor-split-marker.png?w=280\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=06c196da6686061006fd15588b8e641f 280w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/editor-split-marker.png?w=560\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=f3ec2c2a5d235b23ed0ea0a3f1e704e3 560w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/editor-split-marker.png?w=840\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=3eac8624ff502811798bcbf9a674354b 840w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/editor-split-marker.png?w=1100\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=d05c2c6f1f5b4cdcf2ccfbe40bad9ce0 1100w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/editor-split-marker.png?w=1650\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=400b7a8886094c718b971e98a7c51c32 1650w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/editor-split-marker.png?w=2500\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=8a466491d4ab6bacc921cae2d83399f4 2500w`})}),`\n`,_jsx(_components.p,{children:`Without a marker the whole of the page content is withheld and only the title and excerpt remain\npublic — which is fine, but it wastes the page’s SEO value.`}),`\n`,_jsx(Heading,{level:`2`,id:`what-the-visitor-sees`,children:`What the visitor sees`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Self-declaration`,id:`self-declaration`,children:_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-confirm.png?fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=54b2289a44bac5908d93cb28f6203cae`,alt:`The AnonAge age gate asking Are you 21 or over`,\"data-og-width\":`1857`,width:`1857`,\"data-og-height\":`1901`,height:`1901`,\"data-path\":`images/wordpress/gate-confirm.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-confirm.png?w=280\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=594acbcec00d4056a3b256176048c202 280w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-confirm.png?w=560\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=823ba724d5dab80c12f00430e5e09dfd 560w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-confirm.png?w=840\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=568dd29305d33232fbf12f973adfa008 840w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-confirm.png?w=1100\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=9e3bd7bd39aca038bf0694abc0223a80 1100w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-confirm.png?w=1650\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=a76e95c2a0b0caed6042c331f35456c2 1650w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-confirm.png?w=2500\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=404e15e1fbf4b754101a6b9ac3cafa14 2500w`})})}),_jsx(Tab,{title:`Declined`,id:`declined`,children:_jsx(Frame,{caption:`With no rejection URL set, a visitor who says no reaches a dead end rather than being bounced to another site.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-declined.png?fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=b950d5d83ca608242a957b57c3bec20e`,alt:`The age gate showing a rejection message`,\"data-og-width\":`1857`,width:`1857`,\"data-og-height\":`1901`,height:`1901`,\"data-path\":`images/wordpress/gate-declined.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-declined.png?w=280\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=5f85e91abe7a9a2861b80baf17cef18e 280w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-declined.png?w=560\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=20082013a62596b97e4a9a5dc82a2533 560w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-declined.png?w=840\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=1277f9ef671f3ec147584055b29db84a 840w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-declined.png?w=1100\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=d711e6455fb3f2a34315f03ea08e91ad 1100w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-declined.png?w=1650\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=b2dc92bc48896c9111269a66a2488744 1650w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-declined.png?w=2500\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=669eda1a3e3682a3aa031a3aa765d7f7 2500w`})})}),_jsx(Tab,{title:`Verified mode`,id:`verified-mode`,children:_jsx(Frame,{caption:`The QR code carries only an opaque session reference. On a phone the visitor gets a tap-through link instead, because you cannot scan the screen you are holding.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-verified-qr.png?fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=5f34dacd51f4303f6a6939bebe08467e`,alt:`The age gate showing a QR code to scan with the AnonAge app`,\"data-og-width\":`1857`,width:`1857`,\"data-og-height\":`1901`,height:`1901`,\"data-path\":`images/wordpress/gate-verified-qr.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-verified-qr.png?w=280\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=74022d898f99dd0cdaa1c65faf80eb56 280w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-verified-qr.png?w=560\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=952982710df90b2a32c630f0a996dc0f 560w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-verified-qr.png?w=840\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=08b1d065e51974270856be191005ab34 840w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-verified-qr.png?w=1100\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=3ba5533d93a92edd710eb8867b0e17f8 1100w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-verified-qr.png?w=1650\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=da9a0f9b648e62791bc4d3ede8156acd 1650w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-verified-qr.png?w=2500\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=fde0936dd30b8c7d669572cd82dd8090 2500w`})})}),_jsx(Tab,{title:`Through the gate`,id:`through-the-gate`,children:_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-passed.png?fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=60c7e9232f8148c344e3fcd6cc98d54f`,alt:`The page with its restricted content visible after passing the age gate`,\"data-og-width\":`1857`,width:`1857`,\"data-og-height\":`1901`,height:`1901`,\"data-path\":`images/wordpress/gate-passed.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-passed.png?w=280\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=5b490a1ffc37a749f3c0d1b514c57e1f 280w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-passed.png?w=560\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=df8762e49d07749ec8bb765b98d1df50 560w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-passed.png?w=840\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=c0d7a71ae73525dc46546c82dc2c7406 840w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-passed.png?w=1100\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=ea79b7e129b803e755345309c62b4631 1100w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-passed.png?w=1650\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=7ab7e4d82ffd13ef7298ad8484676b5e 1650w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/gate-passed.png?w=2500\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=e799e4c6632377d92c205aac0c748d97 2500w`})})})]}),`\n`,_jsx(Heading,{level:`2`,id:`does-it-actually-withhold-the-content`,children:`Does it actually withhold the content?`}),`\n`,_jsx(_components.p,{children:`Yes — and it is worth proving rather than asserting, because most age-gate plugins only cover the\npage.`}),`\n`,_jsxs(_components.p,{children:[`Here is a gated page with developer tools open. The entire `,_jsx(_components.code,{children:`\u003cbody>`}),` is the site chrome and the\ngate. The page content is not in the document at all:`]}),`\n`,_jsx(Frame,{caption:`Developer tools on a gated page. There is no page content to reveal.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-source.png?fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=5af561b6c9c81594c1b7ca40314aa067`,alt:`Browser developer tools showing that the gated page contains no restricted content`,\"data-og-width\":`1857`,width:`1857`,\"data-og-height\":`1901`,height:`1901`,\"data-path\":`images/wordpress/devtools-source.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-source.png?w=280\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=c6edbf51e8f52de19e6b0478fe0fb9ad 280w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-source.png?w=560\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=08672244837484725a72cab2806a5762 560w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-source.png?w=840\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=a600985cd99127766cd55cc586abdc08 840w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-source.png?w=1100\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=c1217f76eeac349c3304538f1ec57bd3 1100w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-source.png?w=1650\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=943558385652d9e2eca06a775475ec22 1650w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-source.png?w=2500\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=16e6df33f39ccc02795d11b7243090e3 2500w`})}),`\n`,_jsxs(_components.p,{children:[`And here is the same page with `,_jsx(_components.code,{children:`position: fixed`}),` unticked — the trick that defeats a cover-only\ngate. The overlay drops away, and what is underneath is the public teaser and a notice. The\nrestricted content is still not there:`]}),`\n`,_jsx(Frame,{caption:`The overlay removed by hand. The restricted content was never sent, so there is nothing to uncover.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-overlay-removed.png?fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=5cb90918f57f45c31e5677987263be90`,alt:`The overlay removed in developer tools, revealing only the public teaser and a notice`,\"data-og-width\":`1857`,width:`1857`,\"data-og-height\":`1901`,height:`1901`,\"data-path\":`images/wordpress/devtools-overlay-removed.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-overlay-removed.png?w=280\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=1ef3f81f7d3f489ed69bf4fbd7a6f59f 280w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-overlay-removed.png?w=560\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=e45fb880c44b14062fffe9add068154f 560w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-overlay-removed.png?w=840\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=8ed97d6882d25452514380bd2dcd890c 840w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-overlay-removed.png?w=1100\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=54c8310cab7d19e3acd26f4a2755d767 1100w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-overlay-removed.png?w=1650\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=8206a30852993ad6bb5c33e306f0d031 1650w, https://mintcdn.com/anonage/nBREE_8b1cdl6jc5/images/wordpress/devtools-overlay-removed.png?w=2500\u0026fit=max\u0026auto=format\u0026n=nBREE_8b1cdl6jc5\u0026q=85\u0026s=496f7fcbf05dd8e4a02ec57293f8c4ab 2500w`})}),`\n`,_jsx(_components.p,{children:`The restricted half is released only after the server verifies a signed cookie in PHP. Nothing the\nbrowser can be persuaded to do changes that.`}),`\n`,_jsx(Heading,{level:`2`,id:`search-engines`,children:`Search engines`}),`\n`,_jsxs(_components.p,{children:[`There is no way to withhold content from visitors and still have that content indexed. Serving\nsearch engines something visitors do not get is `,_jsx(_components.strong,{children:`cloaking`}),`, and it is penalised. This plugin does\nnot do it.`]}),`\n`,_jsx(_components.p,{children:`What you can choose is granularity:`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Split the page`,icon:`scissors`,children:_jsx(_components.p,{children:`Title, description and everything above the marker stay indexable and do the SEO work. Only the\nrestricted part is withheld.`})}),_jsx(Card,{title:`Split the site`,icon:`sitemap`,children:_jsxs(_components.p,{children:[`Gate `,_jsx(_components.code,{children:`/gated/`}),` or a set of pages, and keep landing, category and information pages open so the\nsite stays findable.`]})})]}),`\n`,_jsx(_components.p,{children:`“Withhold the whole page” does hide those URLs from search results, because the crawler receives\nthe gate and nothing else. Use it only where there is nothing safe to show.`}),`\n`,_jsx(Heading,{level:`2`,id:`caching`,children:`Caching`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Cover / Hide the restricted part`,id:`cover-%2F-hide-the-restricted-part`,children:[_jsx(_components.p,{children:`Nothing to configure. The page sent to every visitor is byte-identical: the gate is applied in\nthe browser, and the restricted content is fetched separately over a request that is never\ncached.`}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Do `,_jsx(_components.strong,{children:`not`}),` add the `,_jsx(_components.code,{children:`anonage_verified`}),` cookie to a “vary the cache on this cookie” list. It\nwould fragment your cache for no benefit.`]})})]}),_jsxs(Tab,{title:`Withhold the whole page`,id:`withhold-the-whole-page`,children:[_jsxs(_components.p,{children:[`This decision has to be made per visitor, so PHP has to run — and on a full-page cache hit it\ndoes not. The plugin therefore marks every gated page as uncacheable, which `,_jsx(_components.strong,{children:`WP Rocket, W3\nTotal Cache, WP Super Cache and LiteSpeed`}),` all honour automatically. The settings screen names\nany it detects on your site.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`A CDN in front of your site, `,_jsx(_components.strong,{children:`Cloudflare included`}),`, needs its own rule to bypass the cache on\nthose URLs. Without it a cached copy of the real page can be served to everyone.`]})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`membership-sites`,children:`Membership sites`}),`\n`,_jsxs(_components.p,{children:[`For a logged-in visitor the result is recorded against their `,_jsx(_components.strong,{children:`account`}),`, not just their browser,\nso they verify once rather than once per device.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`/**`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` * Fires when a logged-in member clears the age gate.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` *`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` * `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`@param`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` int`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` $user_id User ID.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` * `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`@param`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` int`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` $age Age threshold cleared (13|16|18|21).`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` * `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`@param`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` string`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` $mode 'self_declare' or 'verified'.`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` */`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`add_action`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`( `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'anonage_member_verified'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ( `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$user_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$age`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$mode`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Your own record-keeping.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`10`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` );`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The state lives in user meta as `,_jsx(_components.code,{children:`_anonage_verified_until`}),`, `,_jsx(_components.code,{children:`_anonage_verified_age`}),` and\n`,_jsx(_components.code,{children:`_anonage_verified_mode`}),`. Delete those three keys to require a member to verify again.`]}),`\n`,_jsx(Heading,{level:`2`,id:`verified-mode`,children:`Verified mode`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Not in the current release.`}),` Verified mode is switched off in 0.6.x while the production API is\nbeing set up. This section describes how it will work, so you can plan for it.`]})}),`\n`,_jsx(_components.p,{children:`Verified mode checks the visitor’s age against a real identity check. They scan a QR code with the\nfree AnonAge app and your site receives a yes or no — never their name, their date of birth or\ntheir documents.`}),`\n`,_jsx(Frame,{caption:`The Connection tab. Your secret key stays on the server; the callback URL is shown so you can confirm it is reachable.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-connection.png?fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=2522ca70e7e7a3b2197c05f98a4640da`,alt:`The AnonAge Connection settings tab`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`1200`,height:`1200`,\"data-path\":`images/wordpress/settings-connection.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-connection.png?w=280\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=d844b049adfad4dc98aa0252191c80c8 280w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-connection.png?w=560\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=c3c89f0843af7603ec8b9b110b403233 560w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-connection.png?w=840\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=316f472889f5937604419e6accecf10f 840w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-connection.png?w=1100\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=5d15a4e44a10eada978770caa749df96 1100w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-connection.png?w=1650\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=a9db2cc5a40f3e816452975731e6d6cb 1650w, https://mintcdn.com/anonage/FSfiJtuBLhW9zvWq/images/wordpress/settings-connection.png?w=2500\u0026fit=max\u0026auto=format\u0026n=FSfiJtuBLhW9zvWq\u0026q=85\u0026s=0ab757c3c8ff706049cf30afd9729174 2500w`})}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Create a key`,children:_jsxs(_components.p,{children:[`In the `,_jsx(_components.a,{href:`https://anonage.io/console/keys`,children:`Dashboard`}),` → `,_jsx(_components.strong,{children:`API Keys`}),`, create a key. The `,_jsx(_components.strong,{children:`secret\nkey`}),` and its `,_jsx(_components.strong,{children:`signing secret`}),` are shown once — copy both.`]})}),_jsx(Step,{title:`Paste them into the Connection tab`,children:_jsx(_components.p,{children:`The environment badge confirms whether it is a test or live key. The signing secret is what\nproves a result genuinely came from AnonAge; without it every verification is rejected.`})}),_jsx(Step,{title:`Check the callback URL`,children:_jsx(_components.p,{children:`Shown on the same tab. AnonAge posts each signed result there.`})}),_jsx(Step,{title:`Switch the mode to Verified`,children:_jsx(_components.p,{children:`On the Gate tab. Pair it with “Hide the restricted part” or “Withhold the whole page”.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`how-it-works`,children:`How it works`}),`\n`,_jsx(CodeBlock,{numberOfLines:`16`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`16`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`visitor your site (PHP) AnonAge API`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ │ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ click Verify │ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │───────────────►│ POST /api/age-verification/session`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ │ X-API-Key + callback_url + age │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ │─────────────────────────────────►│`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ │◄──── { session_id, nonce } ──────│`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │◄── QR payload ─│ (no key, no callback URL) │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ │ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ (wallet scans and presents) │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ │◄─── signed callback POST ────────│`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ │ verify X-AnonAge-Signature │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │ poll status │ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │───────────────►│ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` │◄── approved ───│ set signed cookie │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Your secret key never reaches the browser`,icon:`key`,id:`your-secret-key-never-reaches-the-browser`,children:_jsxs(_components.p,{children:[`The session is opened server-side. The QR code carries only `,_jsx(_components.code,{children:`{ v, session_id, nonce, api_base }`}),`\n— an opaque reference that is useless to anyone but the wallet presenting it.`]})}),_jsx(Accordion,{title:`Results are signed and replay-resistant`,icon:`signature`,id:`results-are-signed-and-replay-resistant`,children:_jsxs(_components.p,{children:[`The callback carries `,_jsx(_components.code,{children:`X-AnonAge-Signature: t=…,v1=…`}),`, an HMAC-SHA256 over\n`,_jsx(_components.code,{children:`\u003ctimestamp>.\u003craw body>`}),`. The plugin verifies it against the `,_jsx(_components.strong,{children:`raw`}),` request body and rejects\nanything outside a five-minute window. See `,_jsx(_components.a,{href:`/webhooks`,children:`Webhooks`}),` for the scheme.`]})}),_jsx(Accordion,{title:`It works even if AnonAge cannot reach you`,icon:`tower-broadcast`,id:`it-works-even-if-anonage-cannot-reach-you`,children:_jsx(_components.p,{children:`Plenty of sites sit behind a firewall, on a staging domain or on localhost and will never\nreceive an inbound callback. If none arrives within about eight seconds the plugin asks AnonAge\nfor the result instead, up to three times. The callback is the fast path; polling is the\nreliable one.`})}),_jsx(Accordion,{title:`Sessions expire in five minutes`,icon:`clock`,id:`sessions-expire-in-five-minutes`,children:_jsx(_components.p,{children:`That is the handshake window, fixed server-side — not the same thing as how long a visitor\nstays through the gate. The gate shows a countdown and offers a fresh code rather than leaving\na dead QR on screen.`})}),_jsx(Accordion,{title:`Sessions open on click, never on page load`,icon:`hand-pointer`,id:`sessions-open-on-click-never-on-page-load`,children:_jsxs(_components.p,{children:[`Opening one per pageview would spend a verification for every visitor and every crawler. There\nis also a per-visitor rate limit, adjustable with the `,_jsx(_components.code,{children:`anonage_session_rate_limit`}),` filter.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`requirements`,children:`Requirements`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Your site must be served over HTTPS.`}),` AnonAge refuses a plaintext callback URL in production.\nOn a local or staging install, put it behind a tunnel such as ngrok or Cloudflare Tunnel — the\nsettings screen tells you when this is the problem rather than reporting a generic failure.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`reference`,children:`Reference`}),`\n`,_jsx(Heading,{level:`3`,id:`shortcode`,children:`Shortcode`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`[anonage_gate]`})}),_jsx(_components.td,{children:`Marks the split point. Everything after it is withheld.`})]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`filters-and-actions`,children:`Filters and actions`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Hook`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`anonage_should_gate`})}),_jsx(_components.td,{children:`filter`}),_jsx(_components.td,{children:`Override the gating decision for the current request.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`anonage_session_rate_limit`})}),_jsx(_components.td,{children:`filter`}),_jsxs(_components.td,{children:[`Sessions allowed per visitor per window. Default `,_jsx(_components.code,{children:`10`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`anonage_session_rate_window`})}),_jsx(_components.td,{children:`filter`}),_jsxs(_components.td,{children:[`The window, in seconds. Default `,_jsx(_components.code,{children:`600`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`anonage_member_verified`})}),_jsx(_components.td,{children:`action`}),_jsx(_components.td,{children:`A logged-in member cleared the gate.`})]})]})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Never gate a specific landing page, whatever the settings say.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`add_filter`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`( `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'anonage_should_gate'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ( `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$should_gate`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` is_page`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`( `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'welcome'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` :`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $should_gate`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} );`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`what-is-stored`,children:`What is stored`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`anonage_verified`}),` cookie`]}),_jsxs(_components.td,{children:[`The age threshold cleared, and when it expires. Signed with your site’s own key (`,_jsx(_components.code,{children:`wp_salt`}),`) so it cannot be forged.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`_anonage_verified_*`}),` user meta`]}),_jsx(_components.td,{children:`The same, for logged-in members.`})]})]})]}),`\n`,_jsx(_components.p,{children:`No personal data, no analytics, no tracking. The self-declaration modes make no external requests\nat all.`}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`The cookie is deliberately readable by JavaScript. The gate has to decide whether to cover the page\nbefore it paints, and it cannot ask the server without defeating full-page caching. The signature\nis what prevents forgery — and the claim itself is one the visitor made about themselves.`})}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`I cannot see the gate on my own site`,id:`i-cannot-see-the-gate-on-my-own-site`,children:_jsx(_components.p,{children:`Administrators are exempt by default. Open the site in a private window, or turn off the\nadministrator bypass on the Advanced tab.`})}),_jsx(Accordion,{title:`AnonAge could not accept this site as a destination`,id:`anonage-could-not-accept-this-site-as-a-destination`,children:_jsxs(_components.p,{children:[`Your site is not on HTTPS. Verified mode needs an `,_jsx(_components.code,{children:`https://`}),` callback URL.`]})}),_jsx(Accordion,{title:`AnonAge rejected the API key`,id:`anonage-rejected-the-api-key`,children:_jsx(_components.p,{children:`The key was truncated when copied, or it has been revoked. Create a new one — note that this\nalso gives you a new signing secret, which must be updated too.`})}),_jsx(Accordion,{title:`Verification never completes`,id:`verification-never-completes`,children:_jsx(_components.p,{children:`Check the signing secret is present on the Connection tab. Without it every result is rejected\nas unsigned. Turn on debug logging on the Advanced tab to see rejections in the PHP error log.`})}),_jsx(Accordion,{title:`Some visitors see the gate and some do not`,id:`some-visitors-see-the-gate-and-some-do-not`,children:_jsxs(_components.p,{children:[`A page cache is serving mixed copies. This should not happen with the plugin’s own modes, but\nit will if something else on the site varies the HTML by visitor. Do not add the\n`,_jsx(_components.code,{children:`anonage_verified`}),` cookie to a cache-vary list.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`questions`,children:`Questions`}),`\n`,_jsxs(_components.p,{children:[`Email `,_jsx(_components.a,{href:`mailto:support@anonage.io`,children:`support@anonage.io`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"WordPress","description":"Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.","href":"/plugins/wordpress"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Install","slug":"install","depth":2,"children":[]},{"title":"The two decisions that matter","slug":"the-two-decisions-that-matter","depth":2,"children":[]},{"title":"Settings","slug":"settings","depth":2,"children":[{"title":"Choosing what to gate","slug":"choosing-what-to-gate","depth":3,"children":[]},{"title":"Minimum age","slug":"minimum-age","depth":3,"children":[]},{"title":"How long a visitor stays through","slug":"how-long-a-visitor-stays-through","depth":3,"children":[]},{"title":"Appearance and content","slug":"appearance-and-content","depth":3,"children":[]}]},{"title":"Splitting a page","slug":"splitting-a-page","depth":2,"children":[]},{"title":"What the visitor sees","slug":"what-the-visitor-sees","depth":2,"children":[]},{"title":"Does it actually withhold the content?","slug":"does-it-actually-withhold-the-content","depth":2,"children":[]},{"title":"Search engines","slug":"search-engines","depth":2,"children":[]},{"title":"Caching","slug":"caching","depth":2,"children":[]},{"title":"Membership sites","slug":"membership-sites","depth":2,"children":[]},{"title":"Verified mode","slug":"verified-mode","depth":2,"children":[{"title":"How it works","slug":"how-it-works","depth":3,"children":[]},{"title":"Requirements","slug":"requirements","depth":3,"children":[]}]},{"title":"Reference","slug":"reference","depth":2,"children":[{"title":"Shortcode","slug":"shortcode","depth":3,"children":[]},{"title":"Filters and actions","slug":"filters-and-actions","depth":3,"children":[]},{"title":"What is stored","slug":"what-is-stored","depth":3,"children":[]}]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Questions","slug":"questions","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"anonage","siteName":"AnonAge","title":"WordPress - AnonAge","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-13T00:15:37.974Z","originalFileLocation":"plugins/wordpress.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.\">\u003cmeta data-mint-head name=\"application-name\" content=\"AnonAge\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"WordPress - AnonAge\">\u003cmeta data-mint-head property=\"og:description\" content=\"Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"AnonAge\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.anonage.io/plugins/wordpress\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://anonage.mintlify.app/_mintlify/api/og/v2?division=Plugins\u0026amp;title=WordPress\u0026amp;description=Put+an+age+gate+on+any+WordPress+site+%E2%80%94+free+self-declaration+from+the+WordPress.org+plugin+directory%2C+with+identity-backed+checks+to+follow.\u0026amp;theme=dff5ffdfa87bdaaad2763e65\u0026amp;signature=0c3fa8e3b68719dff80453f2ff0d328340d18601460c40f4e70f6f82d9b724df\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"WordPress - AnonAge\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://anonage.mintlify.app/_mintlify/api/og/v2?division=Plugins\u0026amp;title=WordPress\u0026amp;description=Put+an+age+gate+on+any+WordPress+site+%E2%80%94+free+self-declaration+from+the+WordPress.org+plugin+directory%2C+with+identity-backed+checks+to+follow.\u0026amp;theme=dff5ffdfa87bdaaad2763e65\u0026amp;signature=0c3fa8e3b68719dff80453f2ff0d328340d18601460c40f4e70f6f82d9b724df\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/anonage/yi2obQKlfXdUyrlG/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"AnonAge\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0B3D91\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.anonage.io/plugins/wordpress\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/plugins/wordpress.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.anonage.io/#organization\",\"name\":\"AnonAge\",\"url\":\"https://docs.anonage.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/anonage/SfpQcMSxmf90JiGs/logo/light.svg?fit=max\u0026auto=format\u0026n=SfpQcMSxmf90JiGs\u0026q=85\u0026s=738fa9a67911f4f13e28b7ff473fb064\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.anonage.io#website\",\"name\":\"AnonAge\",\"url\":\"https://docs.anonage.io\",\"publisher\":{\"@id\":\"https://docs.anonage.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.anonage.io/plugins/wordpress#webpage\",\"url\":\"https://docs.anonage.io/plugins/wordpress\",\"name\":\"WordPress\",\"description\":\"Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.\",\"dateModified\":\"2026-10-13T00:15:37.974Z\",\"isPartOf\":{\"@id\":\"https://docs.anonage.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.anonage.io/plugins/wordpress#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.anonage.io/plugins/wordpress#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"AnonAge\",\"item\":\"https://docs.anonage.io\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress\",\"item\":\"https://docs.anonage.io/plugins/wordpress\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.anonage.io/plugins/wordpress#article\",\"headline\":\"WordPress\",\"name\":\"WordPress\",\"description\":\"Put an age gate on any WordPress site — free self-declaration from the WordPress.org plugin directory, with identity-backed checks to follow.\",\"url\":\"https://docs.anonage.io/plugins/wordpress\",\"mainEntityOfPage\":{\"@id\":\"https://docs.anonage.io/plugins/wordpress#webpage\"},\"dateModified\":\"2026-10-13T00:15:37.974Z\",\"publisher\":{\"@id\":\"https://docs.anonage.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.anonage.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"AnonAge\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"AnonAge","nav":{"global":null,"tabs":[{"tab":"Guides","groups":[{"group":"Get started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"}]},{"group":"Transparency","pages":[{"title":"Data handling and transparency","href":"/transparency"}]},{"group":"Integrate","pages":[{"title":"Callbacks","href":"/webhooks"},{"title":"Testing","description":"Exercise the full loop before you go live.","href":"/testing"}]},{"group":"Plugins","pages":[{"title":"WordPress","href":"/plugins/wordpress"},{"title":"Shopify","description":"Add an AnonAge age gate to your Shopify store — no code.","href":"/plugins/shopify"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]}]},"basePath":"","title":"WordPress - AnonAge","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["07c022d89b","a74be98ba7","a9bb46feb3"],"chunks":["Frame-DXXFP6nH.js","DynamicMarkdown-B54_zNBF.js","zoom-image-lightbox-BG6oD64b.js","lightbox-handle-r17bVUz3.js","Markdown-DfhCTwyA.js","clsx-xpJZXxdP.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BTZUMDnx.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DqdKa2R4.js"]}