{"id":372598,"date":"2026-09-22T10:47:18","date_gmt":"2026-09-22T10:47:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/snippetgrove-ai-seo-metadata\/"},"modified":"2026-09-22T10:47:00","modified_gmt":"2026-09-22T10:47:00","slug":"snippetgrove","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/snippetgrove\/","author":23539523,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.56.0","stable_tag":"0.56.0","tested":"7.1.2","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"SnippetGrove \u2013 AI SEO Metadata","header_author":"WP Shelf","header_description":"Bulk AI SEO titles, meta descriptions and image alt text for WordPress. Writes into the SEO plugin you already use.","assets_banners_color":"3f807b","last_updated":"2026-09-22 10:47:00","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":42,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","changelog"],"tags":{"0.56.0":{"tag":"0.56.0","author":"wpshelf","date":"2026-09-22 10:47:00","revision":3707098}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3707097,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3707097,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3707097,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3707097,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3707097,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.56.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3707097,"resolution":"1","location":"assets","locale":"","width":1280,"height":1384},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3707097,"resolution":"2","location":"assets","locale":"","width":1280,"height":606},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3707097,"resolution":"3","location":"assets","locale":"","width":1280,"height":2401}},"screenshots":{"1":"SEO coverage \u2014 how many published pages have no meta description or SEO title, per post type, counted through whichever SEO plugin the site runs","2":"Missing metadata \u2014 the pages behind a number, with a box to write the field on the spot","3":"Settings \u2014 which post types are counted, who may generate, and what is left alone"}},"plugin_section":[],"plugin_tags":[2353,17214,156452,5777,186],"plugin_category":[55],"plugin_contributors":[274470],"plugin_business_model":[],"class_list":["post-372598","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-alt-text","plugin_tags-bulk-editor","plugin_tags-meta-description","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-wpshelf","plugin_committers-wpshelf"],"banners":{"banner":"https:\/\/ps.w.org\/snippetgrove\/assets\/banner-772x250.png?rev=3707097","banner_2x":"https:\/\/ps.w.org\/snippetgrove\/assets\/banner-1544x500.png?rev=3707097","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/snippetgrove\/assets\/icon.svg?rev=3707097","icon":"https:\/\/ps.w.org\/snippetgrove\/assets\/icon.svg?rev=3707097","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/snippetgrove\/assets\/screenshot-1.png?rev=3707097","caption":"SEO coverage \u2014 how many published pages have no meta description or SEO title, per post type, counted through whichever SEO plugin the site runs"},{"src":"https:\/\/ps.w.org\/snippetgrove\/assets\/screenshot-2.png?rev=3707097","caption":"Missing metadata \u2014 the pages behind a number, with a box to write the field on the spot"},{"src":"https:\/\/ps.w.org\/snippetgrove\/assets\/screenshot-3.png?rev=3707097","caption":"Settings \u2014 which post types are counted, who may generate, and what is left alone"}],"raw_content":"<!--section=description-->\n<p>SnippetGrove finds missing SEO metadata and lets you write it into the SEO plugin you\nalready use. The local audit and manual editor are free and do not require an\naccount. Optional AI generation uses the WP Shelf service and a separate SnippetGrove\nlicense. SnippetGrove does not replace your SEO plugin's sitemaps, redirects or schema.<\/p>\n\n<p>Implemented:<\/p>\n\n<ul>\n<li>Detection of the active SEO plugin (Yoast SEO, Rank Math, All in One SEO, SEOPress) with a fallback for sites running none<\/li>\n<li>Reading and writing SEO titles and meta descriptions through whichever of those is active<\/li>\n<li>A coverage audit counting published posts with no meta description or title, per post type, plus images with no alt text<\/li>\n<li>The same count for category, tag and product-category archives, on Yoast, Rank Math and SEOPress<\/li>\n<li>Bulk AI generation of SEO titles and meta descriptions, planned and costed before a run is dispatched<\/li>\n<li>The same for Open Graph and X card titles and descriptions, on Yoast, Rank Math, SEOPress and All in One SEO<\/li>\n<li>Bulk AI image alt text, with decorative images detected and left alone<\/li>\n<li>Pages you can exclude from generation, with your front page protected by default<\/li>\n<li>A review queue with a decision per item, applied into the host SEO plugin's own fields<\/li>\n<li>Rollback of a whole run from a write journal, so a batch you dislike is undoable<\/li>\n<li>Admin screens for coverage, the gaps behind every number, and a run, plus REST routes for the same<\/li>\n<li>WP-CLI: <code>wp snippetgrove audit<\/code>, <code>generate<\/code>, <code>status<\/code>, <code>apply<\/code>, <code>revert<\/code>, <code>export<\/code> and <code>import<\/code><\/li>\n<li>A portable configuration file \u2014 set SnippetGrove up once, apply it to every site you run<\/li>\n<li>Reviewing a run in a spreadsheet: export to CSV, approve or edit in bulk, import the decisions back<\/li>\n<li>License activation against the WP Shelf licensing service<\/li>\n<\/ul>\n\n<p>Hosted generation requires a WP Shelf license and an enabled generation service.\nHosted generation is enabled for activated licenses. Public licensing enrollment\nis not yet open. Local audits and manual editing do not\ndepend on it.<\/p>\n\n<p>Not included:<\/p>\n\n<ul>\n<li>Per-language metadata via Gloty<\/li>\n<\/ul>\n\n<p>Nothing in this plugin claims to influence whether any AI answer engine cites a\nsite. That is not measurable from inside WordPress and will not be claimed.<\/p>\n\n<h4>What the optional report sends<\/h4>\n\n<p>No usage report is sent unless you enable it in Settings. This is independent\nof licensing and generation requests. Its JSON payload contains the product\nidentifier and the following data:<\/p>\n\n<ul>\n<li>Which SEO plugin is active, and how many others compete with it<\/li>\n<li>The number of counted post types, how many published items exist, and how many\nhave no SEO title or meta description, as site-wide totals rather than per item<\/li>\n<li>How many images exist and how many have no alt text<\/li>\n<li>Your WordPress, PHP and SnippetGrove versions, your site's locale, and whether\nWordPress considers the site production, staging or local<\/li>\n<li>A one-way hash identifying this installation, salted with a random value\ngenerated on your site and never sent. It lets one site's weekly reports be\ncounted as one site; it cannot be turned back into an address<\/li>\n<\/ul>\n\n<p>Not included in the usage-report payload: your site address, any e-mail address, any user account, any post,\ntitle, description or other content, and your license key. Turning the setting\noff stops the weekly job immediately; uninstalling deletes the salt, so a later\nreinstall is a different installation as far as we can tell. As with any HTTPS\nrequest, the receiving server can see your server's network address; the payload\ndoes not make the connection anonymous.<\/p>\n\n<p>Why we ask: which SEO plugins are really out there decides which of them gets\nfixed first, and the real size of the metadata gap is what the plan sizes have\nto be priced against. Both are currently guesses.<\/p>\n\n<p>Full documentation, including what each coverage number counts and exactly what leaves your site: https:\/\/wp-shelf.com\/snippetgrove\/docs<\/p>\n\n<h3>External services<\/h3>\n\n<p>SnippetGrove cannot generate metadata without an external service, because writing a\nmeta description is not something WordPress can do locally. This section\ndescribes every external request the plugin makes, what it sends, and when.<\/p>\n\n<p>The coverage audit and manual metadata editor run locally. License requests\nstart when you activate a license; generation requests start when you start a\nrun or separately enable generate-on-publish. Usage reports require their own\nopt-in. Installing the plugin alone starts none of these external requests.<\/p>\n\n<p><strong>1. The WP Shelf service<\/strong><\/p>\n\n<p>Generation is performed by the hosted WP Shelf service. The plugin does not\ncontact AI providers directly; it sends a run's items to the service, which\nselects and calls a provider on your behalf and delivers the results back.<\/p>\n\n<ul>\n<li>Service host: <code>https:\/\/gloty-api.wp-shelf.com<\/code> (overridable by defining the <code>SNIPPETGROVE_SERVICE_URL<\/code> constant, for example to point at a self-hosted instance).<\/li>\n<li>What is sent, for generation: the selected content's title, excerpt and bounded body text, post type, language, taxonomy terms, author-set focus keyphrase and relevant product attributes, site name and tagline, page URL, requested fields and existing SEO\/social values, item and batch identifiers, your site URL and license key. Image-alt requests include the image URL, dimensions and the surrounding title\/caption\/context so the provider can inspect and describe the image. Developers can customize context with the <code>snippetgrove_generation_context<\/code> filter.<\/li>\n<li>What is sent, for licensing: your license key, site URL, product identifier and, on activation, plugin version. The service records generated-item usage against the license.<\/li>\n<li>When: after you start a run or opt into generate-on-publish, while background jobs dispatch batches and poll for their results, and when activating, checking or deactivating a license. Cached license checks can occur when using the admin without starting a run.<\/li>\n<li>Who: the WP Shelf service, operated by WP Shelf.<\/li>\n<\/ul>\n\n<p>Generation is metered per requested field: generating a title and a description\nfor one page uses two items. Failed or declined items are not billable; accepting\nor rejecting a successful suggestion does not undo the generation cost.\n* Terms of service: https:\/\/wp-shelf.com\/terms\n* Privacy policy: https:\/\/wp-shelf.com\/privacy<\/p>\n\n<p>The generation implementation passes content to OpenAI. The plugin contacts\nWP Shelf, not OpenAI directly; license keys authenticate WP Shelf requests and\nare not part of the provider's generation prompt. OpenAI's terms apply:<\/p>\n\n<ul>\n<li>OpenAI \u2014 https:\/\/openai.com\/policies\/terms-of-use \/ https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<\/ul>\n\n<p><strong>2. Optional usage reporting<\/strong><\/p>\n\n<p>Off unless you switch it on, and described under \"What the optional report sends\"\nabove. Once enabled, a weekly background request goes to\n    https:\/\/gloty-api.wp-shelf.com\/v1\/telemetry (or your configured service host),\noperated by WP Shelf under the terms and privacy policy above. Its payload has\nno content, site URL or license key. Disabling it stops future reports.<\/p>\n\n<p><strong>Not an external service:<\/strong> to check that your SEO plugin really rendered what\nSnippetGrove wrote, the plugin fetches one of <em>your own<\/em> pages from your own site. This\nmay pass through your site's CDN or reverse proxy, but no page content is sent\nto WP Shelf or an AI provider by that check.<\/p>\n\n<p>SnippetGrove does not send analytics or usage tracking anywhere else.<\/p>\n\n<h4>Keeping your data when you uninstall<\/h4>\n\n<p>Deleting the plugin removes everything it stored, which is the right default \u2014 a\nplugin you have deleted should not leave rows behind. But it also removes your run history and the write journal an undo reads from.<\/p>\n\n<p>If you are deleting the plugin to troubleshoot and intend to reinstall, add this\nto <code>wp-config.php<\/code> first:<\/p>\n\n<pre><code>define( 'SNIPPETGROVE_KEEP_DATA', true );\n<\/code><\/pre>\n\n<p>Uninstalling then leaves your data in place, and a reinstall picks it up where it\nleft off. Remove the line when you want a genuine clean removal.<\/p>\n\n<h3>Security<\/h3>\n\n<p>Found a security issue? Please email hello@wp-shelf.com rather than opening a\npublic support thread \u2014 a forum post is world-readable the moment you send it,\non a plugin installed on other people's sites. You will get an acknowledgement\nwithin 72 hours, and credit in the changelog unless you would rather not have it.<\/p>\n\n<h3>Source code<\/h3>\n\n<p>Readable JavaScript source is included in src\/ and shared-js\/, including the shared\nWP Shelf packages compiled into build\/. The ZIP includes package.json and\nwebpack.config.js. See shared-js\/README.md for rebuilding with Node.js and npm;\nno private repository or workspace checkout is required. WordPress supplies the\nReact and WordPress browser libraries used by the compiled admin interface.<\/p>\n\n<!--section=changelog-->\n<h4>0.56.0<\/h4>\n\n<ul>\n<li>Changed: <code>wp snippetgrove export<\/code> and <code>wp snippetgrove settings-export<\/code> now always write to standard output, and the <code>--file<\/code> option is gone. Redirect to save it: <code>wp snippetgrove export 12 &gt; review.csv<\/code>. A plugin should not write files to a path of its own choosing, and the shell already does this better.<\/li>\n<\/ul>\n\n<h4>0.55.1<\/h4>\n\n<ul>\n<li>Fixed: generation no longer sends the contents of inline scripts, styles and noscript blocks in a post to the model as if they were page text. A tracking snippet or a style block in a post's content used to reach the service as prose, costing tokens and muddying the generated title or description.<\/li>\n<\/ul>\n\n<h4>0.55.0<\/h4>\n\n<ul>\n<li>Renamed the plugin to SnippetGrove across its code, data, commands, website, documentation and WordPress.org listing.<\/li>\n<li>Retained the complete metadata audit, manual editor, hosted generation, review and undo feature set from the release candidate.<\/li>\n<\/ul>\n\n<h4>0.54.4<\/h4>\n\n<ul>\n<li>Undo every available write in large runs, preserve newer edits, and resume safely after an interrupted undo.<\/li>\n<li>Stop generation and scheduled or forced writes if the active SEO plugin changes after selection.<\/li>\n<li>Applied X metadata now overrides Rank Math or AIOSEO social inheritance. Undo restores the original setting after both X fields are restored.<\/li>\n<li>Undo preserves newer manual edits to metadata and image alt text.<\/li>\n<li>Keep partially delivered batches in recovery until missing results arrive or the recovery deadline passes, without resending a smaller batch under a new billing key.<\/li>\n<li>Recover interrupted dispatch requests and count overlapping result deliveries only once.<\/li>\n<li>Pause for a service review with saved results and an explicit Try again action when generation safety checks require operator attention.<\/li>\n<li>Continue recovering older runs with multiple batches in flight without requiring an open admin screen.<\/li>\n<\/ul>\n\n<h4>0.54.3<\/h4>\n\n<ul>\n<li>Match the admin accent to the teal SnippetGrove icon and website.<\/li>\n<li>Guide new installations to license settings before creating a hosted generation run. Local audits and manual editing remain free.<\/li>\n<li>Show taxonomy coverage in the interactive dashboard, including hosts where it cannot be measured.<\/li>\n<li>Stop retrying malformed generation acknowledgements after the normal retry budget, preserving the batch for safe replay.<\/li>\n<li>Bound polling when completed jobs cannot return results, while retaining late results that are available.<\/li>\n<\/ul>\n\n<h4>0.54.2<\/h4>\n\n<ul>\n<li>Fixed hosted generation and result polling on fresh installs with no saved server URL.<\/li>\n<li>Fixed undo for native metadata and empty fields, plus selection, review and undo of social metadata.<\/li>\n<li>Refresh coverage after manual metadata saves so the last fixed gap does not show a stale-count warning.<\/li>\n<li>Improved request-input sanitization and documented temporary CSV stream handling.<\/li>\n<li>Included shared JavaScript sources and standalone build instructions in the plugin ZIP.<\/li>\n<li>Clarified external-service requests and privacy disclosures.<\/li>\n<li>Verified clean installation and removal on WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>0.54.0<\/h4>\n\n<ul>\n<li>Added JavaScript search, sorting and pagination for admin data tables.<\/li>\n<li>Navigate between plugin subpages asynchronously, with Back\/Forward support.<\/li>\n<\/ul>\n\n<p>Earlier release notes are included in CHANGELOG.md.<\/p>","raw_excerpt":"Bulk AI SEO titles, meta descriptions and image alt text, written into the SEO plugin you already use.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/372598","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=372598"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpshelf"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=372598"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=372598"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=372598"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=372598"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=372598"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=372598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}