{"id":357145,"date":"2026-08-29T12:38:17","date_gmt":"2026-08-29T12:38:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/content-signal-seo-content-audit\/"},"modified":"2026-08-30T08:26:55","modified_gmt":"2026-08-30T08:26:55","slug":"content-signal-seo-content-audit","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/content-signal-seo-content-audit\/","author":23552918,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.9.1","stable_tag":"0.9.1","tested":"7.1","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Content Signal \u2014 SEO Content Audit","header_author":"Serhii Vasyliev","header_description":"Audits WordPress content health locally and optionally connects it to evidence-backed SEO workflows.","assets_banners_color":"fbfbfa","last_updated":"2026-08-30 08:26:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/seo-content-control-center-marketin.vercel.app\/download","header_author_uri":"https:\/\/seo-content-control-center-marketin.vercel.app","rating":0,"author_block_rating":0,"active_installs":0,"downloads":62,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.9.0":{"tag":"0.9.0","author":"serhiivasyliev","date":"2026-08-29 12:37:54","revision":3671527},"0.9.1":{"tag":"0.9.1","author":"serhiivasyliev","date":"2026-08-30 08:26:55","revision":3672216}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3671527,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3671527,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3671527,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3671527,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3671527,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner.svg":{"filename":"banner.svg","revision":3671527,"resolution":false,"location":"assets","locale":false}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.9.0","0.9.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3671527,"resolution":"1","location":"assets","locale":"","width":3136,"height":2000}},"screenshots":{"1":"Content Health dashboard: audit summary, findings list with severity, evidence, and edit\/view\/ignore actions."}},"plugin_section":[262246],"plugin_tags":[19795,127115,186,8197],"plugin_category":[55],"plugin_contributors":[278184],"plugin_business_model":[],"class_list":["post-357145","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-content-audit","plugin_tags-search-console","plugin_tags-seo","plugin_tags-workflow","plugin_category-seo-and-marketing","plugin_contributors-serhiivasyliev","plugin_committers-serhiivasyliev"],"banners":{"banner":"https:\/\/ps.w.org\/content-signal-seo-content-audit\/assets\/banner-772x250.png?rev=3671527","banner_2x":"https:\/\/ps.w.org\/content-signal-seo-content-audit\/assets\/banner-1544x500.png?rev=3671527","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/content-signal-seo-content-audit\/assets\/icon.svg?rev=3671527","icon":"https:\/\/ps.w.org\/content-signal-seo-content-audit\/assets\/icon.svg?rev=3671527","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/content-signal-seo-content-audit\/assets\/screenshot-1.png?rev=3671527","caption":"Content Health dashboard: audit summary, findings list with severity, evidence, and edit\/view\/ignore actions."}],"raw_content":"<!--section=description-->\n<p>Content Signal is a read-only WordPress content health audit that works alongside Yoast SEO and Rank Math. Run it locally without an account, API key, URL quota, or external request.<\/p>\n\n<p>The free local audit can:<\/p>\n\n<ul>\n<li>scan published posts, pages, and other public content types (including WooCommerce products) in bounded background batches;<\/li>\n<li>find published content marked noindex;<\/li>\n<li>find missing SEO titles and meta descriptions;<\/li>\n<li>flag canonicals that point to another URL;<\/li>\n<li>identify thin content, content without internal links, and stale content;<\/li>\n<li>identify orphan content and pages with only one inbound internal link;<\/li>\n<li>compare the latest scan with the previous result to show new and resolved findings;<\/li>\n<li>schedule daily or weekly local audits, disabled by default;<\/li>\n<li>ignore intentional findings and restore them later;<\/li>\n<li>search and filter findings by issue, severity, content type, change, and active\/ignored state;<\/li>\n<li>link directly to Edit and View actions for every affected URL;<\/li>\n<li>export the complete latest audit to CSV;<\/li>\n<li>show critical content health status in the WordPress Dashboard and Site Health.<\/li>\n<\/ul>\n\n<p>The optional Content Signal platform connection can:<\/p>\n\n<ul>\n<li>exchange a one-time connection challenge for a site-scoped connection;<\/li>\n<li>sync bounded content metadata and active findings from the latest completed local audit in paginated batches;<\/li>\n<li>materialize local findings as platform audit issues and combine them with Google Search Console traffic loss and opportunity data;<\/li>\n<li>deep-link connected findings into matching platform Content and Audit views;<\/li>\n<li>identify findings that can gain Search Console evidence and supported Yoast\/Rank Math fields that can enter the safe-preview workflow;<\/li>\n<li>prioritize work in a multi-site team backlog with audit history;<\/li>\n<li>schedule recurring sync through Action Scheduler, with an hourly WP-Cron fallback;<\/li>\n<li>show sanitized sync history in the WordPress admin;<\/li>\n<li>receive signed, review-first SEO title\/meta-description operations plus bounded self-canonical and individual noindex\/nofollow repairs from the SaaS worker.<\/li>\n<\/ul>\n\n<p>The local audit does not contact an external service or change content. When the optional platform is connected, the plugin does not send post bodies during sync. Risky SEO changes are never made from the platform without a preview, dry run, explicit confirmation, signed request, and recorded result.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects your WordPress site to the Content Signal SaaS workspace, an account-based service you sign up for separately. No SaaS endpoint is contacted until an administrator enters one on the settings screen and completes the one-time connection exchange.<\/p>\n\n<p>Once connected, the plugin sends requests to the SaaS endpoint you configured in these cases:<\/p>\n\n<ul>\n<li><strong>Connecting the site<\/strong> &mdash; the one-time connection challenge you paste in is exchanged for a signed, site-scoped connection token.<\/li>\n<li><strong>Scheduled and manual sync<\/strong> &mdash; bounded post\/page metadata (URL, title, status, modified time, author, publish date, featured-image presence, taxonomies, word count, link counts, supported SEO metadata signals, and active findings from the latest completed local audit) is sent in paginated batches. Each finding is limited to an allow-listed code, label, severity, short evidence, and fingerprint. Full post\/page content bodies, the full internal-link graph, and ignored findings are never sent.<\/li>\n<li><strong>Receiving SEO operations<\/strong> &mdash; the SaaS worker sends signed, review-first title\/meta-description\/canonical\/noindex-nofollow proposals for an administrator to preview and confirm before anything is written back to WordPress.<\/li>\n<li><strong>Disconnecting the site<\/strong> &mdash; a request invalidates the stored connection token on the SaaS side.<\/li>\n<\/ul>\n\n<p>Every outbound request is signed with a per-site secret and rejected by the SaaS if tampered with. No data is sent to any third party besides the SaaS endpoint you explicitly configure.<\/p>\n\n<p>See the <a href=\"https:\/\/seo-content-control-center-marketin.vercel.app\/terms\">Content Signal Terms of Service<\/a> and <a href=\"https:\/\/seo-content-control-center-marketin.vercel.app\/privacy\">Privacy Policy<\/a> for how the connected SaaS handles data.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Download the <code>seo-content-control-center-&lt;version&gt;.zip<\/code> release artifact.<\/li>\n<li>In WordPress, go to Plugins &gt; Add New &gt; Upload Plugin and select the archive.<\/li>\n<li>Activate Content Signal.<\/li>\n<li>Open Content Health in the WordPress admin menu.<\/li>\n<li>Select Run content audit.<\/li>\n<li>Review or export the local findings.<\/li>\n<\/ol>\n\n<p>No platform connection is required for the local audit. To add Search Console evidence, team workflow, audit history, and review-first metadata operations, open the Platform tab and connect the site with a challenge created in the SaaS workspace.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20my%20seo%20plugin%3F\"><h3>Does this replace my SEO plugin?<\/h3><\/dt>\n<dd><p>No. Content Signal is an operations layer that connects WordPress metadata, Search Console evidence, audits, and a trackable backlog. It works with supported Yoast and Rank Math metadata fields for bounded operations.<\/p><\/dd>\n<dt id=\"does%20the%20free%20audit%20require%20an%20account%20or%20send%20data%20elsewhere%3F\"><h3>Does the free audit require an account or send data elsewhere?<\/h3><\/dt>\n<dd><p>No. The content health audit runs locally in WordPress and does not require an account, API key, URL quota, or external request. External communication starts only after an administrator explicitly connects the optional platform.<\/p><\/dd>\n<dt id=\"does%20the%20local%20audit%20modify%20posts%20or%20seo%20metadata%3F\"><h3>Does the local audit modify posts or SEO metadata?<\/h3><\/dt>\n<dd><p>No. The local audit is read-only. It explains findings and links to the normal WordPress editor. Connected platform writes remain protected by preview, dry run, explicit confirmation, signed requests, and rollback support.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20publish%20or%20edit%20content%20automatically%3F\"><h3>Does the plugin publish or edit content automatically?<\/h3><\/dt>\n<dd><p>No. The plugin syncs bounded metadata and accepts only signed, supported operations after the SaaS has completed its preview, dry run, and explicit confirmation workflow.<\/p><\/dd>\n<dt id=\"what%20does%20the%20plugin%20sync%3F\"><h3>What does the plugin sync?<\/h3><\/dt>\n<dd><p>It syncs bounded posts\/pages inventory and metadata, including URL, title, status, modified time, author, publish date, featured-image presence, taxonomies, word count, link counts, supported SEO metadata signals, and active findings from the latest completed local audit. A finding contains only its allow-listed code, label, severity, short evidence, and fingerprint. It does not sync post bodies, the full link graph, or ignored findings.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20deactivate%20the%20plugin%3F\"><h3>What happens when I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Recurring and queued local sync jobs are removed. Disconnect the site from the settings page before deleting the plugin when you also need to invalidate its SaaS connection token.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens when I delete the plugin?<\/h3><\/dt>\n<dd><p>WordPress removes the plugin's local audit results, sync log, stored connection token, and scheduled jobs. Disconnect first when you also need to invalidate the connection remotely on the platform.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>The local audit now scans every public post type (not just posts and pages), including WooCommerce products and other custom post types. Attachments stay excluded.<\/li>\n<li>The content-type filter and the type label shown next to each finding are now built from what a site actually has, instead of a fixed Posts\/Pages list.<\/li>\n<li>Fixed the dismiss button on the top feedback notice overflowing past the box's rounded corner.<\/li>\n<li>The Platform connection tab now explains that the team platform is in private beta and links to a request-access page, instead of showing bare \"Platform URL\" and \"Connection challenge\" fields with nowhere to get them from.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>Added a Monitoring tab (visible once the platform is connected) showing monitored URL count, open regressions, and the 5 most recent regressions with severity\/status, backed by a new signed <code>GET \/api\/plugin\/monitoring-summary<\/code> platform call.<\/li>\n<li>Certification matrix now covers PHP 8.4 and WordPress 7.0 (<code>wordpress:php8.4-apache<\/code>, <code>wordpress:7.0-php8.2-apache<\/code>), replacing the WordPress 6.8 pin.<\/li>\n<\/ul>\n\n<h4>0.8.1<\/h4>\n\n<ul>\n<li>Set the text domain to match the plugin slug (<code>content-signal-seo-content-audit<\/code>).<\/li>\n<li>Updated Tested up to 7.1.<\/li>\n<li>Added nonce verification to the findings filter form; invalid or missing nonces fall back to the unfiltered view instead of trusting the input.<\/li>\n<li>Documented why the tab\/status\/error redirect-target readers do not use a nonce (server-generated values from this plugin's own already-verified redirects, matched against a fixed allow-list).<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Renamed the plugin to Content Signal \u2014 SEO Content Audit ahead of WordPress.org submission.<\/li>\n<li>Removed the self-hosted GitHub updater. The plugin now receives updates through the WordPress.org plugin directory.<\/li>\n<\/ul>\n\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>Rebuilt the plugin admin as a branded, responsive control surface with compact navigation and clear local\/platform states.<\/li>\n<li>Reworked audit summaries, filters, findings, connection setup, sync activity, controls, and feedback states for faster scanning.<\/li>\n<li>Added a consistent accessible color system, keyboard focus treatment, responsive layouts, and reduced-motion support.<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Synced active, bounded findings from the latest completed local audit with matching content items.<\/li>\n<li>Materialized WordPress local findings as deduplicated platform audit issues, including orphan and weak-link evidence that metadata alone cannot reproduce.<\/li>\n<li>Kept post bodies, the full link graph, ignored findings, and incomplete audit state outside the SaaS sync payload.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Added connected deep links from every local finding to matching platform Content and Audit views.<\/li>\n<li>Added clear Search Console enrichment context for connected findings.<\/li>\n<li>Added conservative safe-preview availability hints only for supported Yoast or Rank Math metadata fields.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Added local inbound-link mapping with orphan and weak-link findings.<\/li>\n<li>Added new, resolved, and unchanged comparisons against the previous audit without retaining unlimited history.<\/li>\n<li>Added daily or weekly local audit scheduling through Action Scheduler or WP-Cron.<\/li>\n<li>Added bounded ignore rules with active\/ignored filtering and inline restore actions.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Added a standalone local content health audit with no account or platform connection required.<\/li>\n<li>Added deterministic checks for published noindex, missing SEO metadata, canonical mismatches, thin content, missing internal links, and stale content.<\/li>\n<li>Added background batched scanning, latest-result persistence, summary counts, search, filters, edit\/view actions, and CSV export.<\/li>\n<li>Added WordPress Dashboard and Site Health surfaces for local audit status.<\/li>\n<li>Moved the optional SaaS connection and sync controls to a secondary Platform tab.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First packaged release with secure SaaS connection exchange, paginated metadata sync, recurring scheduling, sync logs, and signed review-first SEO metadata operations.<\/li>\n<\/ul>","raw_excerpt":"Audit posts, pages, and other public content types for missing SEO metadata, noindex risk, and thin content. Runs locally, no account required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/357145","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=357145"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/serhiivasyliev"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=357145"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=357145"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=357145"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=357145"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=357145"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=357145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}