Title: SeoVision Publisher
Author: seovisionio
Published: <strong>September 21, 2026</strong>
Last modified: September 21, 2026

---

Search plugins

![](https://ps.w.org/seovision-publisher/assets/banner-772x250.png?rev=3705133)

![](https://ps.w.org/seovision-publisher/assets/icon-256x256.png?rev=3705133)

# SeoVision Publisher

 By [seovisionio](https://profiles.wordpress.org/seovisionio/)

[Download](https://downloads.wordpress.org/plugin/seovision-publisher.0.8.2.zip)

 * [Details](https://wordpress.org/plugins/seovision-publisher/#description)
 * [Reviews](https://wordpress.org/plugins/seovision-publisher/#reviews)
 *  [Installation](https://wordpress.org/plugins/seovision-publisher/#installation)
 * [Development](https://wordpress.org/plugins/seovision-publisher/#developers)

 [Support](https://wordpress.org/support/plugin/seovision-publisher/)

## 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.
 * 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, and the `/users` endpoint 
lists the display names and roles of users who can edit posts, for the “Post author”
dropdown in SeoVision. 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

 1. Upload the plugin folder to `/wp-content/plugins/seovision-publisher/`.
 2. Activate the plugin through the WordPress Plugins screen.
 3. In SeoVision, open Settings  Integrations  WordPress and generate an integration
    token.
 4. Paste that token into Settings  SeoVision Publisher in WordPress and click Save.
 5. 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_tags`
and `seovision_print_open_graph` filters.

### 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`.
htaccess` in your site root and test again:

    ```
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    ```

Also 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.

Contributors

 *   [ seovisionio ](https://profiles.wordpress.org/seovisionio/)

[Translate “SeoVision Publisher” into your language.](https://translate.wordpress.org/projects/wp-plugins/seovision-publisher)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/seovision-publisher/),
check out the [SVN repository](https://plugins.svn.wordpress.org/seovision-publisher/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/seovision-publisher/)
by [RSS](https://plugins.trac.wordpress.org/log/seovision-publisher/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 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 `warnings` in 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_posts` is 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 into `wp_head`.
 * Hosts that move the Authorization header to `REDIRECT_HTTP_AUTHORIZATION` (Apache
   with PHP as CGI/FastCGI) now work without an `.htaccess` change. 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 URI` header. It pointed at seovision.io, the same address
   as `Author 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 `/users` endpoint: 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()` with `wp_delete_file()` in the image sideloader and sanitized
   the raw `Authorization` header reads.
 * `error_log()` diagnostics now only run when `WP_DEBUG` is 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.status` `future` with the supplied WordPress local `
   post.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.

## Meta

 *  Version **0.8.2**
 *  Last updated **2 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.4 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [content](https://wordpress.org/plugins/tags/content/)[JSON-LD](https://wordpress.org/plugins/tags/json-ld/)
   [publishing](https://wordpress.org/plugins/tags/publishing/)[seo](https://wordpress.org/plugins/tags/seo/)
   [structured data](https://wordpress.org/plugins/tags/structured-data/)
 *  [Advanced View](https://wordpress.org/plugins/seovision-publisher/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/seovision-publisher/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/seovision-publisher/reviews/)

## Contributors

 *   [ seovisionio ](https://profiles.wordpress.org/seovisionio/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/seovision-publisher/)