Version 3.0.0
PBJ Studio Sync pushes content one way, from a local WordPress Studio site (SQLite) to a live production site (MySQL). The same plugin installs on both sides and auto-detects which environment it is in:
Content moves over the WordPress REST API as native WP objects (posts, terms, meta, files), so the SQLite/MySQL differences are handled by WordPress itself — there is no raw SQL translation.
3.0.0 is an admin/UX release. The entire admin was rebuilt as a guided, per-sync-type UI — every page now walks you through what it does. No push/receiver logic changed: all 2.x safety rails are intact and 2.x ↔ 3.0 pushes are compatible.
pbj-studio-sync.zip on both the Studio site and the live site (Plugins → Add New → Upload Plugin → Activate).pbj-installer helper plugin or remove the old pbj-studio-sync folder first.On Studio, the Dashboard opens with a three-step "How Studio Sync works" stepper — Connect → Choose → Push. Each step shows its live status (connected? how many sync types enabled? pushed before?) and links to the tab where it happens, so you always know what to do next. Working through it is exactly the sequence below.
On the live site, open Studio Sync → Dashboard and click Check / fix REST API. It rebuilds rewrite rules, sets permalinks to /%postname%/ if they were on "Plain" (which blocks REST routes), and self-tests /wp-json/. Wait for the green confirmation. If it still fails, the cause is outside the plugin — usually a security plugin blocking REST, or a server-config issue.
On the live site: Users → Profile → Application Passwords. Add one named "Studio Sync" and copy the 24-character password (keep the spaces).
On the Studio site: Studio Sync → Setup. Step 1 is a numbered connection walkthrough — 1. Live site URL → 2. Live admin username → 3. Application Password → 4. Save, then test. Click Save connection, then the inline Test connection button right next to it. "✓ Connected — live site answered with its site info." means every sync feature will work.
The Setup tab has three sections, and each saves independently with its own button — saving one never touches the others:
Studio Sync → Sync by Type. Eight sub-pages, one per sync type — Content, Media, Menus, Theme, Plugins, Site Settings, Users, Deletions. Each page:
Content, Media, and Menus are on by default; Theme, Plugins, Site Settings, and Users are opt-in. The Plugins page also holds the Plugins to exclude (fully unmanaged) list and the mu-plugins toggles; the Deletions page holds the tombstone queue (see below).
Users / Site Settings sync. These two clone the live site beyond content — Site Settings includes
theme_mods(footers/headers/customizer) and plugin configuration; Users includes roles, profile meta, and password hashes. The plugin always protects the live site's site/home URL, active-plugins list, theme selection, and the operator's own login from being overwritten. Even so, test these against a staging copy before running them onto real production.
Studio Sync → Dashboard → Push to live now — sends every type enabled on Sync by Type. The progress UI shows each stage in order: terms → uploads → posts → menus → theme → plugins → plugin states → mu-plugins → settings → users → prune → deletions → commit.
Studio Sync → Sync by Type → [type] → Push [type] to live now. Sends that one type, nothing else, right now. It's additive (never deletes on live) and — unlike Compare & Sync and Full Copy — it respects the plugin exclude list.
When you trash a post or delete a media file on Studio, the plugin records a "tombstone". The next Dashboard push removes the same item from live by slug (including the underlying file for attachments). Untrashing a post before the next push cancels its tombstone. The queue lives at Sync by Type → Deletions, which shows exactly what will be deleted on the next push and offers Clear tombstones (skip these deletions). The per-type buttons on the other pages never delete anything.
.zip (MySQL dump + per-table JSON snapshot + uploads folder), downloadable via a one-time link..zip into Studio. The importer reads the JSON snapshot, so it works across the SQLite/MySQL boundary. Use "wipe first" to clear content tables before restoring.Studio Sync → Compare & Sync (Studio only). The page now carries its own numbered how-to:
Theme and plugin files aren't included in backups, so they're disabled in the Download direction — use Upload for those. Both sites must be on 2.0.0+ for the comparison to load. The page also hosts Auto Sync (merge newest) — a one-click, both-directions, newest-wins merge that never deletes on either side.
Studio Sync → Full Copy (Studio only). The "make the other site identical" tab — two one-click whole-site copies, no section picking, each gated behind a typed confirmation phrase plus a final confirm dialog:
COPY TO LIVE to unlock the button. Pushes everything in full mode (content, media, menus, the active theme, ALL plugins — the exclude list is ignored on a full copy, only the sync plugin itself stays out — site settings, users), then prunes anything on live that doesn't exist in Studio. Live becomes an exact copy; the prune is irreversible. Always protected, even here: the live site address, your login and application passwords, user roles, and live-only server settings (caching/security). Tip: generate a live backup first so you can roll back.COPY TO STUDIO to unlock. Live generates a fresh backup, Studio downloads it automatically, wipes its local content first, then imports live's content, media, site settings, and users — no more generate-download-upload juggling. Only the local site changes; live is never touched. Theme/plugin files and menus never travel downward — they only exist as files on the live server and only move Studio → Live, so your Studio theme and plugins stay exactly as they are.For partial syncs use Sync by Type or Compare & Sync instead.
Studio Sync → Setup → Plugin auto-updates. Point at a GitHub repo (user/repo) or a JSON manifest URL and click Save update settings, then Check for updates now. New versions then appear under Plugins → Installed Plugins with the normal "Update Now" button.
/wp-json/ — run "Check / fix REST API" on live; check for a security plugin blocking REST.staged_file_missing during a push — a stage-order problem; uploads must run before posts (fixed in 1.5.1+).delete_attachment tombstone hook.HTTP 401 Authentication required on the final commit (push transferred but didn't finalize) — fixed in 2.5.1. A full push could write a setting mid-run that disabled Application Passwords on live, so the last call was rejected while your browser login stayed fine. 2.5.1 force-keeps Application Passwords available for the sync's own endpoints, so this can't recur. If you saw it on an older build: update both sites, regenerate the Application Password on live, re-enter it in Studio, and re-run.~/Documents/Claude/Projects/Wordpress Plugins/, mirrored to the WordPress Plugins/pbj-studio-sync/ folder in Google Drive.wp-content/uploads/pbj-sync/ (removed automatically on uninstall).