500+
October 22, 2026
June 8, 2026
Visibility is the SEO essentials in one light plugin: meta tags, canonical URLs, Open Graph, schema, robots rules, redirects, a robots.txt editor, llms.txt, Markdown for AI agents and control of the native XML sitemap, in about 505 KB.
Discover: meta tags, schema and AI discovery
[visibility_author_details] shortcode. Each author can pick a page as their profile page.Indexing: noindex and clean URLs
data-nosnippet, from the block editor or the classic editor.Sitemaps: control of the native XML sitemap
/wp-sitemap.xml answering 200 on a site with no blog posts, which older WordPress versions got wrong.Redirects: 301, 302, 307 and 410
Visibility works on its own. These plugins pair well with it:
robots.txt.This plugin connects to Gravatar (operated by Automattic Inc.) to check whether an author has a public avatar, so it can be used in Open Graph (og:image) and in Person schema (image).
https://www.gravatar.com/avatar/{hash}?d=404. The email address itself is never sent.It is the same lookup WordPress uses for comment avatars. Gravatar’s privacy policy: https://automattic.com/privacy/
“Lightweight” should be a measurement, not a slogan. These are the real numbers for this release, refreshed on every update.
wp_robots, wp_sitemaps_*, register_post_meta, get_canonical_url, the Block Editor).The same clean WordPress, the same theme and the same 30 posts, with one SEO plugin active at a time on its default settings. Each figure is what that plugin adds to WordPress with no SEO plugin. Measured in October 2026 on the current release of each one, on a single machine: what carries over to your site is the order, not the exact figure.
Need private support or custom development?
Do you need one-on-one help, priority troubleshooting, or a custom feature, integration, or tweak built specifically for your site? I offer private support and custom development. Just contact me and tell me what you need.
Need help or have suggestions?
Love the plugin? Please leave us a 5-star review and help spread the word!
We are specialists in WordPress security, SEO, AI and performance optimization plugins. We create tools that solve real problems for WordPress site owners while maintaining the highest coding standards and accessibility requirements.
native-aeo-pack folder to /wp-content/plugins/ or install through the Plugins screen.For most sites, yes. It covers titles, meta descriptions, canonical URLs, Open Graph, schema, robots rules, redirects and the sitemap, and it imports your data from those plugins in one click.
It has no keyword analysis or content scoring. If you need those, keep your current plugin: Visibility is not meant to run alongside another SEO plugin.
What to expect:
%%title%% are converted. One that needs a custom field or a date is left where it is.Install and activate Visibility, open the Tools tab and click Import now. The import copies your data and never deletes it, and what you already set in Visibility is kept. Then deactivate the old plugins.
It is free. There is no Pro version, no add-ons and no upsell banners. Everything on this page is in the plugin you download, including the redirects, the importers, the WooCommerce URL structures and the AI discovery files. No account and no license key.
It is built not to: no database tables of its own, no cron jobs and no external calls apart from a cached Gravatar check. Most of the work is done by WordPress core functions. The numbers of each release are in “Performance and security”.
No. There is no telemetry, no usage analytics and no account. The only outside request it can make is the cached Gravatar check described in “External services”, which sends a hash of the author email and never the address.
No. Settings live in one WordPress option, and per-post, per-term and per-user values in native WordPress meta. Deleting the plugin removes the option and keeps those values, so reinstalling does not lose your work.
Yes. The Overview tab switches Discover, Indexing, Sitemaps and Redirects on and off independently.
AEO (answer engine optimization) and GEO (generative engine optimization) mean being found, understood and cited by AI assistants such as ChatGPT, Perplexity, Claude and Google’s AI answers.
Nobody outside those companies knows exactly how they choose their sources, so Visibility works on what you can check yourself:
No plugin can promise you a citation.
It gives AI search and assistants clean signals to read:
.md URL.The companion plugin VigIA shows which AI crawlers actually visit.
Yes, on WordPress 6.9 or later, which is where the Abilities API arrived. Visibility registers six abilities with it, and any client finds them: the WordPress MCP Adapter, Novamira and others.
An agent can do no more than the user it is signed in as: each ability asks for the same permission as the editor. Visibility adds no server, endpoint or API key of its own.
To switch them off, untick the box in Visibility > Overview > AI agents.
Yes, both, generated on the fly from your content, so there is nothing to regenerate when you publish:
/llms.txt: a Markdown index of your site, by content type and taxonomy, with WooCommerce-aware entries./llms-full.txt: the long version..md URL.Both files are kept in wp-content/uploads/native-aeo-pack/, one per language, and rebuilt on the first request after a change. With the physical file option on, your server has to pass /llms.txt to WordPress when the file is missing.
Keep expectations realistic: llms.txt is a proposed convention, not a standard. Google has said it ignores it and no major AI vendor has confirmed support.
Yes, as a single JSON-LD graph, with per-post and per-term overrides:
It does not add Recipe, Product, Event or HowTo. Those need data that the plugins owning it already mark up, such as WooCommerce for Product.
Yes. In Discover > Site Identity pick Local business as the entity type:
Google lists the address as required for a local business. The settings screen warns you when it is missing.
It is one node on the home page, shared with the rest of the schema. It is not a store locator and it does not manage reviews.
Visibility describes one business. Give each other location a page of its own and add its node there with the native_aeo_pack_schema_graph filter:
add_filter( 'native_aeo_pack_schema_graph', function ( $graph, $context, $post ) {
if ( 'article' === $context && $post && 'riverside' === $post->post_name ) {
$graph[] = array(
'@type' => 'Restaurant',
'@id' => get_permalink( $post ) . '#business',
'name' => 'Casa Marta Riverside',
'url' => get_permalink( $post ),
'address' => array(
'@type' => 'PostalAddress',
'streetAddress' => 'Calle del Río, 3',
'addressLocality' => 'Segovia',
'addressCountry' => 'ES',
),
'parentOrganization' => array( '@id' => home_url( '/#identity' ) ),
);
}
return $graph;
}, 10, 3 );
Google asks for each location to be a LocalBusiness of its own, with the address of its page in url.
In Discover > Site Identity:
Both go in the WebSite markup of the home page, which is where Google reads the site name from. That markup stays on the home page when you print the identity on another page.
The test only lists an organization that carries a contact detail. Add an email or a phone in Discover > Site Identity and it shows up.
Without one, the markup is still valid and Google still reads the name, the logo and the profiles. You can see it in the page source or in validator.schema.org.
Yes, at three levels:
None adds no Article, BreadcrumbList or FAQPage to that content. Site Identity is a separate setting and keeps working. Developers can also use the native_aeo_pack_schema_graph filter.
Yes. The author archive of anyone with at least one published post gets a ProfilePage with their Person: job title, topics, credentials and profiles.
An author can also pick a page, such as About me, as their profile page, and that page becomes their ProfilePage. The Author details block or the [visibility_author_details] shortcode shows those fields on the page.
Yes. It customizes the sitemap WordPress already generates at /wp-sitemap.xml, so there is no second sitemap, no cache to clear and nothing to rebuild:
sitemap.xml, post-sitemap.xml) are 301-redirected to the native one.Because it answers with a 404 status while showing the right file, and Google discards any sitemap that does not answer 200. It happens on sites with no published blog posts: a shop, a portfolio, a site made of pages only.
Whether it affects you depends on your WordPress version: it was fixed in WordPress 7.1.1, from a report that came out of this plugin. On older versions, Visibility answers /wp-sitemap.xml with a 200 itself, with a switch for it in the Sitemaps tab. A sitemap with nothing in it still answers 404, as it should.
Something has switched off the sitemap WordPress generates, so the old address has nowhere to go. The usual causes:
wp_sitemaps_enabled to false, in functions.php or in a snippets plugin.Visibility checks before redirecting and leaves the old address alone in that case.
Redirects are included and you need neither:
.htaccess editing and no custom table.It does not log 404 errors, on purpose: that needs a table and a cleanup job. The companion plugin VigIA records the 404s that crawlers hit.
Yes. Its Meta Description Generation experiment saves the description it writes in the Meta description field of Visibility, so the page prints one meta description and not two. The descriptions it was printing on its own are copied to that field by the update that brings this in, where the field is empty.
Yes. The Visibility panel shows in the Block Editor sidebar, and as a meta box on the classic editing screen when a builder replaces the block editor.
With Elementor, the Markdown version of a page is built from the Elementor layout, so AI agents get the real text.
Yes:
og:image.It does not add Product schema: WooCommerce already does, with price, stock and reviews.
Yes, with all public post types and taxonomies. WooCommerce attributes need “Enable Archives?” switched on in their settings.
Yes. The Visibility panel has a live preview with three views: your Google result, your social card and an AI Overview citing your page. It updates as you type.
It shows what goes into your HTML, not a score: the final look depends on each platform.
Yes, with a template in the Discover tab. Combine these placeholders with your own words:
%%title%%: the title of the page.%%sep%%: the separator you chose.%%sitename%% and %%tagline%%.%%page%%: the page number.%%taxonomy%%: the first category of the entry, or the product category of a product.Example: %%title%% %%sep%% %%sitename%%.
%%excerpt%%.Open the Visibility panel in the editor sidebar, or the Visibility meta box in the Classic Editor, and tick noindex.
You can also use Quick Edit or Bulk Actions in the post list, and in the category, tag and taxonomy lists.
nosnippet in the Text tab.Visibility also leaves that text out of the descriptions and summaries it generates. The Markdown version and llms-full.txt keep the whole page.
The mark on a Group stops applying if you deactivate Visibility. The one on words stays in the content.
nosnippet tells Google to show no snippet and not to use the text in AI Overviews and AI Mode. Respect nosnippet (Discover tab) applies the same to the files Visibility generates. With it on, an entry set to nosnippet:
It is on in new installs. On an update it turns on only if that changes nothing your site already serves.
Yes. WordPress alone can answer 404 at /robots.txt on a subdirectory install or when its rewrite rules are stale. Visibility serves /robots.txt itself, so it always loads.
If another plugin writes a physical robots.txt, Visibility adds its rules to that file in a block of its own and leaves the rest untouched. /?robots=1 is redirected to /robots.txt.
Yes, and each site keeps its own settings:
/robots.txt and /llms.txt.robots.txt at the domain root, owned by the main site.robots.txt in the network root giving every site the same rules? On Apache and LiteSpeed, a button in the Discover tab routes /robots.txt through WordPress. Only a network administrator sees it.Activate Visibility per site or for the whole network.
Yes, with a folder or a domain per language. Visibility ships a wpml-config.xml, which Polylang reads too:
og:locale, llms.txt, llms-full.txt and Markdown versions./old-page and /en/old-page)./new-page/) goes to the domain asked for. It cannot send the same old path to a different page in each language..txt file with broken accents is sent by your server without a charset: set UTF-8 for .txt files in the server, or use the virtual files, which Visibility always sends as UTF-8.In standard WordPress post meta (_native_aeo_pack_* keys). Term overrides go to term meta and author fields to user meta.
Yes. The Tools tab exports your settings and the per-entry and per-term values as one JSON file, and imports it on another site.
Set a threshold in the Discover tab (90 days by default). Your content lists get a “Not updated in 90 days” filter with a count, and a sortable Last updated column. Set it to 0 to switch both off.
Why it matters: an Ahrefs analysis of 17 million citations found that the pages AI assistants cite were updated more recently, on average, than the ones ranking in Google’s organic results. Google’s AI Overviews were the exception.
Yes, in the Indexing tab:
/product-category/, /product-tag/, /brand/./my-product/), the category and the slug (/t-shirts/my-product/) or the full category path.Good to know:
Yes, from content you already have. Switch on JSON-LD: FAQPage in the Discover tab and Visibility reads the Details and Accordion blocks of your entries: the question from the heading, the answer from the content.
It is off by default, because a Details block is not always a question. It helps AI assistants read your Q&A. It does not bring back Google’s FAQ rich results, retired in 2023.
Yes.
Read what Visibility resolved:
Native_AEO_Pack_Frontend_Robots::is_noindex( $post_id ), is_nofollow( $post_id ), is_term_noindex( $term_id, $taxonomy ) and is_term_nofollow( $term_id, $taxonomy ).Native_AEO_Pack_Settings::get( $group, $key, $default ).Native_AEO_Pack_Settings::is_robots_ai_blocking() and get_robots_ai_agents().Change what is printed, with eight filters:
native_aeo_pack_schema_graph ($graph, $context, $object): the JSON-LD nodes before they are printed. $context is article, person, identity or website (the WebSite node on its own, on the home page of a site that prints its identity on another page). Return an empty array to print nothing.native_aeo_pack_identity_business_types ($types): the schema.org types offered for a local business identity.native_aeo_pack_identity_food_types ($types): the business types that take a cuisine and a menu.native_aeo_pack_document_title ($title): the Meta title before it reaches <title>. Return plain text, which is escaped afterwards, or an empty string to hand the title back to the theme.native_aeo_pack_canonical_url ($url, $object): the canonical of a listing. Return an empty string to print none. Single entries keep the core get_canonical_url filter.native_aeo_pack_meta_description ($description): the final description, used in the meta tag, Open Graph, the Twitter card and the schema.native_aeo_pack_og_image ($image, $post): the image chosen for a single entry.native_aeo_pack_schema_faq_pairs ($pairs, $post): the question and answer pairs before they become FAQPage. Return an empty array to skip it.React to what an AI agent changed through the abilities, with two actions:
native_aeo_pack_post_seo_updated ($post_id): after the SEO values of an entry changed.native_aeo_pack_term_seo_updated ($term_id, $taxonomy): after the SEO values of a term changed.Works with WPML and Polylang, with a folder or a domain per language: SEO fields and settings translate, each language gets its own llms.txt, Markdown and og:locale, and the sitemap covers every language. With a folder per language, a redirect now applies only to its own language.
wpml-config.xml that Polylang reads too. The Meta title, Meta description, social title and social description of each entry are translated with it. The robots, sitemap and llms.txt choices are shared by every translation of an entry, and the Canonical URL is not, so each translation keeps its own address. The title templates, the home page description and the Site Identity texts are translated in WPML String Translation or in Polylang Strings translations, and the page chosen for the identity, the fallback social image and the logo follow their translations./en/llms.txt or on its own domain. With the physical file option on, the llms.txt in the site root is the default language’s./old-page also fired on /en/old-page and sent the visitor to the default language’s target, and a redirect written as /en/old-page never matched. A redirect now applies to the exact path it is written for: add one per language. With one domain per language a redirect holds for every domain, and a relative target goes to the domain asked for./en/llms.txt, /en/llms-full.txt and /en/index.md answered 404, and the canonical, the Markdown link and the llms.txt link of the other languages’ home pages pointed to the default language. With one domain per language, the Markdown version of each entry, its link in llms.txt and a relative redirect pointed to the default domain./en/index.md could answer with the default language’s listing.es on Spanish ones), which Open Graph does not accept. It is now language and territory (es_ES)./artículos/) answered 404, and an address that matches nothing was looked up twice./blog/blog/post.md).For older changelog entries, please check the changelog.txt file
| Version | Download | Type |
|---|---|---|
| 3.2.0 | Download | Stable |
| 3.1.1 | Download | Stable |
| 3.1.0 | Download | Stable |
| 3.0.0 | Download | Stable |
| 2.9.1 | Download | Stable |
| 2.9.0 | Download | Stable |
| 2.8.3 | Download | Stable |
| 2.8.2 | Download | Stable |
| 2.8.1 | Download | Stable |
| 2.8.0 | Download | Stable |
| 2.7.3 | Download | Stable |
| 2.7.2 | Download | Stable |
| 2.7.1 | Download | Stable |
| 2.7.0 | Download | Stable |
| 2.6.2 | Download | Stable |
| 2.6.1 | Download | Stable |
| 2.6.0 | Download | Stable |
| 2.5.0 | Download | Stable |
| 2.4.5 | Download | Stable |
| 2.4.4 | Download | Stable |
| 2.4.3 | Download | Stable |
| 2.4.2 | Download | Stable |
| 2.4.1 | Download | Stable |
| 2.4.0 | Download | Stable |
| 2.3.1 | Download | Stable |
| 2.3.0 | Download | Stable |
| 2.2.0 | Download | Stable |
| 2.1.1 | Download | Stable |
| 2.1.0 | Download | Stable |
| 2.0.0 | Download | Stable |
| 1.9.1 | Download | Stable |
| 1.9.0 | Download | Stable |
| 1.8.1 | Download | Stable |
| 1.8.0 | Download | Stable |
| 1.7.1 | Download | Stable |
| 1.7.0 | Download | Stable |
| 1.6.0 | Download | Stable |
| 1.5.0 | Download | Stable |
| 1.4.0 | Download | Stable |
| 1.3.0 | Download | Stable |
| 1.2.0 | Download | Stable |
| 1.1.0 | Download | Stable |
| 1.0.0 | Download | Stable |
| Development | Download | Trunk |