{"id":327271,"date":"2026-07-05T15:52:42","date_gmt":"2026-07-05T15:52:42","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/coywolf-seo\/"},"modified":"2026-07-05T15:52:21","modified_gmt":"2026-07-05T15:52:21","slug":"coywolf-seo","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/coywolf-seo\/","author":115787,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.128","stable_tag":"1.0.128","tested":"7.0","requires":"7.0","requires_php":"7.4","requires_plugins":null,"header_name":"Coywolf SEO","header_author":"Coywolf","header_description":"An SEO plugin that has exactly what you need, and nothing more.","assets_banners_color":"","last_updated":"2026-07-05 15:52:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/coywolf.com\/notes\/coywolf-seo\/","header_author_uri":"https:\/\/coywolf.com\/jon-henshaw\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":27,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.128":{"tag":"1.0.128","author":"jonhenshaw","date":"2026-07-05 15:52:21"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3596900,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3596900,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"coywolf-seo\/table-of-contents":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"coywolf-seo\/table-of-contents","title":"Table of Contents","category":"design","description":"A table of contents built from the page's headings at view time, so it never goes out of date.","keywords":["toc","table of contents","headings","anchor","jump links","summary"],"textdomain":"coywolf-seo","supports":{"html":false,"anchor":true,"align":["wide"],"color":{"background":true,"text":true,"link":true},"typography":{"fontSize":true,"lineHeight":true},"spacing":{"margin":true,"padding":true}},"attributes":{"title":{"type":"string","default":""},"showTitle":{"type":"boolean","default":true},"titleLevel":{"type":"number","default":2},"levels":{"type":"array","items":{"type":"number"},"default":[2,3]},"listStyle":{"type":"string","default":"none"},"collapsible":{"type":"boolean","default":false},"initiallyCollapsed":{"type":"boolean","default":false},"smoothScroll":{"type":"boolean","default":true},"highlightCurrent":{"type":"boolean","default":false},"minHeadings":{"type":"number","default":2},"scrollOffset":{"type":"number","default":0}},"editorScript":"coywolf-seo-toc-block","editorStyle":"coywolf-seo-toc-editor","style":"coywolf-seo-toc"}},"tagged_versions":["1.0.128"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3596900,"resolution":"1","location":"assets","locale":"","width":1800,"height":945},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3596900,"resolution":"2","location":"assets","locale":"","width":1800,"height":945},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3596900,"resolution":"3","location":"assets","locale":"","width":1800,"height":945},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3596900,"resolution":"4","location":"assets","locale":"","width":1800,"height":945},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3596900,"resolution":"5","location":"assets","locale":"","width":1800,"height":945},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3596900,"resolution":"6","location":"assets","locale":"","width":1800,"height":945},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3596900,"resolution":"7","location":"assets","locale":"","width":1800,"height":945},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3596900,"resolution":"8","location":"assets","locale":"","width":1800,"height":945}},"screenshots":{"1":"The Site Details screen, where the site name, tagline, default Open Graph image, and Organization-or-Person setting (used as the publisher in schema markup) are configured.","2":"The Authors screen, showing the Schema.org Person properties (@id, name, url, description, image) used for the author in Article schema markup, with controls to add, edit, or remove each property.","3":"The Image Text screen, with a Library status panel reporting the total image count and the number missing alt text, titles, captions, and descriptions, plus bulk options for AI-written, WCAG-aligned image text.","4":"The Link Manager's All Links view, listing every internal and external link with its response code, type, and the number of posts and pages where it appears.","5":"The Redirects screen, with the Add a redirect form, a URL tester, and a table of existing redirect rules showing source, target, type, hits, and last-hit date.","6":"The Robots.txt Rules screen in Virtual mode, listing each rule with its description, the robots it applies to, and the resulting allow or disallow directive.","7":"The Settings screen, with an in-page table of contents and the General settings section covering access rights, force-rewrite-titles, meta description, and robots indexing options.","8":"The Import\/Export screen, with controls to export and import plugin settings and author properties as JSON, and a separate section for exporting and importing Robots.txt rules."}},"plugin_section":[],"plugin_tags":[6487,726,1117,186,1557],"plugin_category":[55],"plugin_contributors":[265832],"plugin_business_model":[],"class_list":["post-327271","plugin","type-plugin","status-publish","hentry","plugin_tags-open-graph","plugin_tags-redirects","plugin_tags-schema","plugin_tags-seo","plugin_tags-sitemap","plugin_category-seo-and-marketing","plugin_contributors-jonhenshaw","plugin_committers-jonhenshaw"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/coywolf-seo\/assets\/icon-128x128.png?rev=3596900","icon_2x":"https:\/\/ps.w.org\/coywolf-seo\/assets\/icon-256x256.png?rev=3596900","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/coywolf-seo\/assets\/screenshot-1.png?rev=3596900","caption":"The Site Details screen, where the site name, tagline, default Open Graph image, and Organization-or-Person setting (used as the publisher in schema markup) are configured."},{"src":"https:\/\/ps.w.org\/coywolf-seo\/assets\/screenshot-2.png?rev=3596900","caption":"The Authors screen, showing the Schema.org Person properties (@id, name, url, description, image) used for the author in Article schema markup, with controls to add, edit, or remove each property."},{"src":"https:\/\/ps.w.org\/coywolf-seo\/assets\/screenshot-3.png?rev=3596900","caption":"The Image Text screen, with a Library status panel reporting the total image count and the number missing alt text, titles, captions, and descriptions, plus bulk options for AI-written, WCAG-aligned image text."},{"src":"https:\/\/ps.w.org\/coywolf-seo\/assets\/screenshot-4.png?rev=3596900","caption":"The Link Manager's All Links view, listing every internal and external link with its response code, type, and the number of posts and pages where it appears."},{"src":"https:\/\/ps.w.org\/coywolf-seo\/assets\/screenshot-5.png?rev=3596900","caption":"The Redirects screen, with the Add a redirect form, a URL tester, and a table of existing redirect rules showing source, target, type, hits, and last-hit date."},{"src":"https:\/\/ps.w.org\/coywolf-seo\/assets\/screenshot-6.png?rev=3596900","caption":"The Robots.txt Rules screen in Virtual mode, listing each rule with its description, the robots it applies to, and the resulting allow or disallow directive."},{"src":"https:\/\/ps.w.org\/coywolf-seo\/assets\/screenshot-7.png?rev=3596900","caption":"The Settings screen, with an in-page table of contents and the General settings section covering access rights, force-rewrite-titles, meta description, and robots indexing options."},{"src":"https:\/\/ps.w.org\/coywolf-seo\/assets\/screenshot-8.png?rev=3596900","caption":"The Import\/Export screen, with controls to export and import plugin settings and author properties as JSON, and a separate section for exporting and importing Robots.txt rules."}],"raw_content":"<!--section=description-->\n<p>Coywolf SEO is built on a simple idea: an SEO plugin should give you exactly what you need, and nothing more. No upsells, no nags, no bloat, no features you have to turn off \u2014 just the essentials, done right, with the plugin doing the heavy lifting in the background.<\/p>\n\n<p>Features:<\/p>\n\n<ul>\n<li>Site Details \u2014 one screen for your site's identity: the Site Name and Tagline (editable right there), whether titles append the site name (em dash separated), the default Open Graph image, whether the site represents an Organization (with a full Schema.org property picker whose inputs match each property \u2014 URL, email, date, image upload, structured address and contact point) or a Person, the homepage title and description, and schema type defaults for posts and pages.<\/li>\n<li>Titles \u2014 clean titles composed from your settings. The site name is appended only where you turn it on. A force-rewrite option handles themes that build their own title markup.<\/li>\n<li>Meta description \u2014 by default the homepage uses your description (default: the Tagline), posts and pages use their manual excerpt, and terms use their description; nothing is auto-generated unless you turn on AI meta descriptions (see AI enrichment). One checkbox excludes meta descriptions entirely.<\/li>\n<li>Robots meta \u2014 index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1 by default, each directive toggleable.<\/li>\n<li>Canonical links \u2014 on the homepage, posts, pages, categories, and tags, with pagination handled and a per-post canonical override.<\/li>\n<li>SEO section on posts and pages \u2014 an SEO panel in the block editor's document sidebar (and a classic-editor meta box) to override the schema page\/article type, set Noindex\/Nofollow, or replace the canonical link.<\/li>\n<li>Duplicate Post \u2014 a Duplicate link under each post and page title (right next to Edit) copies it to a new draft: content, excerpt, categories and tags, featured image, page template, and custom fields included \u2014 your SEO settings among them. The draft belongs to whoever made it, WordPress assigns a fresh slug and date, and the original's old-URL redirect history stays where it belongs, so the copy never competes with the original.<\/li>\n<li>Table of Contents block \u2014 builds its list when the page is served, not when the post is saved, so it can never go stale: headings get clean anchor links automatically (hand-set anchors are kept, duplicate headings de-duplicated), headings added by shortcodes and synced patterns are included, and every heading block gets its own \"Exclude from table of contents\" toggle. Pick which heading levels are listed (H2\u2013H6), edit the title and its heading level, choose plain, bulleted, or hierarchical numbering (1, 1.1, 1.2\u2026), make the table collapsible (works without JavaScript), and turn on smooth scrolling (reduced-motion preferences are respected), current-section highlighting while reading, and a scroll offset so sticky headers never cover a jumped-to heading. A minimum-headings threshold leaves the table off short posts, the markup is a semantic nav with properly nested lists, pages with the block declare the tableOfContents accessibility feature in their schema, and a Yoast table-of-contents block converts to this one in one click.<\/li>\n<li>Mobile alternative image \u2014 the core Image block gains an \"Add mobile alternative\" control: pick a phone-specific image (a different crop, dimensions, or content) and the plugin serves it on small screens through a picture element with a max-width: 768px media query, while larger screens keep the desktop image. Because it's a real media query (art direction) rather than a srcset swap, the mobile image is guaranteed below the breakpoint instead of left to the browser's candidate guesswork. The desktop image and its lightbox are untouched, and the breakpoint is filterable.<\/li>\n<li>Schema markup \u2014 one JSON-LD graph per page: WebSite, your Organization (with every property you added) or Person as the publisher, the typed WebPage, the typed Article with its author, and CollectionPage on category and tag archives.<\/li>\n<li>Authors \u2014 pick a user and the plugin imports their account details as Schema.org Person properties; add anything from the full Person catalog. Used as the author in Article markup.<\/li>\n<li>Open Graph \u2014 og: tags on the homepage, posts, pages, categories, and tags, with the featured image falling back to your default Open Graph image. No Twitter\/X tags.<\/li>\n<li>Access rights \u2014 choose whether Editors can manage the plugin alongside Administrators.<\/li>\n<li>Takes over from other SEO plugins \u2014 with Yoast SEO, Rank Math, All in One SEO, SEOPress, or The SEO Framework also active, their front-end output (titles, descriptions, schema, Open Graph, robots, canonical) and their edit-screen boxes and sidebars are suppressed through each plugin's own switches, so nothing is duplicated while you migrate. Their sitemaps and redirects are left running.<\/li>\n<li>Hide the category prefix \u2014 serve category archives at \/news\/ instead of \/category\/news\/, with 301 redirects from the old URLs.<\/li>\n<li>IndexNow \u2014 ping Bing the moment a post or page is published, updated, or deleted. The site key is generated for you and served virtually; no file is written.<\/li>\n<li>Native sitemap exclusions \u2014 drop the Posts, Pages, Categories, or Users sitemaps from WordPress's own \/wp-sitemap.xml; everything not excluded stays exactly as WordPress generates it.<\/li>\n<li>News sitemap \u2014 optionally serve \/coywolf-news-sitemap.xml with articles from the last 48 hours; choose whether posts and\/or pages are included and which categories are in or out.<\/li>\n<li>LLMs.txt &amp; Markdown source endpoints (off by default; under Settings &gt; Discovery) \u2014 make your site agent-readable. When enabled, the plugin serves a spec-conformant \/llms.txt index of your public content (one H2 file-list per post type, plus an optional topic index that groups your articles under the AI-enriched entities they're primarily about \u2014 an entity earns a section once it's the primary subject of a configurable number of articles (default 2), and every link points back at your own pages, not at external knowledge), and exposes a Markdown source for every public page at ...\/index.html.md \u2014 the page's fully-rendered content converted to Markdown from the same render path as the HTML, with YAML frontmatter (title, canonical URL, updated date, licence, and the page's entities) and an X-Markdown-Tokens header. Each page also advertises its Markdown via a  and answers Accept: text\/markdown content negotiation (with Content-Location and Vary: Accept). Everything honors the same visibility as your sitemaps, is built entirely from on-site data with no external calls, and is never written over an llms.txt another plugin already owns. The settings nav groups this with IndexNow and Sitemaps under a new Discovery section.<\/li>\n<li>AI enrichment \u2014 bring your own API key for Claude (Anthropic), OpenAI, or Google Gemini (pick one in Settings) and it analyzes each post in the background as it is published: main subjects land in the Article schema's about property, passing references in mentions, each grounded to a real Wikidata item with its Wikipedia page in sameAs. The model only ever extracts entity names \u2014 real candidates are looked up on Wikidata's public API, the model chooses among them, and the chosen item's type is verified \u2014 so identifiers are never invented. When new entities land, the page's cache is purged so the schema is served immediately. Enrich-all runs go through the selected service's Batch API at roughly half the standard token price, with live progress, pause\/resume\/cancel, and a lifetime average-cost-per-post readout. Turn on automatic meta descriptions and it also writes a faithful sub-200-character summary of each post on publish or update \u2014 used in the meta description, Open Graph, and Article schema \u2014 and the option steps aside whenever meta descriptions are excluded. The key can live in wp-config.php. The AI features use WordPress 7.0's bundled AI client and require WordPress 7.0 or higher.<\/li>\n<li>Image Text \u2014 generate alt text, captions, titles, and descriptions for your Media Library images with the same AI service \u2014 one image at a time from the block editor, or in bulk across the whole library. The bulk run processes in the background (through the Batch API at roughly half price, or in real time on demand), so you can leave the page. Alt text is intentionally left empty for purely decorative images, an accessibility best practice, and the prompt is WCAG-aware. New alt text and captions can propagate into the matching core\/image blocks already in your content, and a \"Fix missing image IDs\" tool re-attaches Media Library IDs to images inserted without one \u2014 converting Custom HTML or classic image figures into real image blocks along the way.<\/li>\n<li>Redirects \u2014 a full redirect manager on one screen: quick-add a rule in seconds (exact or regex with capture groups, query strings ignored\/passed\/matched exactly, 301\/302\/307\/308\/410), test any URL against your rules before trusting the live site, and watch hit counts to see which rules still matter. The moment you delete a published post or page, the plugin asks right there on the list screen what to do with its URL \u2014 mark it gone (410), redirect it, or dismiss \u2014 and pending decisions also wait on the Redirects page. When the Redirection plugin is active, Coywolf SEO takes over URL redirects: Redirection's URL redirects are switched off while this feature is on so they don't conflict with yours, and a notice points it out so you can import its rules and deactivate it (its 404\/410, random, and site-wide HTTPS\/www redirects keep running until you do).<\/li>\n<li>Link Manager \u2014 scans every link in your posts and pages and lists them with their HTTP response, internal\/external type, and the posts and pages each one appears in, so broken links and redirects are easy to spot. Fix them in place \u2014 remove a link, replace a redirect with its destination, or change a link's URL everywhere it appears \u2014 one at a time or in bulk. Ignore individual URLs, whole domains, or wildcard patterns, with a separate Ignored view. After the first analysis the inventory keeps itself current as posts and pages change.<\/li>\n<li>Robots.txt Manager \u2014 manage robots.txt from the WordPress admin as a table of named, plain-English rules. A guided editor builds the correct Disallow\/Allow directive by rule type and targets all robots, custom bots, or whole categories from the bundled Cloudflare Bot Directory; every rule is conflict-checked and testable against a URL before you save \u2014 all powered by a PHP port of Google's open-source Robots.txt Parser and Matcher Library (the Robots Exclusion Protocol \/ RFC 9309 reference implementation Googlebot itself uses), so each rule is validated and previewed exactly the way Google will interpret it: * wildcards, $ end-anchors, percent-encoding, and longest-match Allow\/Disallow precedence all included. Serve robots.txt virtually (WordPress serves it with your managed rules injected) or write a real file with your hand-written lines preserved. On activation it imports and tidies an existing robots.txt. Sitemap URLs and physical\/virtual mode live in Settings; rules import and export as JSON on the Import\/Export page.<\/li>\n<li>Import\/Export \u2014 download the plugin settings, author properties, and redirect rules as JSON and import them on another site. API keys are never exported.<\/li>\n<\/ul>\n\n<h3>Troubleshooting<\/h3>\n\n<ul>\n<li>No new tags on the front end? Purge your page and CDN caches (including host-level edge caching) \u2014 cached pages keep serving pre-activation HTML. The plugin purges the common cache plugins on activation, but host and CDN caches are outside its reach.<\/li>\n<li>No Article schema on a page? Pages default to no Article type (Site Details &gt; Pages); set a default there or override per page in the SEO panel.<\/li>\n<li>No meta description on a post? By default it comes only from a manual excerpt \u2014 turn on AI meta descriptions to generate one automatically, or exclude meta descriptions entirely in Settings.<\/li>\n<li>Nothing at all? The theme must call wp_head() \u2014 all output renders there.<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>Privacy-first: this plugin includes no analytics, no tracking, and no data gathering \u2014 nothing about you, your site, or your visitors is ever collected. Outbound connections happen only for features you turn on, and each is detailed under \"External services\" below: with IndexNow enabled, the changed URL is sent to Microsoft Bing's IndexNow endpoint on publish, update, and delete; with AI enrichment or Image Text enabled, the post title and content \u2014 and, for Image Text, the image itself \u2014 are sent to the AI service you choose (Anthropic, OpenAI, or Google Gemini) using your own API key, and extracted entity names are looked up on Wikidata's public API; and with the Link Manager enabled, the plugin requests the URLs you have linked to in your own content to check whether they still work. Nothing else, nowhere else.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin can connect to the third-party services below. Each is optional and is contacted only when you enable the feature that uses it; none are contacted on a default install.<\/p>\n\n<p>AI provider \u2014 Anthropic, OpenAI, or Google Gemini (you choose one)<\/p>\n\n<p>Used by AI Schema enrichment, AI meta descriptions, and Image Text. When you enable an AI feature and supply your own API key, the plugin sends content to the single service you selected in Settings:<\/p>\n\n<ul>\n<li>AI Schema enrichment sends a post or page's title and text content when it is published or updated (or when you run \"Enrich all content\"), so the model can extract entity names.<\/li>\n<li>AI meta descriptions, when enabled, send a post's content on publish\/update to generate a short summary.<\/li>\n<li>Image Text sends the image (and the surrounding post text for context) when you generate text for an image or run the bulk job.<\/li>\n<\/ul>\n\n<p>Requests are authenticated with the API key you provide and are sent only to the one service you select. Terms and privacy policy for each:<\/p>\n\n<ul>\n<li>Anthropic (Claude) \u2014 Terms: https:\/\/www.anthropic.com\/legal\/commercial-terms \u2014 Privacy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<li>OpenAI \u2014 Terms: https:\/\/openai.com\/policies\/terms-of-use\/ \u2014 Privacy: https:\/\/openai.com\/policies\/privacy-policy\/<\/li>\n<li>Google Gemini API \u2014 Terms: https:\/\/ai.google.dev\/gemini-api\/terms \u2014 Privacy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p>Wikidata (Wikimedia Foundation)<\/p>\n\n<p>Used by AI Schema enrichment to ground entities to real identifiers. The entity-name strings extracted from your content are sent as lookups to Wikidata's public API (https:\/\/www.wikidata.org\/w\/api.php); no API key and no personal data are involved. Terms: https:\/\/foundation.wikimedia.org\/wiki\/Policy:Terms_of_Use \u2014 Privacy: https:\/\/foundation.wikimedia.org\/wiki\/Policy:Privacy_policy<\/p>\n\n<p>IndexNow (Microsoft Bing)<\/p>\n\n<p>Used by the IndexNow feature. When enabled, the URL of a post or page you publish, update, or delete \u2014 together with the auto-generated site key \u2014 is submitted to Bing's IndexNow endpoint (https:\/\/www.bing.com\/indexnow) so search engines can recrawl it promptly. No personal data is sent. About IndexNow: https:\/\/www.indexnow.org\/ \u2014 Microsoft Privacy Statement: https:\/\/privacy.microsoft.com\/privacystatement<\/p>\n\n<p>Link checking (the sites you link to)<\/p>\n\n<p>Not a third-party service, noted here for transparency: when the Link Manager is enabled, it sends HTTP HEAD (and, if needed, GET) requests to the URLs you have linked to in your posts and pages to record each link's HTTP status. Those requests go to the sites you chose to link to \u2014 never to Coywolf or any other service \u2014 and carry only an ordinary request with a plugin User-Agent; no information about your site or your visitors is transmitted.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to wp-content\/plugins\/coywolf-seo or install the zip from Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate it.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20auto-generate%20titles%20and%20meta%20descriptions%3F\"><h3>Does the plugin auto-generate titles and meta descriptions?<\/h3><\/dt>\n<dd><p>Titles are composed from your settings, with the site name appended only where you enable it (a force-rewrite option handles themes that build their own title tag). Meta descriptions are never auto-generated \u2014 the homepage uses the Tagline, posts and pages use their manual Excerpt, terms use their description \u2014 unless you turn on AI meta descriptions or exclude meta descriptions entirely.<\/p><\/dd>\n<dt id=\"why%20don%27t%20my%20pages%20show%20article%20schema%3F\"><h3>Why don't my pages show Article schema?<\/h3><\/dt>\n<dd><p>Each page outputs one JSON-LD graph, but pages default to no Article type. Set a default in Site Details \u2192 Pages, or override it per page in the SEO panel.<\/p><\/dd>\n<dt id=\"which%20ai%20service%20does%20enrichment%20use%2C%20and%20what%20do%20i%20need%3F\"><h3>Which AI service does enrichment use, and what do I need?<\/h3><\/dt>\n<dd><p>Bring your own API key for Claude (Anthropic), OpenAI, or Google Gemini and pick one in Settings (or define it in wp-config.php). The AI features require WordPress 7.0+ because they run on its bundled AI client.<\/p><\/dd>\n<dt id=\"can%20the%20ai%20invent%20entities%20or%20make%20up%20schema%3F\"><h3>Can the AI invent entities or make up schema?<\/h3><\/dt>\n<dd><p>No. The model only extracts entity names; the real items are looked up on Wikidata's public API, the model chooses among them, and the chosen item's type is verified \u2014 so identifiers are never fabricated.<\/p><\/dd>\n<dt id=\"what%20does%20%22enrich%20all%20content%22%20cost%2C%20and%20how%20long%20does%20it%20take%3F\"><h3>What does \"Enrich all content\" cost, and how long does it take?<\/h3><\/dt>\n<dd><p>It runs through your service's Batch API at roughly half the standard token price, in the background, and can take up to an hour. Posts already analyzed with the current settings are skipped, so re-running is inexpensive.<\/p><\/dd>\n<dt id=\"if%20i%20turn%20ai%20enrichment%20off%2C%20do%20i%20lose%20my%20data%3F\"><h3>If I turn AI enrichment off, do I lose my data?<\/h3><\/dt>\n<dd><p>No \u2014 detected entities and generated descriptions and image text are kept and still used. Only your saved API key is deleted (re-enter it when you turn AI back on; a key in wp-config.php is ignored while off).<\/p><\/dd>\n<dt id=\"does%20the%20bulk%20%22write%20image%20text%22%20run%20need%20the%20page%20to%20stay%20open%3F\"><h3>Does the bulk \"Write image text\" run need the page to stay open?<\/h3><\/dt>\n<dd><p>No. It processes in the background on WP-Cron, so you can leave and come back to check progress. On a very low-traffic site, leaving the tab open helps it along.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20batch%20and%20real-time%20image%20text%3F\"><h3>What's the difference between Batch and real-time image text?<\/h3><\/dt>\n<dd><p>Bulk image text defaults to the cheaper Batch API (about half price; results within the hour, up to 24 hours). Tick \"real-time\" for immediate processing at the standard rate. Gemini has no vision Batch API, so it always runs in real time.<\/p><\/dd>\n<dt id=\"why%20is%20some%20image%20alt%20text%20left%20blank%3F\"><h3>Why is some image alt text left blank?<\/h3><\/dt>\n<dd><p>Alt text is intentionally left empty for purely decorative images (an accessibility best practice). Title, caption, and description are always written.<\/p><\/dd>\n<dt id=\"what%20does%20%22fix%20missing%20image%20ids%22%20do%3F\"><h3>What does \"Fix missing image IDs\" do?<\/h3><\/dt>\n<dd><p>Two things, each only when an uploads-folder image exactly matches a Media Library item: it adds the missing attachment ID to in-content images, and it converts Custom HTML or classic image figures into real image blocks. Run Preview first \u2014 it edits post content \u2014 and note that converting drops any custom inline figure styling.<\/p><\/dd>\n<dt id=\"why%20aren%27t%20my%20in-content%20images%20getting%20the%20new%20alt%20text%20and%20captions%3F\"><h3>Why aren't my in-content images getting the new alt text and captions?<\/h3><\/dt>\n<dd><p>Propagation only updates core\/image blocks that reference the file, and only empty fields unless \"Overwrite\" is on. Images added as Custom HTML or by URL aren't matched until you run \"Fix missing image IDs\" first.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20a%20deleted%20post%27s%20url%3F\"><h3>What happens to a deleted post's URL?<\/h3><\/dt>\n<dd><p>The moment you delete a published post or page, the Redirects screen asks what to do with its URL \u2014 mark it gone (410), redirect it, or dismiss. Pending decisions also wait on the Redirects page.<\/p><\/dd>\n<dt id=\"can%20i%20import%20redirects%20from%20another%20plugin%3F\"><h3>Can I import redirects from another plugin?<\/h3><\/dt>\n<dd><p>Yes \u2014 from the Redirection plugin (even when it's deactivated, read straight from the database) and from Yoast SEO Premium. Duplicates are skipped, so importing is safe to re-run.<\/p><\/dd>\n<dt id=\"does%20the%20link%20manager%20re-scan%20everything%20every%20time%3F\"><h3>Does the Link Manager re-scan everything every time?<\/h3><\/dt>\n<dd><p>Only the first analysis is a full scan; after that the inventory keeps itself current as you create, edit, and delete posts. A Throughput setting tunes how hard it scans.<\/p><\/dd>\n<dt id=\"how%20accurate%20is%20the%20robots.txt%20rule%20tester%3F\"><h3>How accurate is the robots.txt rule tester?<\/h3><\/dt>\n<dd><p>It runs on a PHP port of Google's open-source Robots.txt Parser and Matcher Library \u2014 the Robots Exclusion Protocol (RFC 9309) reference implementation Googlebot uses \u2014 so the Test URL result, the conflict warnings, and the redundancy checks all reflect exactly how Google will interpret a rule, including * wildcards, $ end-anchors, percent-encoded paths, and Allow-vs-Disallow longest-match precedence. What the plugin previews is what Googlebot will do.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20virtual%20and%20physical%20robots.txt%3F\"><h3>What's the difference between virtual and physical robots.txt?<\/h3><\/dt>\n<dd><p>Virtual (the default) means WordPress serves robots.txt with your managed rules injected \u2014 no file is written. Physical mode writes a real file and preserves your hand-written lines. On activation, the manager imports and tidies any existing robots.txt.<\/p><\/dd>\n<dt id=\"can%20i%20get%20my%20original%20robots.txt%20back%3F\"><h3>Can I get my original robots.txt back?<\/h3><\/dt>\n<dd><p>Yes. Turning the Robots.txt Manager off \u2014 or deactivating the plugin \u2014 prompts you to restore your original robots.txt or keep the managed rules.<\/p><\/dd>\n<dt id=\"why%20doesn%27t%20the%20table%20of%20contents%20go%20out%20of%20date%3F\"><h3>Why doesn't the table of contents go out of date?<\/h3><\/dt>\n<dd><p>It's built when the page is served, not when you save, so headings added later (including by shortcodes and synced patterns) are always included. Each heading has an \"Exclude from table of contents\" toggle, and a minimum-headings threshold keeps the table off short posts.<\/p><\/dd>\n<dt id=\"how%20is%20the%20mobile%20alternative%20image%20different%20from%20normal%20responsive%20images%3F\"><h3>How is the mobile alternative image different from normal responsive images?<\/h3><\/dt>\n<dd><p>It's true art direction: your phone-specific image is served below 768px through a  media query, so it's guaranteed on small screens rather than left to the browser's srcset guesswork. The breakpoint is filterable.<\/p><\/dd>\n<dt id=\"does%20this%20conflict%20with%20yoast%2C%20rank%20math%2C%20or%20aioseo%3F\"><h3>Does this conflict with Yoast, Rank Math, or AIOSEO?<\/h3><\/dt>\n<dd><p>No. While the other plugin is active, Coywolf SEO suppresses its front-end output and edit-screen boxes through that plugin's own switches, so nothing is duplicated as you migrate \u2014 but it leaves their sitemaps and redirects running.<\/p><\/dd>\n<dt id=\"are%20there%20twitter%2Fx%20meta%20tags%3F\"><h3>Are there Twitter\/X meta tags?<\/h3><\/dt>\n<dd><p>No \u2014 X reads Open Graph, so only og: tags are output. Categories and tags can also carry their own Page Title and Open Graph image, set right on the term screen.<\/p><\/dd>\n<dt id=\"does%20duplicate%20post%20copy%20my%20seo%20settings%3F\"><h3>Does Duplicate Post copy my SEO settings?<\/h3><\/dt>\n<dd><p>Yes \u2014 it copies the content, excerpt, taxonomies, featured image, template, and custom fields, including the SEO meta, into a new draft you own with a fresh slug and date. The original's old-URL redirect history stays with the original.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20turn%20a%20feature%20off%2C%20deactivate%2C%20or%20delete%20the%20plugin%3F\"><h3>What happens to my data if I turn a feature off, deactivate, or delete the plugin?<\/h3><\/dt>\n<dd><p>Turning a feature off keeps all of its data and just hides it (turning AI off also deletes the saved API key). Deactivating keeps everything and only pauses background jobs. Deleting removes all of the plugin's data, so back up first \u2014 but edits the tools made to your content (added image IDs, converted blocks, image text saved to the Media Library) remain, because those live in WordPress itself.<\/p><\/dd>\n<dt id=\"does%20import%2Fexport%20include%20my%20api%20keys%3F\"><h3>Does Import\/Export include my API keys?<\/h3><\/dt>\n<dd><p>No. Settings, author properties, and redirect rules export as JSON; API keys are never exported.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.128<\/h4>\n\n<ul>\n<li>Expand WordPress.org plugin tags for discoverability (#129).<\/li>\n<\/ul>\n\n<h4>1.0.127<\/h4>\n\n<ul>\n<li>Remove redundant drag-to-reorder from the schema property repeaters (#128).<\/li>\n<\/ul>\n\n<h4>1.0.126<\/h4>\n\n<ul>\n<li>Security and accessibility audit: screen-reader support + security hardening (#127).<\/li>\n<\/ul>\n\n<h4>1.0.125<\/h4>\n\n<ul>\n<li>Add per-post Title and Description fields to the SEO panel (#126).<\/li>\n<\/ul>\n\n<h4>1.0.124<\/h4>\n\n<ul>\n<li>Cache the regex-redirect rule set (front-end perf) (#125).<\/li>\n<\/ul>\n\n<h4>1.0.123<\/h4>\n\n<ul>\n<li>Labs: remove \"Block Google from crawling Markdown files\" from AI Discovery (#124).<\/li>\n<\/ul>\n\n<h4>1.0.122<\/h4>\n\n<ul>\n<li>Labs: unchecking the Markdown-block retracts only Googlebot, keeping other bots (#123).<\/li>\n<\/ul>\n\n<h4>1.0.121<\/h4>\n\n<ul>\n<li>Labs: make the AI Discovery Markdown-block idempotent (don't overwrite a customised rule) (#122).<\/li>\n<\/ul>\n\n<h4>1.0.120<\/h4>\n\n<ul>\n<li>Fix broken Robots.txt Manager rule editor (version assets with the live plugin version) (#121).<\/li>\n<\/ul>\n\n<h4>1.0.119<\/h4>\n\n<ul>\n<li>Labs: add \"Block Google from crawling Markdown files\" option to AI Discovery (#120).<\/li>\n<\/ul>\n\n<h4>1.0.118<\/h4>\n\n<ul>\n<li>Scope the redirect-import admin notice to plugin screens (WP.org guideline #11) (#119).<\/li>\n<\/ul>\n\n<h4>1.0.117<\/h4>\n\n<ul>\n<li>WordPress.org review: prefix JS window globals and the model-cache transient (#118).<\/li>\n<\/ul>\n\n<h4>1.0.116<\/h4>\n\n<ul>\n<li>Fix MCP server never registering: defer adapter detection and register the ability category (#117).<\/li>\n<\/ul>\n\n<h4>1.0.115<\/h4>\n\n<ul>\n<li>Expose AI Discovery outputs as MCP tools via the WordPress MCP Adapter (#116).<\/li>\n<\/ul>\n\n<h4>1.0.114<\/h4>\n\n<ul>\n<li>Add AI Discovery (Labs): group OKF + EntityMap + new ARD ai-catalog.json output, with an OKF .tar.gz download and an enrichment-status panel (#115).<\/li>\n<\/ul>\n\n<h4>1.0.113<\/h4>\n\n<ul>\n<li>Add a beaker icon after the Labs submenu label (#114).<\/li>\n<\/ul>\n\n<h4>1.0.112<\/h4>\n\n<ul>\n<li>EntityMap (Labs): publish a spec-conformant EntityMap v1.0 file set (entitymap.json + entitymap.html) of your Wikidata-grounded entities, advertised via llms.txt, a  link, and a robots.txt allowance (#113).<\/li>\n<\/ul>\n\n<h4>1.0.111<\/h4>\n\n<ul>\n<li>llms.txt: bound public cache + purge on rebuild; harden title decode against invalid UTF-8 (#112).<\/li>\n<\/ul>\n\n<h4>1.0.110<\/h4>\n\n<ul>\n<li>Fix: decode HTML entities in titles for llms.txt + .md frontmatter (#111).<\/li>\n<\/ul>\n\n<h4>1.0.109<\/h4>\n\n<ul>\n<li>llms.txt intro: describe the entity topic index when present (#110).<\/li>\n<\/ul>\n\n<h4>1.0.108<\/h4>\n\n<ul>\n<li>Rework llms.txt entities into a topic index of the site's own articles (#109).<\/li>\n<\/ul>\n\n<h4>1.0.107<\/h4>\n\n<ul>\n<li>Fix: \/llms.txt + .md endpoints 404 (rewrite flush timing) (#108).<\/li>\n<\/ul>\n\n<h4>1.0.106<\/h4>\n\n<ul>\n<li>Hide LLMs.txt sub-options until the feature is enabled (#107).<\/li>\n<\/ul>\n\n<h4>1.0.105<\/h4>\n\n<ul>\n<li>Drop the Discovery\/Robots.txt group labels from the settings jump list (#106).<\/li>\n<\/ul>\n\n<h4>1.0.104<\/h4>\n\n<ul>\n<li>Discovery: llms.txt + per-page Markdown source endpoints (#105).<\/li>\n<\/ul>\n\n<h4>1.0.103<\/h4>\n\n<ul>\n<li>Make the OKF Labs panel full-width like the other admin pages (#104).<\/li>\n<\/ul>\n\n<h4>1.0.102<\/h4>\n\n<ul>\n<li>OKF Labs: absolute cross-links + a managed robots.txt Allow rule (#103).<\/li>\n<\/ul>\n\n<h4>1.0.101<\/h4>\n\n<ul>\n<li>Advertise the OKF bundle (llms.txt, head link, robots allowance) (#102).<\/li>\n<\/ul>\n\n<h4>1.0.100<\/h4>\n\n<ul>\n<li>Add Open Knowledge Format (OKF) export as a Labs feature (#101).<\/li>\n<\/ul>\n\n<h4>1.0.99<\/h4>\n\n<ul>\n<li>fix(release): ship .wordpress-org\/ screenshots in the GitHub build (#100).<\/li>\n<\/ul>\n\n<h4>1.0.98<\/h4>\n\n<ul>\n<li>Link Manager: unify 429\/999 as Blocked; serve Documentation screenshots reliably (#99).<\/li>\n<\/ul>\n\n<h4>1.0.97<\/h4>\n\n<ul>\n<li>Fix Documentation Markdown rendering: comments, italics, FAQ, screenshots (#98).<\/li>\n<\/ul>\n\n<h4>1.0.96<\/h4>\n\n<ul>\n<li>Preview chosen images for the image\/logo schema fields, and highlight the parent menu item on hidden admin subpages (#97).<\/li>\n<\/ul>\n\n<h4>1.0.95<\/h4>\n\n<ul>\n<li>Move action buttons below the white panel on the Edit Link, Add\/Edit Rule, and Authors pages (#96).<\/li>\n<\/ul>\n\n<h4>1.0.94<\/h4>\n\n<ul>\n<li>Make admin section cards span the full content width (#95).<\/li>\n<\/ul>\n\n<h4>1.0.93<\/h4>\n\n<ul>\n<li>Make all admin pages stylistically consistent with white card sections (#94).<\/li>\n<\/ul>\n\n<h4>1.0.92<\/h4>\n\n<ul>\n<li>Redirects: offer a 301 when a published post's URL changes (slug or category) (#93).<\/li>\n<\/ul>\n\n<h4>1.0.91<\/h4>\n\n<ul>\n<li>Link Manager: classify anti-bot blocks (999, gated 403\/429) as Blocked instead of broken (#92).<\/li>\n<\/ul>\n\n<h4>1.0.90<\/h4>\n\n<ul>\n<li>Add a whole-file, agent-aware URL tester to the Robots.txt page (#91).<\/li>\n<\/ul>\n\n<h4>1.0.89<\/h4>\n\n<ul>\n<li>Port the full Google RobotsMatcher (whole-file, agent-aware REP evaluation) (#90).<\/li>\n<\/ul>\n\n<h4>1.0.88<\/h4>\n\n<ul>\n<li>Fix redundancy false-positive at the longest-match Allow tie (&gt; -&gt; &gt;=) (#89).<\/li>\n<\/ul>\n\n<h4>1.0.87<\/h4>\n\n<ul>\n<li>Document the Google REP matcher as a Robots.txt Manager feature (#88).<\/li>\n<\/ul>\n\n<h4>1.0.86<\/h4>\n\n<ul>\n<li>Harden the Robots.txt rule checker with Google's REP matcher (ported to PHP) (#87).<\/li>\n<\/ul>\n\n<h4>1.0.85<\/h4>\n\n<ul>\n<li>Document Link Manager link-checking under External services for transparency (#86).<\/li>\n<\/ul>\n\n<h4>1.0.84<\/h4>\n\n<ul>\n<li>Reword title-buffer comment so no literal ob_start() remains in source (#85).<\/li>\n<\/ul>\n\n<h4>1.0.83<\/h4>\n\n<ul>\n<li>Address WordPress.org review: sanitize inputs, drop remote calls, document external services (#84).<\/li>\n<\/ul>\n\n<h4>1.0.82<\/h4>\n\n<ul>\n<li>Fix Link Manager corrupting post content on save (iframes, backslashes) (#83).<\/li>\n<\/ul>\n\n<h4>1.0.81<\/h4>\n\n<ul>\n<li>Fix Bulk write image text stripping iframes from Custom HTML blocks (#82).<\/li>\n<\/ul>\n\n<h4>1.0.80<\/h4>\n\n<ul>\n<li>Detect and take over the Redirection plugin's URL redirects (#81).<\/li>\n<\/ul>\n\n<h4>1.0.79<\/h4>\n\n<ul>\n<li>Updater: run GitHub release checks in the background so the Updates screen never hangs (#80).<\/li>\n<\/ul>\n\n<h4>1.0.78<\/h4>\n\n<ul>\n<li>Add WordPress.org plugin directory screenshots and captions (#79).<\/li>\n<\/ul>\n\n<h4>1.0.77<\/h4>\n\n<ul>\n<li>WordPress.org compliance: Plugin Check passes 0 errors \/ 0 warnings (#78).<\/li>\n<\/ul>\n\n<h4>1.0.76<\/h4>\n\n<ul>\n<li>Share a background-job trait between the Enrich and Image Text bulk workers (#77).<\/li>\n<\/ul>\n\n<h4>1.0.75<\/h4>\n\n<ul>\n<li>Share the recursive core\/image block walker (ID fixer + propagation) (#76).<\/li>\n<\/ul>\n\n<h4>1.0.74<\/h4>\n\n<ul>\n<li>AI client cleanups: shared model cache + single flush, batch factory, shared price lookup (#75).<\/li>\n<\/ul>\n\n<h4>1.0.73<\/h4>\n\n<ul>\n<li>Add name\/url\/@id sub-fields to Person and Organization entity references (#74).<\/li>\n<\/ul>\n\n<h4>1.0.72<\/h4>\n\n<ul>\n<li>Add a Frequently Asked Questions section to the readme (#73).<\/li>\n<\/ul>\n\n<h4>1.0.71<\/h4>\n\n<ul>\n<li>Bulk Image Text: larger default batch size (10 to 25) for faster runs (#72).<\/li>\n<\/ul>\n\n<h4>1.0.70<\/h4>\n\n<ul>\n<li>Fix missing image IDs: also convert Custom HTML\/classic image figures to image blocks (#71).<\/li>\n<\/ul>\n\n<h4>1.0.69<\/h4>\n\n<ul>\n<li>Harden background Image Text: run-replace token, safe Resume, cancelled cleanup (#70).<\/li>\n<\/ul>\n\n<h4>1.0.68<\/h4>\n\n<ul>\n<li>Bulk Image Text runs in the background (WP-Cron) so you can leave the page (#69).<\/li>\n<\/ul>\n\n<h4>1.0.67<\/h4>\n\n<ul>\n<li>Add \"Fix missing image IDs\" jump link to the Settings TOC list (#68).<\/li>\n<\/ul>\n\n<h4>1.0.66<\/h4>\n\n<ul>\n<li>Image Text: skip entity enrichment on propagation, add post title to prompt; ID fixer preview samples (#67).<\/li>\n<\/ul>\n\n<h4>1.0.65<\/h4>\n\n<ul>\n<li>Add an attachment-ID fixer for in-content images (Settings page) (#66).<\/li>\n<\/ul>\n\n<h4>1.0.64<\/h4>\n\n<ul>\n<li>Image Text editor panel: also show for images without an attachment id (#65).<\/li>\n<\/ul>\n\n<h4>1.0.63<\/h4>\n\n<ul>\n<li>Image Text: add surrounding-article context with the image's position marked (#64).<\/li>\n<\/ul>\n\n<h4>1.0.62<\/h4>\n\n<ul>\n<li>Fix robots.txt restore prompt: show in virtual mode, save-time Cancel, button style (#63).<\/li>\n<\/ul>\n\n<h4>1.0.61<\/h4>\n\n<ul>\n<li>Show News sitemap Include\/Categories rows only when News is enabled (#62).<\/li>\n<\/ul>\n\n<h4>1.0.60<\/h4>\n\n<ul>\n<li>Ask to restore robots.txt when turning off the manager or deactivating the plugin (#61).<\/li>\n<\/ul>\n\n<h4>1.0.59<\/h4>\n\n<ul>\n<li>Fix Gemini image-text failures and the misleading $0.00 bulk estimate (#60).<\/li>\n<\/ul>\n\n<h4>1.0.58<\/h4>\n\n<ul>\n<li>Add real-time vs batch processing choice for bulk Enrich and Image Text (#59).<\/li>\n<\/ul>\n\n<h4>1.0.57<\/h4>\n\n<ul>\n<li>Fix WordPress.org file-type compliance (extension-less + dev files) (#58).<\/li>\n<\/ul>\n\n<h4>1.0.56<\/h4>\n\n<ul>\n<li>Hide core image alt field via JS so it works in every browser\/Gutenberg version (#57).<\/li>\n<\/ul>\n\n<h4>1.0.55<\/h4>\n\n<ul>\n<li>Hide core image alt field without relying on :has() (older-browser fallback) (#56).<\/li>\n<\/ul>\n\n<h4>1.0.54<\/h4>\n\n<ul>\n<li>Add a global \"Scroll margin top\" setting for Table of Contents jump-link offset (#55).<\/li>\n<\/ul>\n\n<h4>1.0.53<\/h4>\n\n<ul>\n<li>Image Text: provider-aware Generate button, hide redundant core alt when AI active, rename section to \"Image Text\" (#54).<\/li>\n<\/ul>\n\n<h4>1.0.52<\/h4>\n\n<ul>\n<li>Settings: add a jump-link list of all sections, name the first \"General settings\" (#53).<\/li>\n<\/ul>\n\n<h4>1.0.51<\/h4>\n\n<ul>\n<li>Add OpenAI + Google Gemini AI providers (selectable), require WP 7.0, Image Text + Robots settings fixes (#52).<\/li>\n<\/ul>\n\n<h4>1.0.50<\/h4>\n\n<ul>\n<li>Port the Robots.txt Manager into Coywolf SEO (#51).<\/li>\n<\/ul>\n\n<h4>1.0.49<\/h4>\n\n<ul>\n<li>Link Manager UI: empty Ignored table, inline right-aligned ignore-rule form, rename Add rule button (#50).<\/li>\n<\/ul>\n\n<h4>1.0.48<\/h4>\n\n<ul>\n<li>Add Link Manager (ported) with Link Manager + Redirects toggles, SEO-plugin interop, and up\/down property reorder icon (#49).<\/li>\n<\/ul>\n\n<h4>1.0.47<\/h4>\n\n<ul>\n<li>Add \"Turn off features\" toggles (AI enrichment, Schema.org, Sitemaps) and admin UX improvements (#48).<\/li>\n<\/ul>\n\n<h4>1.0.46<\/h4>\n\n<ul>\n<li>Add Image Text: Claude-written alt text, titles, captions, and descriptions for the Media Library (#47).<\/li>\n<\/ul>\n\n<h4>1.0.45<\/h4>\n\n<ul>\n<li>Harden JSON-LD XSS and object-injection, fix bulk-scan N+1, improve admin accessibility (#46).<\/li>\n<\/ul>\n\n<h4>1.0.44<\/h4>\n\n<ul>\n<li>Mobile alternative image: serve via a  media query so it displays on mobile (#45).<\/li>\n<\/ul>\n\n<h4>1.0.43<\/h4>\n\n<ul>\n<li>Add a mobile alternative image option to the Image block (#44).<\/li>\n<\/ul>\n\n<h4>1.0.42<\/h4>\n\n<ul>\n<li>Settings: detailed wp-config.php key instructions + API connection status indicator (#43).<\/li>\n<\/ul>\n\n<h4>1.0.41<\/h4>\n\n<ul>\n<li>Move the Test API access button to the end of the AI enrichment settings (#42).<\/li>\n<\/ul>\n\n<h4>1.0.40<\/h4>\n\n<ul>\n<li>Fix Settings page not saving (Save button orphaned by a nested form) (#41).<\/li>\n<\/ul>\n\n<h4>1.0.39<\/h4>\n\n<ul>\n<li>Add a Duplicate Post feature (#40).<\/li>\n<\/ul>\n\n<h4>1.0.38<\/h4>\n\n<ul>\n<li>Table of Contents: rename the title from block settings (#39).<\/li>\n<\/ul>\n\n<h4>1.0.37<\/h4>\n\n<ul>\n<li>Table of Contents block for posts and pages (#38).<\/li>\n<\/ul>\n\n<h4>1.0.36<\/h4>\n\n<ul>\n<li>Zero-stale estimate never claims a run is free (#37).<\/li>\n<\/ul>\n\n<h4>1.0.35<\/h4>\n\n<ul>\n<li>Re-analyze all checkbox on bulk enrichment (#36).<\/li>\n<\/ul>\n\n<h4>1.0.34<\/h4>\n\n<ul>\n<li>Bulk controls update in place \u2014 no page refresh (#35).<\/li>\n<\/ul>\n\n<h4>1.0.33<\/h4>\n\n<ul>\n<li>Pre-run cost estimator with live model preview, and an API access test (#34).<\/li>\n<\/ul>\n\n<h4>1.0.32<\/h4>\n\n<ul>\n<li>Right-size batch token allowances so the upfront credit check passes (#33).<\/li>\n<\/ul>\n\n<h4>1.0.31<\/h4>\n\n<ul>\n<li>Bulk enrichment runs exclusively through the Message Batches API (50% token price) with usage\/cost telemetry (#32).<\/li>\n<\/ul>\n\n<h4>1.0.30<\/h4>\n\n<ul>\n<li>Bulk enrichment: surface failures and auto-pause on a failure streak (#31).<\/li>\n<\/ul>\n\n<h4>1.0.29<\/h4>\n\n<ul>\n<li>Cancel is a real button beside Resume (#30).<\/li>\n<\/ul>\n\n<h4>1.0.28<\/h4>\n\n<ul>\n<li>Bulk enrichment: Stop pauses with Resume and Cancel; Cancel truly kills the run (#29).<\/li>\n<\/ul>\n\n<h4>1.0.27<\/h4>\n\n<ul>\n<li>Parallel bulk enrichment via loopback worker fan-out (#28).<\/li>\n<\/ul>\n\n<h4>1.0.26<\/h4>\n\n<ul>\n<li>Coywolf logomark as the admin menu icon (#27).<\/li>\n<\/ul>\n\n<h4>1.0.25<\/h4>\n\n<ul>\n<li>Bulk enrich-all with live progress, and gate schema entities on Entity detection (#26).<\/li>\n<\/ul>\n\n<h4>1.0.24<\/h4>\n\n<ul>\n<li>Claude model picker in AI enrichment settings (#25).<\/li>\n<\/ul>\n\n<h4>1.0.23<\/h4>\n\n<ul>\n<li>Native sitemap exclusions: Posts, Pages, Categories, and Users (#24).<\/li>\n<\/ul>\n\n<h4>1.0.22<\/h4>\n\n<ul>\n<li>Rules table toolbar matches the Posts list table (#23).<\/li>\n<\/ul>\n\n<h4>1.0.21<\/h4>\n\n<ul>\n<li>Import redirects from Redirection and Yoast SEO Premium (#22).<\/li>\n<\/ul>\n\n<h4>1.0.20<\/h4>\n\n<ul>\n<li>AI description replaces the excerpt, settings reorder\/rename, and term field refinements (#21).<\/li>\n<\/ul>\n\n<h4>1.0.19<\/h4>\n\n<ul>\n<li>Redirects polish: green\/red state dots and equal-width panels (#20).<\/li>\n<\/ul>\n\n<h4>1.0.18<\/h4>\n\n<ul>\n<li>Per-term Page Title and Open Graph image for categories and tags (#19).<\/li>\n<\/ul>\n\n<h4>1.0.17<\/h4>\n\n<ul>\n<li>AI meta descriptions: settings option with live exclude toggle, 200-char cap, regenerated on publish\/update (#18).<\/li>\n<\/ul>\n\n<h4>1.0.16<\/h4>\n\n<ul>\n<li>Rules table: search, filters, pagination, and bulk actions; slim the deletion notice (#17).<\/li>\n<\/ul>\n\n<h4>1.0.15<\/h4>\n\n<ul>\n<li>Remove the Google Knowledge Graph functionality (#16).<\/li>\n<\/ul>\n\n<h4>1.0.14<\/h4>\n\n<ul>\n<li>Align the deleted-URL decision actions on one centered line (#15).<\/li>\n<\/ul>\n\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>Send the site as referer on Knowledge Graph lookups, and append the site name to og:title (#14).<\/li>\n<\/ul>\n\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>Surface deleted-URL decisions on the list screens, and remove the 404 log (#13).<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li>Re-analyze on config change and on demand, surface Knowledge Graph errors, and add a key setup walkthrough (#12).<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>Add the redirect manager: rules engine, deleted-content decisions, 404 log, and a single-screen UI (#11).<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Wikipedia + Google Knowledge Graph entity enrichment, cache bust on entities, and editor panel polish (#10).<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Raise the Anthropic request timeout past WordPress's 5-second default (#9).<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Fix AI enrichment on WP 7.0, double-quote robots meta, editable @id, and select-to-add property picker (#8).<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Editor SEO panel, SEO-plugin editor suppression, schema fixes, and Site Details\/Settings UX (#7).<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Add AI Schema enrichment with Wikidata grounding, and settings Import\/Export (#6).<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Add IndexNow pings to Bing and the optional News XML sitemap (#5).<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Suppress other SEO plugins' output and add category prefix removal (#4).<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Add schema markup, Open Graph metadata, and the Authors page (#3).<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Add Site Details, Settings, titles, meta description, robots, canonical, and the SEO post\/page section (#2).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: plugin foundation and scaffolding.<\/li>\n<\/ul>","raw_excerpt":"An SEO plugin that has exactly what you need, and nothing more.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/327271","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=327271"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jonhenshaw"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=327271"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=327271"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=327271"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=327271"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=327271"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=327271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}