Before you start
- WordPress 5.6+ and PHP 7.4+ (both several years past end-of-life, so almost any live site qualifies).
- An administrator account on the WordPress site - installing and connecting both require the
manage_optionscapability. - Outbound HTTPS from your server to
livesov.com. Managed hosts allow this by default; locked-down enterprise hosts may need it allow-listed. - A Livesov brand to connect the site to. Create one first if your account is brand new - the approval screen has nothing to attach to otherwise.
post_content, so it is the weaker choice on a page-builder site. Reach for the plugin when the site runs Elementor, Divi, Beaver Builder, Bricks or Oxygen, when you want llms.txt and /.well-known/ files written to the site root, or when Application Passwords are disabled on your install.Connecting manually (fallback)
If your site sits behind an auth wall that breaks the redirect handshake - a staging environment behind HTTP basic auth, a VPN-only admin, an aggressive WAF - you can pair the connection by hand instead:
- In Livesov, open Fix Engine β Connections β Connector plugin and click Pair. Copy the Pull URL, Token, and Signing secret. They are shown once.
- In wp-admin, go to Settings β Livesov Connector β Connect manually, paste all three values, and save.
- Click Poll now to apply anything already approved, rather than waiting for the next 5-minute cycle.
<head>.Page builders
A WordPress page is only sometimes its post_content. Elementor renders a JSON tree stored in postmeta and ignores post_content entirely. Beaver Builder keeps a serialized node graph. Divi and WPBakery keep shortcodes. Bricks and Oxygen each have their own meta key.
This is the failure mode that makes most "auto-apply SEO" tools useless on real sites: they write the fix into post_content, the database update genuinely succeeds, the tool reports success β and the live page looks exactly the same, because the builder never reads that field. The Connector routes every content edit through an adapter that knows where each builder actually keeps its content.
What is supported where
- Rewrite a passage β supported on all eight: Gutenberg, Classic, Elementor, Divi, WPBakery, Beaver Builder, Bricks, and Oxygen.
- Add a block (FAQ, TL;DR, schema section) β added as a native builder element on Gutenberg, Classic, Elementor, Divi, WPBakery, and Bricks. On Beaver Builder the block renders through a
the_contentfilter instead, so it appears after the builderβs output rather than inside it. On Oxygen it is refused outright: Oxygen renders its own template and never runsthe_content, so a block placed there would be accepted and then never appear β and a fix that reports success while changing nothing is worse than one that fails. Add those in the builder. Livesov reports which path was used. - Title, meta description, canonical, robots β builder-independent, and written into both the Yoast and Rank Math fields.
- Replace the whole page body β deliberately refused on builders that store their layout outside the post body. Overwriting there would erase the layout, so the plugin declines and says so rather than doing it.
What actually changes on your site
Worth being precise about, because "an SEO plugin that edits your site" is a fair thing to be nervous about. The plugin supports exactly five operations, and nothing else:
write_fileβ writes root files, restricted to an allow-list of/llms.txt,/robots.txt, and/.well-known/*. Traversal and every other path are rejected outright.patch_robotsβ appends AI-crawler rules through WordPressβsrobots_txtfilter, so it works with the virtual robots.txt and survives theme and core updates.set_header_blockβ stores schema and meta markup that prints onwp_head. No theme file is ever written.stage_contentβ computes the edit and parks it behind a tokenised preview URL. The published page is untouched, and the preview works on any builder without a wp-admin login, so whoever is reviewing the fix in Livesov can just open the link.publish_contentβ promotes the staged change to live, after snapshotting the previous state (post content and builder data) so it can be undone.
Every instruction is signed HMAC-SHA256(id | op | sha256(content)) and verified before it runs. After applying, the plugin acknowledges back to Livesov, so the dashboard reflects what actually landed - including which builder it detected, and any failure with its reason, retried on the next poll.
Undoing a change
WordPress revisions only carry post_content, which means they are no help at all on a builder-driven page. So every publish also writes its own snapshot of the previous state β including the builderβs data β before touching anything.
Go to Settings β Livesov Connector and you will find a Page changes table: every page the Connector has staged or published, which builder it detected, and an Undo this change button. You never have to open Livesov to find out what was changed on your own site, or to put it back.
Troubleshooting
"Connect failed: the request expired or didnβt match." The handshake nonce is valid for 15 minutes. Start the connect flow again and complete it in one sitting - most often this means the tab sat open overnight.
"Could not exchange the authorization code." Your server could not reach livesov.com over HTTPS, or the code was already used. Check outbound firewall rules first, then retry the connect flow.
Last poll says "pull HTTP 401". The token was revoked or rotated in Livesov. Re-pair from Settings β Livesov Connector.
Nothing happens after 5 minutes.WordPressβs wp-cron only fires on site traffic, so a low-traffic site can lag. Click Poll now to force it, or switch to a real system cron (DISABLE_WP_CRON plus a server-side cron hitting wp-cron.php) if your site is quiet.
"signature mismatch" on every instruction. The signing secret in WordPress no longer matches the one Livesov holds. Re-pair the connector; the secret is issued fresh each time.
"page not found on this site" on a content fix.Livesov resolved a URL that WordPress does not map to a post. The plugin already retries against your siteβs own home URL to absorb www/non-www and trailing-slash differences, so this usually means the page really has moved or the brandβs configured domain points somewhere else. Check the domain in your brand settings and re-run.
"passage not found on the page". The page has been edited since Livesov crawled it, so the text the fix was written against is gone. Re-run the scan to pick up the current copy, then regenerate the fix.
"passage appears more than once". The snippet occurs in two places (often a hero and a footer CTA sharing a line), and blindly picking one would be a coin flip. Make the target passage unique on the page, or apply that one by hand.
"would break the page structure". The passage spans a structural boundary β two Divi modules, two Gutenberg blocks, a section wrapper β so replacing it would take the layout with it. Split the fix into per-block edits, or apply it in the builder.
"renders its own template, so a new block can only be added in the builder". An Oxygen page. Oxygen bypasses the_content entirely, so there is no safe place for the plugin to put a new block. Paste it into Oxygen yourself β rewrites of existing passages still apply automatically.
Updating the plugin
Until the WordPress.org listing is live, updates are a zip upload: download the current version from this page, then use Plugins β Add New β Upload Plugin and confirm the replace prompt. Your connection settings live in the WordPress options table, so they survive the upgrade - you will not need to reconnect.
Something not covered here? Email hello@livesov.com - we read everything.