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.
- 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.
Every request is authorized by the integration token you paste on the plugin’s settings page, and by nothing else. SeoVision can keep articles as drafts, schedule them for the requested WordPress site date/time, or publish them immediately.
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. No other data leaves your site, and 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.
-
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. See the “External services” section above for the full data flow.
-
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.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.
