=== PlugUpp Search & Social Appearance Audit ===
Contributors: plugupp
Tags: open graph, meta tags, social preview, seo audit, twitter card
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.5.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

See exactly how your WordPress content appears in search engines and on social media - all from one simple dashboard.

== Description ==

PlugUpp Search & Social Appearance Audit shows how your WordPress pages actually appear in search engines and on social platforms by auditing the final rendered output - regardless of theme, SEO plugin, page builder or custom code.

It is not an SEO plugin and does not manage your metadata. Whatever produces your titles, descriptions and social images, this plugin tells you the truth about what actually ships on each page, and flags issues with evidence.

It renders each of your pages the way a visitor's browser would, reads the metadata and the heading structure that actually ship, and reports the problems. Discovery is a simple list of your own content - it never crawls, spiders or follows links.

It also audits how your site presents to AI answer engines (AEO / GEO): which documented AI crawlers your robots.txt allows or blocks, and which pages carry directives that limit how they can be used in AI answers. Facts and evidence only - no AI visibility scores.

> **Upgrade to Premium** for AI readiness findings, scheduled scans, change tracking, Enhanced scan, pre-publish auditing and CSV export. One licence covers a single site up to unlimited sites. [See plans and pricing](https://plugupp.com/plugins/search-social-appearance-audit/#pricing)

= What you get on the free plan =

* **Search Appearance preview** - a Google-style mobile result (breadcrumb, title, description, thumbnail) for every page
* **Social Appearance preview** - a Facebook and LinkedIn style share card (image, title, description) plus the X (Twitter) card type
* **Crop preview** - click any preview image to see the exact area each platform keeps and what it crops off
* **Issue detection with evidence** - missing, duplicate or conflicting metadata, broken OG image URLs, over-long or very short descriptions, noindex pages, canonical problems, and pages set to hide their search thumbnail
* **Heading structure** - flags a page with no H1 heading, more than one H1, or a heading level skipped (H2 straight to H4), read from the rendered page rather than from the editor, with the page's own heading outline as the evidence
* **Template grouping** - when the same heading finding covers every page of one type, a notice above the results says so, so you fix the template once instead of page by page
* **Site-wide search visibility check** - a critical alert if "Discourage search engines from indexing this site" is left switched on, which hides every page on the site from search results
* **Severity that matches reality** - on a page you have set to noindex, findings about how it would look in a search result are listed as notices rather than problems, because that page cannot appear in a search result; social findings keep their full severity, because link previews still work
* **AI access panel** - which documented AI crawlers (OpenAI, Anthropic, Perplexity, Google) your robots.txt allows or blocks, with the matching robots.txt lines and each provider's documented consequence, plus a warning when robots.txt is served with a status that makes its rules ineffective for every crawler
* **Compact flags** - Indexable / noindex and canonical shown inline, with the full details a click away
* **Bulk exclude** - exclude pages from the audit individually or in bulk, including bulk actions on the standard Posts and Pages screens that combine with any list filter
* **Per-issue ignore and logging** - ignore individual issues, with file-based logging and a built-in viewer

= What Premium adds =

* **AI readiness findings** - flags AI search crawlers blocked in robots.txt, blanket rules that block them without naming them, and pages whose snippet or archive directives limit how they can be used in Google AI Overviews, AI Mode and Bing Copilot - each citing the vendor's own documentation
* **Scheduled scans** - run automatically on the schedule you choose
* **Changes since last scan** - each tab shows what was newly flagged, fixed or edited since the previous scan
* **Email reports** - a summary after each scheduled scan, listing the same per-page changes
* **Enhanced scan** - predicts the fallback image a platform may pick, and flags weak social images
* **Custom post types and WooCommerce** - extend audits beyond pages and posts
* **Pre-publish auditing** - check drafts, scheduled and pending content before it goes live
* **Filtering and CSV export** - slice the results by severity and issue type, and take them with you
* **Author flagging and multi-site licensing** - for teams and agencies

[See the full plan comparison and pricing](https://plugupp.com/plugins/search-social-appearance-audit/#pricing).

Private and password-protected content is excluded automatically - search engines and social platforms can never see it, so there is nothing to audit.

== External services ==

This plugin connects to the following external services.

= Freemius =

The plugin uses the Freemius platform for licence activation, plan changes, plugin updates (for paid plans), and as the Merchant of Record for purchases.

* When data is sent: on first plugin activation as part of the user-consented opt-in flow, on licence activation or deactivation, on plugin update checks (paid plans), and on uninstall (for optional feedback). Sending the initial opt-in data is the user's choice - declining the opt-in still lets the plugin work in full. Scanning is fully local and never requires the connection.
* What data is sent: standard Freemius opt-in data including site URL, administrator email address, WordPress version, PHP version, plugin version, and active theme name.
* Terms of service: https://freemius.com/terms/
* Privacy policy: https://freemius.com/privacy/

= Image URLs declared on your pages =

When checking whether an Open Graph image actually loads, the plugin requests the image URL that the page itself declares (for example a file in your Media Library or on your CDN).

* When data is sent: during a scan, for pages that declare an OG image.
* What data is sent: nothing beyond the HTTP request to the image URL - it is made only to confirm the image resolves. Only URLs published on your own pages are contacted.

The plugin also renders your own pages by requesting them on your own server (a self-request), and reads your own /robots.txt and /llms.txt the same way for the AI access panel; that is your site contacting itself, not a third-party service.

== Installation ==

1. Install from the WordPress.org plugin directory (Plugins > Add New), or upload the plugin ZIP (Plugins > Add New > Upload).
2. Activate the plugin.
3. Open the Appearance Audit screen and click "Scan now" to audit your pages and posts. You can leave the page; the scan continues in the background.
4. Review the Search Appearance, Social Appearance and Issues tabs.

== Frequently Asked Questions ==

= Does this replace my SEO plugin? =

No. The plugin audits what your site actually outputs - whichever SEO plugin, theme or page builder produces it. It does not manage or change your metadata.

= Does it crawl my site? =

No. It audits only your known WordPress content. It never follows links or discovers URLs like a crawler.

= Can I see which AI engines are allowed to read my site? =

Yes, in every plan. After a scan, a "Site: AI access and robots.txt" row shows which AI crawlers the major providers document - OpenAI, Anthropic, Perplexity and Google - with whether your robots.txt allows or blocks each one, the matching robots.txt lines as evidence, and what the provider documents that rule as controlling. It reports documented vendor policy, never a guarantee about behaviour, and there are no AI visibility scores. The free plugin also warns you when robots.txt is served with a status that makes its rules ineffective; the findings that interpret crawler rules and page directives are a paid feature.

= What is the difference between the free and paid plans? =

Free audits all your pages and posts on demand, with the Search, Social and Findings views, the AI access panel and no scan limits. Paid plans add automation - scheduled scans and email reports - plus AI readiness findings, Enhanced scan, custom post type and WooCommerce auditing, pre-publish auditing, filtering and CSV export, author flagging, and multi-site licensing. The full plan comparison and current pricing are at https://plugupp.com/plugins/search-social-appearance-audit/#pricing.

= Does a missing H1 heading hurt my search rankings? =

No, and the plugin never says it does. Google states that the number and order of headings on a page are not something to focus on, and that a page can rank perfectly well with no H1 or with several. What the audit reports is structural: the HTML standard says a document with headings should have one at level 1 and requires each heading to be at most one level deeper than the one before it, Google lists H1 elements among the things it uses to build the title link it shows in a search result, and screen reader users move around a page by its headings. That is why a missing H1 is a warning and the other two are notices. None of them is an accessibility compliance failure either: no accessibility success criterion requires an H1 or forbids a skipped level, and the accessibility tools that check headings treat both as best practice rather than as violations.

= Why does the plugin say a finding "repeats across a whole content type"? =

Because heading problems usually live in a template, not in the pages built from it. When the same finding covers at least three pages and most of one content type, a notice above the results names it, for example "No H1 heading on 30 of 30 Venues". Fixing the template clears every one of those pages at once, so that line is usually the shortest route through a long list. The counts are worked out fresh each time you look, so they always match the rows underneath.

= Why is a finding on my noindex page only a notice? =

Because a page set to noindex cannot appear in a search result, so a point about how it would look there describes something that will never be shown. Findings like meta description length, a missing canonical or a hidden search thumbnail are listed as notices on those pages, with a line on each one saying why. They are still listed and still counted in the page's finding total, so nothing is hidden - they just stop being counted as problems, and a page whose only remaining points are notices reads as OK. Social findings are not affected: a noindexed page shared in a chat still shows a link preview, so its Open Graph findings keep their full severity.

= Why does my whole site show a critical "hidden from search" alert? =

Because "Discourage search engines from indexing this site" is switched on under Settings > Reading. WordPress then adds a noindex tag to every page, so no page on the site can appear in search results. That is intentional on a staging or holding site. If the site is live, clear the setting under Settings > Reading and re-scan. Social sharing is unaffected either way - link previews still work.

= Are private or password-protected pages audited? =

No. Private and password-protected content is excluded automatically. Search engines and social platforms can never see it - a crawler or a social share preview only ever reaches a login screen, a password form, or a not-found response. Auditing how such pages appear would be meaningless, so they are left out of every scan, count and report. Make a page public (or remove its password) and it is picked up on the next scan.

== Screenshots ==

1. Search Appearance - every page shown as a Google-style mobile result (breadcrumb, title, description and thumbnail), with its severity badges and Indexable / noindex flag alongside and a scan summary across the top.
2. Social Appearance - every page shown as a Facebook and LinkedIn style share card with the image, title and description, plus the X (Twitter) card type.
3. Click-to-enlarge preview - opens the image full size with the area each platform keeps highlighted and the cropped edges dimmed, so you see exactly what shows and what is trimmed.
4. The Findings tab - every page with something flagged, with its area, a one-line summary and separate Issues, Warnings and Notices counts for fast triage.
5. Issue details - the problem, the exact evidence taken from the rendered page, and quick actions (view, edit, re-scan).
6. Settings - choose which content types are audited, switch archive-page auditing on or off, and set the search and social description preview lengths; a built-in log viewer is on the Logs tab.
7. Site checks - which documented AI crawlers your robots.txt allows or blocks (with each provider's documented consequence and the matching robots.txt lines), plus your robots.txt health and favicon status. Free in every plan.

== Changelog ==


= 1.5.1 =
* Fixed: the notice that groups repeated findings by content type was confusing and badly placed. It now appears only on the Findings tab, sits directly above the results it describes, reads as a short sentence with one line per finding, and each line links straight to those pages.
= 1.5.0 =
* New: heading structure checks (free). The audit now reads the body of each page as well as its head, and reports three things about your headings: no H1 heading, more than one H1, and a heading level skipped (for example a jump from H2 straight to H4). Each finding shows the page's own heading outline as evidence, and heading findings carry their own "Structure" label in the Findings list.
* New: template grouping. Heading problems usually come from a template rather than from individual pages, so when a finding covers most pages of one type a single line above the results says so - for example "No H1 heading on 30 of 30 Venues" - and fixing the template clears every one of them at once.
* Note: these are structural findings, not ranking advice, and the plugin says so on each one. Google states that the number and order of headings does not affect ranking, and no accessibility success criterion requires an H1 or forbids a skipped level. What is documented is what the audit reports: the HTML standard's rules, the headings Google can use to build your search result title, and the fact that screen reader users navigate pages by headings.
* Note: the audit reads the HTML your page produces and cannot apply your stylesheet, so a heading hidden with CSS is still counted. That is part of why the hierarchy findings are notices rather than warnings.

* Fixed: pages whose address redirects (for example a link without its trailing slash) could not be audited and were reported as scan errors. They are now audited at their real address, and an address that redirects somewhere else is skipped quietly instead of counting as a failure.
= 1.4.1 =
* Maintenance: internal hardening only, with no change to what the plugin does or shows. The Exclusion Rules tab is now drawn by the premium add-on itself rather than handed back to the free plugin as markup, and the "Excluded from the audit" summary line is passed through WordPress's own markup allowlist before it is displayed.

= 1.4.0 =
* New: critical alert when your whole site is hidden from search. If "Discourage search engines from indexing this site" is left on under Settings > Reading, WordPress adds a noindex tag to every page and none of them can appear in search results - a classic launch-day miss when a site is copied from staging. The Site checks row now flags it, and it appears in the site-wide notice at the top of the dashboard.
* Changed: on a page you have deliberately set to noindex, findings about how it would look in a search result (meta description length, missing canonical, hidden search thumbnail) are now listed as notices instead of issues or warnings. The page cannot appear in a search result, so those points cannot affect it. Nothing is hidden: every finding is still listed, still counted, and each one says why it was set aside.
* Changed: social findings on a noindex page are untouched. A noindexed page shared in a chat or on a social platform still shows a link preview, so its Open Graph findings keep their full severity.

= 1.3.1 =
* Fixed: scans now pause and resume automatically when the site is briefly unavailable, for example while WordPress runs a scheduled update (maintenance mode), instead of recording every page as a scan error.
* Fixed: pages that cannot be audited during a scan now keep their previous results instead of losing them; the report says so, and a follow-up scan runs automatically.

= 1.3.0 =
* New: favicon check (free). The audit now reads your rendered homepage and warns when no favicon is declared and /favicon.ico is missing, or when the declared icon URL does not resolve. Google shows favicons next to search results and chat platforms show your site icon beside link previews - a missing one renders as a generic placeholder.
* Changed: the Site row is now called "Site checks: robots.txt, AI access, favicon" to reflect everything it audits.
* Improved: the site-wide notice is now shared across PlugUpp plugins - dismissing a notice on one PlugUpp plugin's dashboard dismisses it on all of them, and two plugins reporting the same check no longer nag twice.

= 1.2.3 =
* Changed: a robots.txt served with HTTP 404 while still containing rules is now flagged as a warning in the free plugin - it is a server misconfiguration that makes the rules ineffective for every crawler, search engines and AI crawlers alike. Previously the free plugin only described it in the AI access panel while the row showed OK.

= 1.2.2 =
* Fixed: the AI access panel is now always reachable - the "Site: AI access and robots.txt" row lists on the Findings tab even when the site is perfectly healthy. Previously it only appeared when something was wrong.

= 1.2.1 =
* Fixed: the AI area label in the Findings list now has its own tint, matching the Search and Social labels.

= 1.2.0 =
* New: AI readiness. A new "Site: AI access and robots.txt" row shows which documented AI crawlers (OpenAI, Anthropic, Perplexity, Google-Extended) your robots.txt allows or blocks, with each provider's documented consequence - facts first, no invented scores.
* New (Premium): AI readiness findings - warnings when your robots.txt or a blanket rule blocks AI search crawlers, when snippet directives limit how pages can appear in Google AI Overviews and AI Mode, and when noarchive/nocache opt pages out of Bing Copilot answers. Every finding cites the vendor's own documentation and respects deliberate choices.
* Improved: the noindex notice now explains the page is also excluded from AI answer surfaces that ride the search index.

= 1.1.3 =
* Improved: scans now run to completion on their own and finish much faster on standard shared hosting. The scan keeps itself moving in the background instead of waiting for WP-Cron, which stays in place as a safety net.
* Fixed: a scan could stall partway through on hosting where WP-Cron only runs when the site gets a visit. Stalled scans now recover automatically.

= 1.1.2 =
* Improved: the Issue filter dropdown now shows readable issue names (e.g. "Missing meta description") instead of internal codes, sorted alphabetically.

= 1.1.1 =
* Maintenance: internal code-quality improvements flagged by the WordPress.org Plugin Check. No change to features or behaviour.

= 1.1.0 =
* New: archive pages are now audited - the blog home, category, tag and custom taxonomy archives, and monthly date archives. They have their own titles, descriptions and social tags, and they rank in search and get shared like any other page. Archive rows appear on every tab with View, Re-scan and Exclude actions and an "Archives" choice in the type filter.
* New: "Archive pages" setting under Settings, in the content scope group (on by default). Turning it off removes stored archive results; they return after the next scan if re-enabled.
* Changed: results storage is keyed by a page reference internally so archive pages can be stored alongside posts. The upgrade is automatic and keeps your existing results.

= 1.0.35 =
* Changed: the plugin's display name is now "PlugUpp Search & Social Appearance Audit" - same plugin, clearer branding. Nothing else changes.
* Improved: the Logs tab gains a new "Errors and warnings" log level, and downloaded logs get a self-identifying, timestamped filename.
* Changed: the log file is now named search-social-appearance-audit.log (was ssaa.log, same folder), so a downloaded or emailed log names the plugin.

= 1.0.34 =
* Added a reminder above the results showing how many items are excluded from the audit, linking to the Exclusions screen.

= 1.0.33 =
* Maintenance: internal restructuring of the Logs tab. No change to features.

= 1.0.32 =
* Maintenance: internal restructuring of the scheduled scans and email report code. No change to features or behaviour.

= 1.0.31 =
* Maintenance: internal code-quality fix. No change to features or behaviour.

= 1.0.30 =
* Removed the old Excluded tab from the Dashboard - the items you have excluded from the audit are now managed on the Exclusions screen (Manual Exclusions tab).

= 1.0.29 =
* New Exclusions screen: a Manual Exclusions list of the pages you have excluded from the audit, plus rule-based auto-exclusion (Premium) to exclude pages by URL pattern, category or tag, author, or post type, with saved exclusion sets. Built for large sites where excluding page by page is not practical.

= 1.0.28 =
* Fixed the alignment of the star icon on the Premium settings tab.

= 1.0.27 =
* Renamed the Exclude/Include bulk actions on the Posts and Pages screens to "Appearance audit: Exclude" and "Appearance audit: Include" so they group with our other plugins' actions, and fixed the confirmation message to say "Appearance audit" instead of "scan".

= 1.0.26 =
* Maintenance: rendering, scanning and content discovery now run on a shared engine (the same one behind our Link & Image Health Audit plugin). No change to what the audit checks or how you use it.

= 1.0.25 =
* Polished the premium results filter bar so its controls are the same size as WordPress's standard list-table filters beneath them, for a consistent toolbar.

= 1.0.24 =
* The results list now uses WordPress's standard filters: status tabs (All, Published, Drafts, Scheduled, Pending) above the list and a content-type dropdown with a Filter button, so the two filters work independently and combine.

= 1.0.23 =
* Non-published pages now show their status the WordPress-standard way - for example "Title - Draft" shown in the title - matching the core Posts and Pages lists, instead of a separate pill.

= 1.0.22 =
* Polished the issues and warnings badges in the results table - a little more height, a subtle hover, and tidier spacing when they stack.

= 1.0.21 =
* Clearer badges in the results table. Clickable badges now carry a chevron, the Robots flag reads as a reference badge, and plain states like OK and Missing are no longer styled as buttons. The Issues column is wider so badges no longer wrap.

= 1.0.20 =
* The Issues column now flags warnings as well as critical issues, each with its own coloured badge. A green "OK" appears only when a page has no issues and no warnings.

= 1.0.19 =
* The Issues column now shows a neutral marker instead of a green "OK" on pages that have warnings. "OK" appears only when a page is clear of both issues and warnings.

= 1.0.18 =
* The dashboard summary now shows Issues, Warnings and Notices in colour-coded boxes, for an at-a-glance view of your site's status.

= 1.0.17 =
* Refreshed the plan and upgrade information shown in the plugin and on the plugin page to reflect the current plans.

= 1.0.16 =
* Scheduled email report wording now matches the rest of the plugin: it counts "findings" (all severities) rather than calling them all "issues", which now means critical problems only.

= 1.0.15 =
* New (premium): Changes since last scan. Each tab shows what changed compared with the previous full scan - newly flagged issues, fixes, and changed titles, descriptions or images - in a dedicated view, and the scheduled email report now lists the same per-page changes.

= 1.0.14 =
* Fixed: the Search and Social tabs now sort by that tab's own severity, so a page with a problem only in the other area no longer floats to the top where it just has a notice. The Findings tab still ranks across both areas.

= 1.0.13 =
* Scheduled email reports: the "only when" send option now offers "issues or warnings" and "issues only", and never sends for notices alone, so routine advisory items no longer trigger an email.

= 1.0.12 =
* Settings reorder: the Custom post types and Unpublished content options now sit directly under Content types, so all the "what gets audited" settings are grouped together.

= 1.0.11 =
* The dashboard summary and the renamed "Findings" tab now show separate Issues, Warnings and Notices counts, so a page of advisory notices is no longer reported as a red issue.

= 1.0.10 =
* "Issues" now means critical problems only. Warnings and notices have their own badges on each card, each opening its own list, so advisory items are no longer counted as issues.
* Pages are now sorted by severity: pages with critical problems first, then warnings, then notices, then alphabetically.
* The Search card no longer shows a separate Canonical row. Canonical findings now appear under the warning and notice badges, giving the card more room.

= 1.0.9 =
* Clicking Ignore in the issue details now shows a clear saving indicator, so it is obvious the change is being applied while the page updates.
* The bulk actions on the Posts and Pages screens are now labelled "Exclude from Appearance audit" and "Include in Appearance audit", making it clearer which audit they apply to.

= 1.0.8 =
* The Search and Social tabs now sort worst-first by default - pages with the most issues at the top, then alphabetically within each - so the pages needing attention surface immediately. You can still sort by any column.

= 1.0.7 =
* New check: flags a meta description that is longer than your preview length (so search engines will truncate it) or very short.
* New check: flags pages set to max-image-preview:none, where Google will not show a thumbnail in search results.

= 1.0.6 =
* Updated the bundled Freemius framework to version 2.13.2.

= 1.0.5 =
* Clicking a preview image now opens it full size with the platform's crop area highlighted, so you can see exactly what Facebook or Google keeps and what gets trimmed.

= 1.0.4 =
* The Social preview thumbnail is now larger (matching the Search preview height) and uses the true 1.91:1 share-card proportions.

= 1.0.3 =
* The Search and Social preview cards now name the specific field that is missing (for example "Missing meta description" or "Missing OG title") instead of a generic "Missing" label.

= 1.0.2 =
* Updates made in response to the WordPress.org plugin review.

= 1.0.1 =
* Improved: when a page fails to render during a scan, the log now records a short snippet of what the page returned - including the underlying PHP error when the page fatals - so render errors are diagnosable from the Logs tab without server access.

= 1.0.0 =
* Initial public release.
