WP Page Sync self-updates
Sync pages, media and global styles between two WordPress installs over a signed connection.
★ 0stars
3release downloads
0forks
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/mikemiler/wp-page-sync/releases/download/v1.0.0/wp-page-sync.zipShips its own WordPress updater (Plugin Update Checker), so new versions show up under Dashboard → Updates.
Readme
WP Page Sync
WordPress plugin that pairs two installs and syncs pages and posts between them in both directions, including the upload files they reference.
What it does
- Push and pull pages and posts between two paired sites, individually or as a bulk selection that syncs parents before their children.
- Transfers the referenced upload files with the post: images and linked files such as PDFs, checksum-verified and re-attached on the receiving side with their URLs rewritten to that site's domain and uploads path.
- Syncs GenerateBlocks Pro global classes and the GeneratePress color palette. Classes that exist only on the target are never deleted.
- Detects conflicts via content hashes: two copies that differ are reported instead of overwritten, and overwriting needs an explicit confirmation.
- Verifies a site for missing upload files, URLs pointing at another environment, broken internal links and undefined global classes.
Limits
- Not every upload reference travels. A file whose name or file type is
outside the transfer whitelist (an umlaut in the file name, an extension the
plugin does not carry) is excluded from the transfer and its URL deliberately
keeps pointing at the source site. The sync dialog names it as a pre-flight
warning before the sync and the verifier reports the leftover URL after it.
A reference written without a host (
/wp-content/uploads/…instead of a full URL) is not extracted at all, so its file is neither transferred nor reported. - "Never deleted" covers global classes only. The GeneratePress color palette is replaced as a whole rather than merged, so colors that exist only on the target are lost.
- The content hash covers title, path, status, content and excerpt. Post meta is not part of it: two copies can report as in sync while their custom fields differ, and meta deleted on the source is not deleted on the target by an import.
- Single site only. There is no multisite or network handling.
- No deletion propagation. Deleting a page, post or media file locally never deletes anything on the connected site.
Pairing
- Install and activate the plugin on both sites.
- On site A: WP Page Sync → Connections → Create connection key. The key is shown once, usable once, and expires after 60 minutes.
- On site B: paste the key under Connect to a site and click Connect.
Then enable Allow incoming on whichever site should be allowed to receive pushes.
How updates work
The plugin is not on wordpress.org. It ships the Plugin Update Checker (PUC) library, which hooks into the normal WordPress update flow:
- A
vX.Y.Ztag is pushed to this repository. - The
ReleaseGitHub Action verifies that the tag, the plugin header version andWPPS_VERSIONall match, builds a clean ZIP and attaches it to a GitHub Release. - PUC on each install polls the Releases API, compares the release against the
installed
WPPS_VERSION, and offers the update under Plugins and Dashboard → Updates. "View details" is fed byreadme.txt.
Release steps are documented in RELEASING.md.
Requirements
- WordPress 6.0 or newer
- PHP 7.4 or newer
- GenerateBlocks Pro / GeneratePress on both sites, for the global styles sync only. Page and post syncing does not require them.
- The safe-svg plugin on the receiving site, if SVG uploads should sync. Its bundled sanitizer is mandatory before an SVG is written; without it SVG imports are rejected. Other file types are unaffected.
Security
- Site-to-site traffic runs over the plugin's own REST namespace
(
wp-page-sync/v1), authenticated with HMAC-SHA256 request signatures. No application passwords are issued and no WordPress core REST route is exposed for syncing. - Each signature is bound to the receiving site, so a signed request cannot be reflected back in the other direction.
- The shared secret is generated per pairing and stored per site as a non-autoloaded option. Connection keys are single-use and expire after 60 minutes.
- Allow incoming governs whether a peer may write to a site. It defaults to
on only for local hosts (
*.test,*.local,localhost,127.0.0.1) and must be enabled deliberately everywhere else. - Plain HTTP peers are rejected outside of those local hosts.
License
GPL-2.0-or-later
Read the full README on GitHub →
Releases
| Tag | Published | Asset | Downloads |
|---|---|---|---|
| v1.0.0 | Aug 15, 2026 | wp-page-sync.zip | 3 |