=== Visibility - Lightweight SEO, AEO and GEO for Search and AI ===
Contributors: fernandot, ayudawp
Tags: ai seo, redirects, noindex, schema, sitemap
Requires at least: 6.1
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 3.1.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Lightweight Free WordPress SEO: meta tags, schema, Open Graph, redirects, robots, LLMS, MD, sitemap. No bloat, no tracking. Visible to search and AI.

== Description ==

**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.

* **Free, all of it.** No Pro version, no upsell banners, no account.
* **No tracking.** Nothing phones home.
* **Light.** Built on WordPress core APIs, with no database tables of its own and no cron jobs.
* **Easy to switch to.** One-click import from Yoast SEO, Rank Math, All in One SEO, SEOPress, The SEO Framework, Slim SEO and SureRank.
* **Ready for AI search (AEO and GEO).** Clean metadata, llms.txt and a Markdown version of every page, for ChatGPT, Perplexity, Gemini and other AI assistants to read and cite.

= Four modules, switch on only what you need =

**Discover: meta tags, schema and AI discovery**

* Meta title and meta description, with templates and per-post and per-term overrides.
* Canonical URLs on entries and on every listing.
* Open Graph and Twitter Cards.
* JSON-LD schema: Article, BreadcrumbList, Person, ProfilePage, FAQPage and Site Identity (Organization, LocalBusiness or Person). Choose the type per content type, or None to leave it to another plugin.
* Author details (job title, topics and credentials), shown with the Author details block or the `[visibility_author_details]` shortcode. Each author can pick a page as their profile page.
* AI discovery: llms.txt, llms-full.txt, a Markdown version of each page and a robots.txt editor with AI crawler rules.
* Respect nosnippet: content set to nosnippet stays out of the llms.txt summaries, llms-full.txt, Markdown and FAQPage.
* A filter for content that has not been updated in a while.

**Indexing: noindex and clean URLs**

* noindex, nofollow, noimageindex and nosnippet, in bulk by content type and taxonomy or one by one.
* Rules for search results, 404, date, paginated, attachment and author archives, and for RSS feeds.
* Keep part of a page out of Google's snippets with `data-nosnippet`, from the block editor or the classic editor.
* Remove the base of any taxonomy, choose a WooCommerce product URL structure and redirect attachment pages to their parent, with 301 redirects from the old URLs.
* Quick Edit, bulk actions and a Visibility column on your post and term lists.

**Sitemaps: control of the native XML sitemap**

* Works on the sitemap WordPress already generates, instead of adding a second one.
* Exclude post types, taxonomies, users, posts and terms. Noindexed content stays out automatically, and so does content whose canonical URL points to another address.
* Add URLs of pages served outside WordPress.
* lastmod dates, and 301 redirects from the sitemap URLs of your previous SEO plugin.
* Keeps `/wp-sitemap.xml` answering 200 on a site with no blog posts, which older WordPress versions got wrong.

**Redirects: 301, 302, 307 and 410**

* Managed from the admin: no .htaccess editing, no custom table, no 404 log.
* CSV import and export.
* A suggested redirect when you delete a post.
* Take over the redirects WordPress creates when a slug changes.
* Redirect chains answered in one hop, and loops refused.

= Good to know =

* Per-post controls live in the Block Editor sidebar and in a Classic Editor meta box, with a live preview of your Google result, your social card and an AI answer.
* The **Tools** tab groups the importers and exports your configuration as JSON for another site.
* AI agents can read and edit the SEO of your posts and terms through the WordPress Abilities API, with the WordPress MCP Adapter, Novamira or any other client. EMCP Tools exposes the same fields over MCP while you edit a page in Elementor.
* Visibility replaces a full SEO plugin instead of running next to one, and warns you if another one is active.

== Installation ==

1. Upload the `native-aeo-pack` folder to `/wp-content/plugins/` or install through the Plugins screen.
2. Activate the plugin.
3. Open **Visibility** in the admin sidebar to review the active modules and tune the defaults.
4. Done. Meta tags, robots directives and sitemap filters are applied automatically based on your settings.

== Perfect companions ==

Visibility works on its own. These plugins pair well with it:

* [VigIA](https://wordpress.org/plugins/vigia/): see which AI crawlers visit your site. Both plugins share the Site Identity schema without duplicating it.
* [Share Buttons & AI-powered Summaries](https://wordpress.org/plugins/ai-share-summarize/): share buttons for social networks and AI assistants.
* [AI Content Signals](https://wordpress.org/plugins/ai-content-signals/): tell AI systems how they may use your content (training, search or both) through `robots.txt`.
* [Vigilante](https://wordpress.org/plugins/vigilante/): all-in-one WordPress security: firewall, login protection, security headers, 2FA and file integrity monitoring.

== External services ==

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`).

* **What is sent:** an MD5 hash of the author email, in a HEAD request to `https://www.gravatar.com/avatar/{hash}?d=404`. The email address itself is never sent.
* **When:** on a single post or page with Open Graph on and no other image available (social image, featured image, WooCommerce gallery image or image in the content), and on an author archive with Person schema on.
* **How often:** the result is cached for 24 hours, so later page loads do not contact Gravatar again.

It is the same lookup WordPress uses for comment avatars. Gravatar's privacy policy: https://automattic.com/privacy/

== Performance and security ==

"Lightweight" should be a measurement, not a slogan. These are the real numbers for this release, refreshed on every update.

= Footprint (3.0.0) =

* **Download size:** about 505 KB zipped.
* **Codebase:** 51 PHP files, roughly 39,700 lines of PHP, plus 3,400 lines of JavaScript and 2,600 of CSS, loaded only where they are used.
* **On a page view:** 26 PHP files, and no database query added to a post, a page or the home page of a default install.
* **No custom database tables.** One option for the settings and native WordPress meta for per-post, per-term and per-author values.
* **No cron jobs.**
* **No external HTTP calls**, except the cached Gravatar check described above.
* **Built on WordPress core APIs** (`wp_robots`, `wp_sitemaps_*`, `register_post_meta`, `get_canonical_url`, the Block Editor).

= Measured against other SEO plugins =

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.

* **PHP files loaded on every page view:** 26. SureRank 122, SEOPress 134, Rank Math 267, All in One SEO 303, Yoast SEO 588.
* **Database queries added to a post:** none. SEOPress 1, Yoast SEO 3, SureRank 7, Rank Math 16, All in One SEO 32.
* **Server time added to every page view:** about 2 ms. Yoast SEO 7, SEOPress 8, Rank Math 11, SureRank 12, All in One SEO 17.
* **JavaScript loaded in the editor:** 41 KB. SEOPress 89 KB, Rank Math 1.4 MB, SureRank 1.9 MB, Yoast SEO 3.5 MB.
* **Download size:** about 505 KB. SEOPress 2.8 MB, Rank Math 3.6 MB, Yoast SEO 4.9 MB, SureRank 6 MB, All in One SEO 7.3 MB.
* **Custom database tables and cron jobs:** none. SureRank 0 and 1, SEOPress 1 and 0, Rank Math 6 and 4, Yoast SEO 6 and 6, All in One SEO 13 and 1.

= Security =

* **Every release passes a security audit** of the changed code before it ships.
* **Small attack surface:** no custom tables, no unauthenticated endpoints, escaped output, validated input and prepared database queries.
* **No telemetry and no data collection.**

== Frequently Asked Questions ==

= Is Visibility an alternative to Yoast, Rank Math, All in One SEO or SEOPress? =

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.

= How do I migrate from another SEO plugin? =

1. Install and activate Visibility. Your old plugin can be active or already deactivated.
2. Open the **Tools** tab. The import card shows what it found, field by field.
3. Import, check a few entries and deactivate the old plugin.

What to expect:

* **From:** Yoast SEO, Rank Math, All in One SEO, SEOPress, The SEO Framework, Slim SEO and SureRank.
* **What comes over:** titles, meta descriptions, canonical URLs and robots rules of posts and terms, social titles, descriptions and images, schema types, verification codes and title templates.
* **Site identity:** entity type (with its organization or business type), name, logo, social profiles, contact, address and company details from SEOPress, Rank Math and Yoast SEO. Coordinates, price range and opening hours from Rank Math.
* **More than one plugin:** the one in use takes each value (active first, then installed, then the one set up last), and it decides the entity type.
* **Redirects:** from Rank Math, All in One SEO, SEOPress and the Redirection plugin.
* **Templates:** variables such as `%%title%%` are converted. One that needs a custom field or a date is left where it is.
* **Safe to repeat:** nothing is deleted from the old plugin, what you already set in Visibility is kept, and running it again never duplicates anything.

= I used Native SEO Meta Tags, NoIndexer or Sitemap Customizer. How do I migrate? =

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.

= Is Visibility free? Is there a Pro version? =

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.

= Will Visibility slow down my site? =

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".

= Does Visibility track me or send my data anywhere? =

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.

= Are there any database tables? =

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.

= Can I disable individual modules? =

Yes. The **Overview** tab switches Discover, Indexing, Sitemaps and Redirects on and off independently.

= What are AEO and GEO, and does Visibility do them? =

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:

* **Freshness:** a filter and a Last updated column for content that has gone stale.
* **Authorship:** author details in Person schema and on the page.
* **Questions and answers:** FAQPage from the Q&A you have published.

No plugin can promise you a citation.

= How does Visibility help with AI (AEO / GEO)? =

It gives AI search and assistants clean signals to read:

* Site Identity schema: who is behind the site.
* llms.txt and llms-full.txt: a Markdown index of your content.
* A Markdown version of every page at its `.md` URL.
* A robots.txt editor to allow or block AI crawlers by name.

The companion plugin VigIA shows which AI crawlers actually visit.

= Can an AI agent manage my SEO? Does Visibility work with MCP and Novamira? =

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.

* Read and write the SEO of a post, a page or a product.
* Read and write the SEO of a category, a tag or a term.
* List the entries with no Meta description or no Meta title.
* Read the SEO status of the site.

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.

= Does Visibility generate llms.txt and a Markdown version of my pages? =

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.
* Every entry also answers at its own `.md` URL.

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.

= Does Visibility add schema markup and structured data? =

Yes, as a single JSON-LD graph, with per-post and per-term overrides:

* Article, with the type chosen per content type (BlogPosting, NewsArticle and others).
* BreadcrumbList.
* Person and ProfilePage for authors.
* FAQPage from Details and Accordion blocks.
* Site Identity (Organization, LocalBusiness or Person, and WebSite) on the home page.

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.

= Does Visibility add local business (local SEO) schema? =

Yes. In **Discover > Site Identity** pick **Local business** as the entity type:

* Business type: Restaurant, Dentist, Store and many more, or the generic LocalBusiness.
* Address and coordinates.
* Phone and email.
* Price range.
* Opening hours, with split hours.
* Cuisine and menu, for restaurants, cafés, bars and other food businesses.

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.

= My business has more than one location. Can I mark up the others? =

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`.

= How do I tell Google the name of my site? =

In **Discover > Site Identity**:

* **Name**: the name of the site. Empty, it is the site title.
* **Alternate names**: an acronym or a shorter name, one per line.

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 Rich Results Test does not show my organization. Why? =

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.

= Can I stop Visibility from writing schema and use a specialised plugin instead? =

Yes, at three levels:

* **Everything:** uncheck **JSON-LD: Article and BreadcrumbList** in the Discover tab.
* **One content type:** set its schema type to **None**.
* **One entry:** pick **None** in its Schema type field.

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.

= Does Visibility mark up author pages as ProfilePage? =

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.

= Does Visibility control the XML sitemap? =

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:

* Exclude post types, taxonomies, single posts and terms, and users by role.
* Noindexed content stays out automatically.
* Content whose Canonical URL points to another address stays out too. Google asks not to list one address in the sitemap and declare another as canonical.
* Add URLs of pages that are not WordPress content.
* Set lastmod dates and the number of URLs per sitemap.
* The sitemap URLs of your previous SEO plugin (`sitemap.xml`, `post-sitemap.xml`) are 301-redirected to the native one.

= My sitemap looks fine in the browser but Google says it could not be read. Why? =

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.

= My old sitemap URLs redirect to a page that does not exist. What is wrong? =

Something has switched off the sitemap WordPress generates, so the old address has nowhere to go. The usual causes:

* A snippet that sets `wp_sitemaps_enabled` to false, in `functions.php` or in a snippets plugin.
* Another SEO plugin serving a sitemap of its own.
* "Discourage search engines from indexing this site" ticked in Settings > Reading.

Visibility checks before redirecting and leaves the old address alone in that case.

= Does Visibility manage redirects? Do I need .htaccess or a separate plugin? =

Redirects are included and you need neither:

* 301, 302, 307 and 410, with no `.htaccess` editing and no custom table.
* CSV import and export.
* A suggested redirect when you delete a post.
* Take over or remove the redirects WordPress creates when a slug changes.
* A redirect whose target is redirected too is answered in one hop, and one that would close a loop is refused.

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.

= Does Visibility work with the AI plugin of WordPress.org? =

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.

= Does Visibility work with Elementor, Divi and other page builders? =

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.

= Does Visibility work with WooCommerce? =

Yes:

* Products, categories, tags and attributes get titles, descriptions, social tags, schema and robots rules like any other content.
* The product gallery image is a fallback for `og:image`.
* llms.txt is WooCommerce-aware.
* Cleaner product and category URLs: see "Can I clean up my WooCommerce URLs?".

It does not add Product schema: WooCommerce already does, with price, stock and reviews.

= Does it work with custom post types and custom taxonomies? =

Yes, with all public post types and taxonomies. WooCommerce attributes need "Enable Archives?" switched on in their settings.

= Can I preview how my page will look on Google, social networks and AI answers? =

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.

= Can I change how the automatic title tag is composed? =

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%%`.

* The front page, each content type and each taxonomy can have a template of their own.
* A Meta title typed on an entry or a term always wins.
* The meta description works the same way, with one more placeholder: `%%excerpt%%`.
* Custom fields and dates are not available, on purpose: they need a query on every page.
* A theme that prints its own title tag, without the WordPress title API, is not reached by the template.

= How do I set noindex on a single post? =

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.

= How do I keep part of a page out of Google's snippets? =

* **Block editor:** turn on **Keep out of search snippets** in the Advanced panel of a Group block, or apply the format of the same name to selected words.
* **Classic editor:** use the button of the same name in the Visual toolbar, or `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.

= What does Respect nosnippet do? =

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:

* is listed in llms.txt by title and link only,
* has no text in llms-full.txt,
* has no Markdown version,
* gets no FAQPage.

It is on in new installs. On an update it turns on only if that changes nothing your site already serves.

= Does my robots.txt always work, even on a subdirectory install? =

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`.

= Does Visibility work on WordPress Multisite? =

Yes, and each site keeps its own settings:

* On a subdomain or mapped-domain network, each site serves its own `/robots.txt` and `/llms.txt`.
* On a subdirectory network there is one `robots.txt` at the domain root, owned by the main site.
* A physical file is written only where it belongs: a single site, or the main site of a subdirectory network.
* Is a physical `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.
* On nginx, the screen gives you the directive for whoever administers the server.

Activate Visibility per site or for the whole network.

= Where does Visibility store per-post overrides? =

In standard WordPress post meta (`_native_aeo_pack_*` keys). Term overrides go to term meta and author fields to user meta.

= Can I copy my configuration to another site? =

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.

* Content is matched by slug, so it works between sites that are not clones.
* On import, choose between filling in only what is empty (the default) and replacing what is there.
* Nothing is created: values land on content that already exists.
* Redirects have their own CSV export in the Redirects tab. Author profile fields are not included.

= How do I know which content has gone stale? =

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](https://ahrefs.com/blog/do-ai-assistants-prefer-to-cite-fresh-content/) 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.

= Can I clean up my WooCommerce URLs? =

Yes, in the Indexing tab:

* Remove the base of each taxonomy on its own: `/product-category/`, `/product-tag/`, `/brand/`.
* Choose a product URL structure WooCommerce does not allow: the product slug alone (`/my-product/`), the category and the slug (`/t-shirts/my-product/`) or the full category path.
* Old URLs are 301-redirected to the new ones, so a product is never reachable at two URLs.

Good to know:

* A page or a term that already uses a path keeps it.
* Removing a base adds rewrite rules for every term. The settings screen tells you how many before you save.
* If you use Premmerce Permalink Manager, import its structure from the Tools tab, check your URLs and deactivate it.

= Does Visibility generate FAQ structured data? =

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.

= Is there an API for plugins and themes? =

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.

== Screenshots ==

1. Overview tab — the four modules, on or off.
2. Discover tab — meta tags, Open Graph and schema, with the section navigation of the tab on the left.
3. Indexing tab — noindex and nofollow in bulk, by content type and taxonomy.
4. Sitemaps tab — what goes into the sitemap and what stays out.
5. Post list — the Visibility column and Quick Edit.
6. Redirects tab — 301, 302, 307 and 410, with CSV import and export.
7. Editor — the entry as a Google result, a social card and an AI Overview, live as you type.
8. Tools tab — importers from other SEO plugins, and configuration export.

== Changelog ==

= 3.1.0 =
Local SEO and site identity: alternate site names, cuisine and menu for food businesses, and a warning when a local business has no address. Pages whose canonical points elsewhere leave the sitemap, redirect chains are answered in one hop, and the AI plugin no longer adds a second meta description.

* New: Alternate names for the site, in Discover > Site Identity: an acronym or a shorter name, one per line. They are written as `alternateName` in the WebSite markup, which Google reads next to the name when it picks the site name to show.
* New: Cuisine and menu URL for a local business that serves food (restaurant, café, bar, bakery and the other food types), written as `servesCuisine` and `menu`. The two fields show only for those business types, and the `native_aeo_pack_identity_food_types` filter changes which ones they are.
* New: A warning in Site Identity when a local business has no street or no city. Google lists the address as required for the local business markup, and its Rich Results Test does not flag a missing one. The same notice says when the business has no image, because the site has neither a logo nor a site icon.
* New: Visibility works with the Meta Description Generation experiment of the AI plugin of WordPress.org. The description that experiment writes is saved in the Meta description field of Visibility and the page prints one meta description; with both plugins active it printed two. The descriptions the AI plugin was printing from its own storage are copied to that field by this update, where the field is empty, and its own copy stays where it is.
* Improved: The WebSite markup is printed on the home page when the identity is set to another page. Google reads the site name from the WebSite markup of the home page, and choosing another target page took it away from there. The home page gets the WebSite node alone; the organization, business or person stays on the page chosen. In the `native_aeo_pack_schema_graph` filter that graph has a context of its own, `website`.
* Improved: An entry or a term archive whose Canonical URL points to another address is left out of the sitemap. Google asks not to list one address in the sitemap and declare another as canonical for the same page. A Canonical URL that is the entry's own address written another way (http or https, with or without www or the final slash) changes nothing. The sitemap icon in the post and term lists shows it.
* Improved: A redirect whose target is itself redirected is answered in one hop, straight to the final address. The answer is permanent only when every redirect on the way is, and it is 410 when the way ends in an address marked as gone.
* Improved: The import screen says when a Rank Math organization keeps more than one phone number: the first is imported and the rest are listed as not imported.
* Fix: Two redirects that point at each other, straight or through others, could be saved, and a visitor to either address was sent back and forth until the browser gave up. A redirect that closes a loop is now refused, a CSV import skips it, and a loop already stored is no longer served: WordPress answers those addresses as if the redirects were not there. The Redirects tab lists the redirects caught in a loop first, with a mark, so the ones that do nothing are easy to find.
* Fix: On a site with a persistent object cache (Redis, Memcached), an entry or a term set to noindex, ticked out of the sitemap or matched by an excluded slug stayed in the sitemap for up to 12 hours, and came back as late when the change was undone. The lists the sitemap is built from are now refreshed when the entry or the term changes.
* Fix: On a site installed in a subdirectory, a redirect to an address of the domain outside WordPress was refused as a loop when an address inside WordPress had the same name.
* Fix: The settings screen said the SearchAction box enables the Google sitelinks search box, which Google retired in November 2024. It now says what the markup is, the address of your site search, and that it changes nothing in Google results.
* Fix: The warning about what each robots directive costs said that nosnippet leaves your position as it is and changes the clicks, which Google does not document. It now says what Google does document: a page needs a snippet to be shown as a supporting link in AI Overviews and AI Mode.
* Fix: The local business details were described as what Google uses for the local business result. They are the properties Google recommends, and the screen says so. The address is described as required for a local business, which is how Google lists it.

For older changelog entries, please check the [changelog.txt](https://plugins.svn.wordpress.org/native-aeo-pack/trunk/changelog.txt) file

== Upgrade Notice ==

= 3.1.0 =
Local SEO and site identity: alternate site names, cuisine and menu for food businesses, and a warning when a local business has no address. Pages whose canonical points elsewhere leave the sitemap, redirect chains are answered in one hop, and the AI plugin no longer adds a second meta description.

== Support ==

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](mailto:native-aeo-pack@ayudawp.com) and tell me what you need.

Need help or have suggestions?

* [Official website](https://visibility.quest)
* [WordPress support forum](https://wordpress.org/support/plugin/native-aeo-pack/)
* [YouTube channel](https://www.youtube.com/AyudaWordPressES)
* [Documentation and tutorials](https://ayudawp.com)

Love the plugin? Please leave us a 5-star review and help spread the word!

== About AyudaWP ==

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.
