Description
SeoVision Publisher connects the SeoVision app to WordPress for controlled article draft creation, scheduled publishing, and live publishing.
This plugin is intended to work with the SeoVision service. The service prepares article content, SEO metadata, structured data, and image references, then sends them to WordPress through authenticated REST requests.
The plugin currently:
- Registers REST-visible post meta fields for article identifiers, SEO metadata, JSON-LD, and media maps.
- Registers an authenticated REST endpoint for idempotent draft, scheduled, and publish flows, for posts and, from 0.14.0, pages.
- Tells IndexNow search engines (such as Bing and Yandex) the address of each SeoVision post or page the moment it goes live.
- Answers when a post SeoVision published last changed on your site, so SeoVision can tell whether you changed it before it updates a live article for a search query.
- Stores article JSON-LD as post meta and injects it into the page head on single post pages, pointed at the post’s real permalink.
- Prints the article’s SEO title, meta description and Open Graph / Twitter card tags when no SEO plugin is active. With Yoast SEO or Rank Math active, it fills that plugin’s SEO title, meta description and focus keyword fields instead, and with another SEO plugin active it prints nothing, so a page never carries two descriptions.
- Downloads approved article images into the WordPress Media Library and stores attachment IDs in a media map.
- Rewrites article HTML and JSON-LD image URLs to WordPress Media Library URLs.
- Attributes each post to an existing WordPress user you choose in SeoVision.
- With WooCommerce, and only after you allow it, lets SeoVision read your orders and the source WooCommerce recorded for each of them, so SeoVision can show you which sales came from organic search and AI assistants.
- Only after you allow it, applies the technical SEO fixes you confirm in SeoVision, with a backup of every field on your site that you can download or restore yourself.
Every request is authorized by the integration token you paste on the plugin’s settings page. Reading WooCommerce orders also needs your permission: an administrator allows it on the same page and can stop it there at any time. SeoVision can keep articles as drafts, schedule them for the requested WordPress site date/time, or publish them immediately.
WooCommerce orders: on a store running WooCommerce, the plugin’s settings page has a WooCommerce orders section. Until an administrator presses “Allow SeoVision to read orders” there, SeoVision cannot read a single order. Once allowed, SeoVision reads, for each order, the order number, dates, status, totals and refunds, the products, the source WooCommerce’s own order attribution recorded for the visit before the purchase (the referring website, campaign tags and the path of the first page visited, never its query string), and the buyer’s name, email address, phone number and shipping address. From the billing address it reads only the country, region and city. Press “Stop sharing orders” and SeoVision deletes the orders it holds within an hour. The plugin also adds a suggested paragraph to Settings Privacy Policy Guide, and takes part in Tools Export Personal Data and Erase Personal Data: erasing a customer’s data makes SeoVision delete its copy of that customer’s orders.
Technical SEO fixes: SeoVision checks your site for technical SEO problems: crawlers blocked in robots.txt, a site hidden from search engines, empty, repeated or overlong titles and descriptions, wrong canonical addresses, images without alt text, a missing business markup or llms.txt, and broken addresses that still get visits. It proposes fixes in batches. Until an administrator presses “Allow SeoVision to apply confirmed fixes” on the plugin’s settings page, the plugin changes nothing, and even then a batch is applied only after you confirm it in SeoVision. Before a batch is applied, the plugin saves a backup of every field it touches on your own site. A field is changed only if it still holds the value SeoVision saw, so your own later edits are never overwritten, and a rollback puts a field back only while it still holds SeoVision’s value. Each backup can be downloaded or restored from the settings page without SeoVision. With Yoast SEO or Rank Math active, titles, descriptions, canonical addresses and noindex are written into that plugin’s own fields. Without an SEO plugin, the plugin prints them itself. With All in One SEO, SEOPress or The SEO Framework active, only the site-wide fixes apply. The site-wide fixes (crawler groups added to the virtual robots.txt, /llms.txt, the business markup, redirects of broken addresses, noindex on filter addresses, the “Related articles” block) stop when the plugin is deactivated.
Post authors: the plugin never creates users. You choose the WordPress user that SeoVision’s posts should be attributed to, in SeoVision under Settings Integrations WordPress, and the plugin verifies that user exists before using it. If no user is chosen, the plugin looks for a user whose login matches the article’s SeoVision author key (so sites set up with an older version keep their existing authors), and otherwise attributes the post to the site administrator and tells SeoVision to ask you to pick an author.
External services
This plugin is the WordPress connector for the SeoVision content platform (https://seovision.io/). It does not work standalone — it exists to receive articles prepared in your SeoVision account.
What the plugin receives: SeoVision sends authenticated REST requests (Bearer token you paste on the plugin’s settings page) containing the article HTML, SEO metadata, JSON-LD structured data, image URLs, publishing status, and author info.
What the plugin sends out: after each publish request the plugin downloads the article images from the URLs supplied in that request (hosted by SeoVision’s media storage) into your WordPress Media Library, so your posts use local media instead of hotlinking. Its REST responses back to SeoVision contain the resulting post ID, permalink, status, media map, and author resolution. The /verify endpoint reports plugin presence/version for the dashboard’s “Test connection” button, the /users endpoint lists the display names and roles of users who can edit posts, for the “Post author” dropdown in SeoVision, and the /articles/<article id>/modified endpoint answers the ID, status and last-modified date of a post SeoVision published (never its content), so SeoVision can tell whether you changed it. Since 0.9.0 the /verify endpoint also reports whether WooCommerce is active, whether you allowed SeoVision to read orders, the store’s currency, time zone and own domain, and the admin address of an order, never an order itself. On a WooCommerce store, and only after an administrator allowed it on the plugin’s settings page, the /orders endpoint answers the store’s orders with the fields listed under “WooCommerce orders” above, and the /orders/changes endpoint answers the ids of orders deleted, restored or erased since SeoVision last asked, so SeoVision deletes its copies. SeoVision uses them only to show the store’s own account which sales came from organic search and AI assistants. Since 0.10.0 the /technical-seo/site endpoint answers the site settings the technical SEO checks need (which SEO plugin is active, whether search engines are discouraged, whether robots.txt, llms.txt and a sitemap exist, the number of published posts per type, the backups made), and the /technical-seo/pages endpoint answers, for each published post, page, product and category, its address, title, SEO title, meta description, canonical address, noindex setting, word count, category names and the images with their alt text, and since 0.14.1, for a product, the IDs of its variations and the brand, barcode (GTIN) and part number (MPN) fields your Google feed app sends. The /technical-seo/apply and /technical-seo/rollback endpoints receive the fixes you confirmed in SeoVision and answer which fields changed. Since 0.14.0, when a SeoVision post or page is live after a publish request, the plugin sends its public address, your site’s host name and your site’s IndexNow key to the IndexNow service (https://api.indexnow.org/indexnow), which shares it with the search engines taking part in IndexNow (such as Microsoft Bing and Yandex) so they can index the page sooner. The key is made on your site and served at https://your-site/.txt so those engines can confirm the address came from your site. Nothing else is sent: no content, no visitor data. Nothing is sent while Settings Reading “Discourage search engines from indexing this site” is checked, and developers can switch it off with the seovision_indexnow_enabled filter. IndexNow: https://www.indexnow.org/ , terms: https://www.indexnow.org/terms . No other data leaves your site, and apart from IndexNow nothing is sent anywhere except in direct response to these authenticated requests.
SeoVision terms of service: https://seovision.io/terms
SeoVision privacy policy: https://seovision.io/privacy
Installation
- Upload the plugin folder to
/wp-content/plugins/seovision-publisher/. - Activate the plugin through the WordPress Plugins screen.
- In SeoVision, open Settings Integrations WordPress and generate an integration token.
- Paste that token into Settings SeoVision Publisher in WordPress and click Save.
- Back in SeoVision, choose the post author and click Test connection.
FAQ
-
Does this publish posts live?
-
Only when SeoVision sends publish mode. The plugin supports draft, scheduled, and immediate publish requests through the authenticated REST endpoint. Already-published posts stay published if a repeated schedule request is sent.
-
Does this work with Yoast SEO or Rank Math?
-
Yes. When Yoast SEO or Rank Math is active, each SeoVision article’s SEO title, meta description and focus keyword are written into that plugin’s own fields, and that plugin prints the tags. Without an SEO plugin, SeoVision Publisher prints them itself. With All in One SEO, SEOPress or The SEO Framework active it stays out of the way and prints nothing. Developers can switch the output off with the
seovision_print_seo_tagsandseovision_print_open_graphfilters. -
Can SeoVision overwrite a post I edited in WordPress?
-
Before SeoVision updates the text of a live article for a search query, it asks the plugin when that post last changed. If the post changed on your site more than 10 minutes after SeoVision last sent it, or is no longer published, SeoVision leaves the post as it is and writes a new supporting article instead. A change made within 10 minutes of SeoVision’s last send cannot be told apart from that send. When you restore an earlier version or publish an article again from SeoVision yourself, SeoVision sends its own text without this check. Sites on a version older than 0.8.3 that also block the public REST API cannot answer, so their posts are not updated for a search query.
-
Can SeoVision overwrite a post I wrote myself?
-
No, from version 0.8.4. SeoVision only ever updates a post it published, which it recognizes by the SeoVision article id stored with the post. If one of your own posts already uses the address of a new SeoVision article, the article is published as a new post and WordPress gives it a unique address. Versions before 0.8.4 could take such a post over, so keep the plugin up to date.
-
Which category do SeoVision posts go into?
-
The one you choose in SeoVision, under Settings, WordPress. SeoVision suggests the category that holds most of your own posts, so new articles land where you already keep your blog. A new post is filed under that category. A post that already exists keeps its categories, so a post you moved yourself stays where you put it. With no category chosen, WordPress uses its default category (Settings, Writing).
-
Yes, from version 0.8.5. A new post is written as a draft first and published only once its images, featured image and SEO fields are in place, so a plugin that shares or announces posts at the moment they are published sees the finished post. A scheduled post is published by WordPress at its time, already complete.
-
Does this track visitors?
-
No. The plugin does not add analytics, tracking pixels, or visitor profiling. On a WooCommerce store, the source of an order comes from WooCommerce’s own order attribution, which you can switch off under WooCommerce Settings Advanced Features.
-
Does SeoVision read my WooCommerce orders?
-
Only if you allow it. On the plugin’s settings page, under WooCommerce orders, an administrator presses “Allow SeoVision to read orders”. SeoVision then imports your orders and shows you, in its Orders page, which of them came from organic search and AI assistants. The buyer’s details are kept encrypted and shown only to your own SeoVision account. Press “Stop sharing orders” at any time, and SeoVision deletes the orders it holds within an hour. Removing the plugin has the same effect, 48 hours later.
-
Can SeoVision change my site settings?
-
Only the technical SEO fixes you confirm, and only after an administrator allows them on the plugin’s settings page, under Technical SEO fixes. Each batch is backed up on your site first. Under Backups on the same page you can download any backup as a file or restore it, and “Stop technical SEO fixes” ends SeoVision’s access to change anything. Technical SEO fixes delete nothing and leave the stored text of your posts, your theme and other plugins’ settings as they are, apart from the SEO fields of Yoast SEO or Rank Math listed above.
-
Does this call third-party services from WordPress?
-
Yes, but only when an authenticated publish request is sent. The plugin downloads image URLs provided by SeoVision into the WordPress Media Library so the post can use local WordPress media assets, and from version 0.14.0 it tells IndexNow the public address of a SeoVision post or page that is now live. See the “External services” section above for the full data flow.
-
Does SeoVision create pages on my site?
-
From version 0.14.0, yes, the new pages you see in your SeoVision content plan before they go live (for example a service page, or your delivery and returns page when the site has none). They are added as new WordPress pages and are not put in your menus. SeoVision never changes a page you made yourself: it only ever updates a post or page it published, recognized by the SeoVision id stored with it.
-
Does the plugin create WordPress users?
-
No. Version 0.8.0 removed user creation entirely. Posts are attributed to an existing user you select in SeoVision, and the plugin verifies that user exists before using it. If you want a dedicated byline, create that user yourself in Users Add New and then select it in SeoVision.
-
Test connection says the token is invalid, but I pasted it correctly
-
Some hosts (Apache running PHP as CGI/FastCGI) drop the Authorization header before PHP sees it, so the plugin receives no token at all. Version 0.8.0 recovers the header automatically on most such hosts. If it still fails, add this line to the
.htaccessin your site root and test again:SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1Also check that you did not paste a new token on top of an old one — the token field is intentionally shown empty, and leaving it empty keeps the token already saved.
-
Do I need a SeoVision account?
-
Yes. The plugin is the WordPress connector for the SeoVision publishing workflow.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“SeoVision Publisher” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “SeoVision Publisher” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
0.14.1
- Technical SEO: product fixes for Google Merchant Center. When Google reports that a product lacks its brand, barcode (GTIN) or part number (MPN) and your store already holds it somewhere your Google feed app does not read, SeoVision can fill the field the app sends: Google for WooCommerce’s brand and MPN, Google Product Feed’s brand, GTIN and MPN, or WooCommerce’s own GTIN field. Only empty fields are filled, and only once you confirm the batch in SeoVision. Like every fix, the batch is backed up first and can be undone.
- The technical SEO page list also tells SeoVision a product’s variation IDs and what those feed fields hold, so a Merchant Center issue on a variation is matched with its product. The read changes nothing on the site.
0.14.0
- SeoVision can publish pages as well as posts: the new pages shown in your SeoVision content plan go to your site as WordPress pages, with their SEO title, description and structured data. A post or page SeoVision already published keeps its type, and your own pages are never touched. Pages are not added to your menus.
- IndexNow: when a SeoVision post or page goes live, Bing, Yandex and the other IndexNow search engines are told its address at once. The site’s key is created on your site and served at /.txt. Nothing is sent while the site discourages search engines, and the
seovision_indexnow_enabledfilter switches it off. - Uninstalling the plugin also removes its IndexNow key.
0.13.0
- Technical SEO: product selling points and answers. Once you confirm the batch in SeoVision, a product shows up to 6 short selling points and the questions shoppers ask with their answers, under its characteristics. SeoVision writes them only from the product’s own text, never for medicines, and adds the selling points to your product feed. Like every fix, the batch is backed up first and can be undone, and the same checkbox on the plugin’s settings page hides the blocks.
- The catalog read for SeoVision’s product feed can read chosen products only. The read changes nothing on the site.
- Uninstalling the plugin also removes the selling points and answers it stored on your products.
0.12.0
- Technical SEO: product characteristics. SeoVision gathers the characteristics your store already holds for each product (its brand, the strength, volume, weight or count its name states, the attributes shown on the product page or used for its variations, weight, dimensions, barcode and category) and, once you confirm the batch in SeoVision, shows them in a “Product details” block under the product’s description and adds them to the product markup as additional properties, so shoppers, search engines and AI shopping assistants read them in one place. Your own description stays as it is. A product without a description gets its Description tab back to show the block. Like every fix, the batch is backed up first and can be undone, and the block can be hidden with one checkbox on the plugin’s settings page.
- Technical SEO: a read of the published catalog (prices, sale dates, stock, photos, brand, barcode, SKU, attributes, categories and variations) for the product feed SeoVision builds at its own address, which you can add to Google Merchant Center, Perplexity and Microsoft Merchant Center. The read changes nothing on the site. Products hidden from the shop or protected by a password are left out.
- The “Related articles” block now shows in block themes (such as Twenty Twenty-Five) too, including under a product without a description, and still once per page. It never reaches the description an SEO plugin builds from the page’s text, an excerpt or a feed.
- Uninstalling the plugin now also removes the FAQ markup and the characteristics it stored on your pages.
0.11.1
- One breadcrumb trail and one organization on each SeoVision article. When Rank Math or Yoast SEO prints its own breadcrumb markup on the page, the article’s structured data leaves its breadcrumb list out. When the SEO plugin prints the site’s organization (or a business type such as a pharmacy, store or local business), the article leaves its own organization out and names the SEO plugin’s organization as its publisher. Google then reads one trail and one organization per article. Sites without Rank Math or Yoast SEO keep the article’s full structured data. A site that wants both can return false from the
seovision_dedupe_article_schemafilter.
0.11.0
- Technical SEO: restore points. Before any fix, SeoVision asks this site to save a copy of every field it can change here: the title, description, canonical address and noindex of every published page, post, product and category, the FAQ and “Related articles” fields, the alt text of every image, and the site-wide settings and redirects. The copy is saved on this site, in steps so a large store never hits a time limit, and can be downloaded from the plugin’s settings page. Fixes are applied only while a restore point of the last 12 hours exists. The seven newest restore points are kept.
- The Technical SEO read of the site now says whether Rank Math adds the missing image alt text itself (General Settings, Images, “Add missing ALT attributes”). SeoVision then proposes no alt text that the pages already show.
0.10.3
- Technical SEO: three new fixes for structured data. WebSite markup on the front page and breadcrumb markup on posts, pages, products, categories and the shop page, printed only where neither an SEO plugin nor a SeoVision article’s own markup prints them. The product markup WooCommerce, Rank Math or Yoast prints gets the brand, barcode (GTIN) and photo the store holds, the delivery and return terms the site owner entered in SeoVision, and the rating of the store’s own reviews, each only where the markup has none. What the markup already says stays as it is. Like every fix, each waits for the administrator’s approval of its batch, is backed up first and can be undone.
- Technical SEO: a fourth new fix marks up as FAQ the questions a page already holds, word for word (a heading that asks, or a details block, with the text under it), only where no FAQ block of Yoast or Rank Math marks them up.
- The page text the Technical SEO read sends keeps a space between paragraphs, list items and lines, so a description built from it no longer runs two sentences together.
- The Technical SEO read of a page now includes the links of this site its text and its “Related articles” block hold, and the questions on it; of a product, its brand, barcode and review count; of the site, the links in its menus and the redirects SeoVision set. The scan uses them to find pages nothing links to and redirect chains, and to know what can be added.
0.10.2
- Technical SEO with Rank Math or Yoast SEO: a new fix adds the business type, postal address, phone and license number the site owner entered in SeoVision to the organization markup Rank Math or Yoast prints. A property the SEO plugin already prints stays as it is, and the type changes only from a plain “Organization”. Like every fix, it waits for the administrator’s approval of its batch, is backed up first and can be undone.
0.10.1
- Technical SEO with Rank Math: the title and meta description the scan reads for a page are now the ones Rank Math prints on it, built from its title and description templates in the same order Rank Math uses. Before, a page whose fields were left to Rank Math’s templates read as having no title and no description, because Rank Math fills its template variables only on a page view.
- The business markup is printed the same way as the articles’ structured data, and the code follows WordPress’s Plugin Check (escaped output, comments on the LiteSpeed Cache and sitemap hooks this plugin calls).
0.10.0
- Technical SEO fixes, off until an administrator allows them under Technical SEO fixes on the plugin’s settings page. Two new authenticated reads,
GET /wp-json/seovision/v1/technical-seo/siteandGET /wp-json/seovision/v1/technical-seo/pages, and two writes,POST /wp-json/seovision/v1/technical-seo/apply(only once allowed) andPOST /wp-json/seovision/v1/technical-seo/rollback. - Every batch is backed up on the site before anything changes, and nothing changes when the backup cannot be saved. A field changes only while it still holds the value SeoVision saw. Backups can be downloaded and restored from the settings page.
- What a fix can change: the SEO title, meta description, canonical address and noindex of a post, page, product or category (in Yoast SEO or Rank Math, or printed by this plugin), the alt text of an image, the “Discourage search engines” setting, crawler groups in the virtual robots.txt, /llms.txt, a business markup on every page, WordPress’s own sitemap, noindex on addresses with chosen query parameters, redirects of broken addresses to a page of the same site, and a “Related articles” block under a page.
GET /wp-json/seovision/v1/verifyalso reports whether technical SEO fixes are allowed and which SEO plugin is active.
0.9.2
- One Article per page: on a SeoVision article whose structured data this plugin prints, the Article or BlogPosting that Yoast SEO or Rank Math adds is left out, so Google reads one article with one author and one date. Their other structured data (WebPage, breadcrumbs, organization) stays. A site that wants theirs back can return false from the
seovision_dedupe_seo_plugin_schemafilter.
0.9.1
- The settings page mentions WooCommerce orders only on a site where WooCommerce is active, where the orders section shows below the token.
0.9.0
- WooCommerce orders for SeoVision’s Orders page, off until an administrator allows them under WooCommerce orders on the plugin’s settings page. Two new authenticated reads,
GET /wp-json/seovision/v1/orders(orders changed since a time, orders placed up to a time, or orders by id) andGET /wp-json/seovision/v1/orders/changes(orders deleted, restored or erased since SeoVision last asked). Both answerseovision_orders_not_alloweduntil the store allows them. - What an order carries: its number, dates, status, totals and refunds, products, the source WooCommerce’s order attribution recorded (the referring host, campaign tags and the entry page’s path without its query string), and the buyer’s name, email address, phone number and shipping address. Orders awaiting payment, failed, cancelled or drafts carry their id and status only.
GET /wp-json/seovision/v1/verifyalso reports whether WooCommerce is active and whether orders are shared.- Privacy: a suggested paragraph for your privacy policy, and SeoVision’s copies of orders in Tools Export Personal Data and Erase Personal Data.
- Declares compatibility with WooCommerce’s order tables (HPOS).
0.8.5
- A new post goes live only once it is complete. It is written as a draft, and switched to published or scheduled after its images, featured image and SEO fields are in place. Plugins that act the moment a post is published, such as Blog2Social, Jetpack Social and email notifiers, now see the finished post instead of one without its featured image and SEO description.
- Category: SeoVision can file a new post under a category you choose in SeoVision. A post that already exists keeps its categories. A chosen category that no longer exists is skipped and the post goes to your default category.
- New authenticated read,
GET /wp-json/seovision/v1/categories. It lists your post categories with their post counts, how many of those posts you published yourself, your default category and the category SeoVision suggests. It is authorized by the same integration token as publishing.
0.8.4
- SeoVision now updates only a post it published itself, recognized by the SeoVision article id stored with the post. Until now, when no post carried that id, the plugin took any post at the same address (slug), so one of your own posts that happened to share the address of a new SeoVision article was overwritten by it. Such an article is now published as a new post, and WordPress gives it a unique address (for example
-2at the end). Your own post is not touched. - The JSON-LD of a post whose address WordPress suffixed that way points at the post’s real permalink, like every other SeoVision post.
0.8.3
- New authenticated read,
GET /wp-json/seovision/v1/articles/<article id>/modified. It answers the ID, status and last-modified date (GMT) of the post SeoVision published for that article, found by the SeoVision article id stored with the post, and nothing about any other post. SeoVision asks it before it updates the text of a live article for a search query, so it can leave a post you changed in WordPress alone, even on a site that blocks the public REST API. The FAQ says exactly when. It is authorized by the same integration token as publishing, and its answer is never cached.
0.8.2
- A picture whose address is a web page (a link the writer formatted as an image) no longer fails the whole publish. The plugin refuses it before download, skips any image it cannot add to the Media Library, keeps the post as written, and reports the skipped addresses under
warningsin the response. - The article’s SeoVision id is stored the moment the post is created, before its images are processed, so a publish that fails in the media step is found by its id on the next attempt instead of being rewritten by slug every hour.
0.8.1
- SEO tags: the article’s SEO title replaces the post title in
<title>, and the meta description, Open Graph and Twitter card tags are printed on SeoVision articles when no SEO plugin is active. Jetpack’s own Open Graph output is respected. - Yoast SEO and Rank Math: the SEO title, meta description and focus keyword are written into their fields on every publish, so they print the tags.
- Stores the article’s focus keyword (
_seovision_focus_keyword). - The JSON-LD now uses the post’s real permalink instead of the address SeoVision assumed before publishing (
/blog/<slug>), and the “Blog” breadcrumb points at the site’s posts page, or is left out when posts are shown on the front page. An address set on purpose in SeoVision is kept.
0.8.0
- Removed WordPress user creation. Posts are now attributed to an existing user selected in SeoVision; the plugin never calls
wp_insert_user. - Authorization is now the integration token only. The previous fallback that also accepted any logged-in user with
edit_postsis gone — it let a Contributor publish immediately and set an arbitrary post author, bypassing their normal capabilities. - Article CSS is delivered through
wp_enqueue_style()+wp_add_inline_style()instead of a<style>tag echoed intowp_head. - Hosts that move the Authorization header to
REDIRECT_HTTP_AUTHORIZATION(Apache with PHP as CGI/FastCGI) now work without an.htaccesschange. Where the header is still missing, the plugin answers with a distinct error so SeoVision can name the real cause instead of blaming the token. - The settings page no longer prints the saved token into the input. It shows the last characters instead, and an empty field on save keeps the existing token — pasting a new token on top of the old one used to concatenate them, after which no request could ever authenticate.
0.7.7
- Removed the
Plugin URIheader. It pointed at seovision.io, the same address asAuthor URI, which the WordPress.org submission form rejects; seovision.io describes the author, not this specific plugin.
0.7.6
- Fixes the Plugin Check findings from the 0.7.5 review run: prefixed the two global variables in uninstall.php, and annotated the intentional single-row meta lookup that makes publishing idempotent (it never runs on page views).
- Brand name consistently written “SeoVision” across the plugin UI, readme, and headers. All technical identifiers (text domain, option names, REST namespace, meta prefix) are unchanged, so updates and stored data are unaffected.
0.7.5
- WordPress.org submission readiness. Tested up to WordPress 7.1.
- Hardened the
/usersendpoint: it now lists only users who can edit posts and no longer returns login names (usernames), closing a username-enumeration aid. The SeoVision dashboard only needs display names for its “Post author” dropdown. - Replaced
@unlink()withwp_delete_file()in the image sideloader and sanitized the rawAuthorizationheader reads. error_log()diagnostics now only run whenWP_DEBUGis enabled; the same warning still reaches SeoVision in the REST response.- readme: added an “External services” disclosure section (data in/out, terms, privacy policy) and documented exactly when the plugin creates an Author-role WordPress user.
0.7.4
- Adds uninstall cleanup: deleting the plugin now removes the stored integration token (
seovision_integration_token) and the activation-redirect flag. Previously these options survived a delete, so reinstalling on the same site showed “A token is configured” with the old token pre-filled. Deactivating (without deleting) still keeps the token.
0.6.1
- Security/correctness: the JSON-LD printed into the page head now escapes
<,>, and&(JSON_HEX_TAG | JSON_HEX_AMP). Previously a value containing the literal</script>could close the schema script tag early and break the page or inject markup. Slashes stay unescaped so embedded URLs remain readable.
0.6.0
- Draft, scheduled, and immediate publish modes with media sideloading and JSON-LD head injection (see prior internal releases for details).
0.5.2
- Keeps already-published posts published when repeated schedule requests are sent.
- Prevents accidental unpublishing of indexed WordPress posts during bulk schedule operations.
- Restores the safer default after 0.5.1: schedule requests never unpublish existing live posts.
0.5.1
- Allows a published post to be moved back to scheduled status when the requested schedule date is still in the future.
- Keeps already-published posts live when repeated schedule requests refer to dates that have already passed.
0.5.0
- Added support for draft, scheduled, and immediate publish modes.
- Scheduled posts use
post.statusfuturewith the supplied WordPress localpost.date. - Idempotent lookup now includes published posts to avoid duplicate articles on repeat requests.
0.4.0
- Moved article image sideloading into the plugin endpoint.
- Added media URL rewriting for article HTML and JSON-LD before draft meta is stored.
- The plugin endpoint now returns the generated media map and featured media ID.
0.3.1
- Centralized plugin contract naming constants for pre-release rename readiness.
- Added WordPress.org-ready license metadata and readme scaffold.
0.3.0
- Added authenticated plugin REST endpoint for idempotent article draft create/update.
- Added media map meta storage.
