PushPull stores selected WordPress content in a Git repository using a canonical JSON representation instead of raw database dumps.
This project is also documented through a DevOps-focused article series that explains how to efficiently manage a WordPress stack with Bedrock and PushPull, starting here:
https://creativemoods.pt/devops-with-wordpress/
Uploading in WordPress Dashboard
- Download the plugin ZIP.
- In WordPress, go to Plugins > Add New Plugin.
- Click Upload Plugin.
- Select the ZIP file.
- Install and activate the plugin.
Installing from source
- Clone this repository into
wp-content/plugins/pushpull.
- Run
composer install.
- Activate PushPull in WordPress.
Install via Composer / Packagist
In a Composer-managed WordPress project such as Bedrock:
- Require the plugin:
composer require creativemoods/pushpull
- Make sure the root project allows
composer/installers and installs type: wordpress-plugin packages into your plugins directory
- Activate PushPull in WordPress.
0.0.20
- Added a new
wpml_configuration config domain that exports and applies core WPML setup state, including default language, active languages, URL format, post type translation modes, and translated post type slugs.
- Refactored WPML activation logic into the integration layer and added a reusable site-key activation service instead of leaving the registration spike in ad hoc CLI-only code.
- Improved WPML setup and translation-management availability handling on bare installs so WPML domains are selectable earlier in the bootstrap flow.
- Hardened WPML slug-translation apply and export behavior, including persistence of translated slug values and more resilient handling of cache and table state during tests and apply operations.
0.0.19
- Fixed the
wp pushpull config enable-domain and disable-domain subcommands so domain enablement can be managed reliably from WP-CLI.
- Fixed the Domains page so available plugin overlay domains such as WPML translation management and Real Media Library media organization are checkable again.
- Improved the Domains page by collapsing integration groups that currently have nothing checkable, reducing placeholder noise while keeping the long-term structure visible.
0.0.18
- Added requirements for packagist.org
0.0.17
- Added new primary domains for WordPress comments, categories, and tags.
- Added generic managed-domain support for discovered custom post types and custom taxonomies, with opt-in enablement from a dedicated Domains screen.
- Moved domain selection out of Settings into a dedicated Domains page organized by WordPress core, installed plugin integrations, and custom content.
- Added bulk
Commit + Push All and Pull + Apply All workflows for full-site bootstrap and deployment scenarios.
- Added a
wp pushpull WP-CLI interface covering status, domains, configuration, sync operations, conflict resolution, and the new bulk workflows.
0.0.16
- Added a lightweight recurring remote-head availability check so PushPull can cheaply detect when the remote branch likely has updates available for
Fetch.
- Added a configurable
Remote fetch check interval setting with a default of 5 minutes.
- Updated the Managed Content UI so the
Fetch button stays enabled but is visually highlighted when the latest scheduled check detects a newer remote head.
- Extended the action popover system so enabled actions like
Fetch can surface contextual notices, not only disabled-state reasons.
- Added focused scheduler and fetch-availability tests covering cached state, settings changes, and cron rescheduling behavior.
0.0.15
- Added a new primary
wordpress_menus domain with canonical JSON export and apply for WordPress menus.
- Added v1 menu location support so theme menu assignments round-trip alongside menu structure.
- Added canonical menu item references for pages, posts, taxonomies, post-type archives, and custom links, with hierarchy preserved through
parentItemKey.
- Added focused menu export/apply coverage and nav-menu bootstrap support in the test suite.
- Updated the readme functionality description so WordPress menus are listed as a supported primary domain.
0.0.14
- Added a new
media_organization overlay domain with a first Real Media Library-backed adapter that stores canonical attachment-to-folder path assignments instead of plugin-specific folder IDs.
- Expanded
WordPress core configuration with wordpress_permalink_settings support for the site's permalink structure.
- Added a PushPull status dropdown in the WordPress admin bar with high-level live vs local and local vs remote summaries plus quick links into Managed Content and the Audit Log.
- Extended the WordPress pages and posts domains to own GeneratePress layout override meta, including legacy page-editor keys used for sidebar layout, footer widgets, full-width content, and disabled elements.
- Hardened the admin and provider integration edges with safer admin-bar status fallback behavior and PHPStan bootstrap stubs for Real Media Library functions.
0.0.13
- Added a first core config domain,
WordPress core configuration, with wordpress_reading_settings support for show_on_front, page_on_front, and page_for_posts.
- Added canonical page logical-key references for reading settings so front-page and posts-page options can round-trip across environments without leaking WordPress IDs.
- Added a dedicated config-domain apply path so non-post WordPress configuration can be applied cleanly without pretending to be posts or overlays.
- Introduced
Config domains as a separate UI family alongside Primary domains and Overlay domains in settings and Managed Content.
- Changed the Managed Content screen to show only enabled domains, so disabled managed sets no longer clutter the tabs or overview.
0.0.12
- Added a new
translation_management overlay domain with a first WPML-backed implementation that exports only in-scope translation groups for managed content.
- Added generic overlay-domain support, including separate
Primary domains and Overlay domains sections in settings and clearer visual separation in the Managed Content UI.
- Added managed-set dependency ordering so hard domain dependencies can be declared explicitly, with GeneratePress elements now ordered after WordPress pages and posts.
- Added canonical logical-key mapping for GeneratePress element page/post conditions so environment-specific object IDs no longer leak across sites.
- Added the first overlay-specific apply path so non-post domains like translation management can be applied asynchronously without pretending to be WordPress posts.
0.0.11
- Added new managed content domains for WordPress posts and GeneratePress elements.
- Added asynchronous, chunked
Apply repo to WordPress operations with modal progress so large apply actions no longer rely on one long blocking request.
- Moved
Pull, Fetch, and Push to the top Managed Content navigation row so branch actions stay available while working inside a specific managed set.
- Fixed GitLab recursive tree fetching so repositories with more than one page of files no longer silently miss later entries during fetch.
- Improved attachment apply so WordPress regenerates target-side attachment metadata and image sub-sizes instead of reusing stale source-site thumbnail metadata.
0.0.10
- Added a GitLab provider with project, branch, commit, tree, and blob support plus linearized push support for merge results.
- Added GitLab-specific settings and documentation, including fine-grained PAT permission guidance and a note that remote merge topology is flattened on push.
- Fixed GitLab push ref tracking so follow-up commits and pushes no longer fail after the first successful push.
- Fixed chunked GitLab fetch and pull so synthetic root trees survive across async requests.
- Fixed chunked GitLab push so staged synthetic blobs, trees, and commits are restored correctly across async requests.
0.0.9
- Added asynchronous branch actions in the
All Managed Sets overview so Fetch, Pull, and Push no longer rely on a blocking full-page POST flow.
- Added modal-based operation progress UI, with indeterminate progress for fetch and determinate progress for push.
- Added a first-commit guard so PushPull now requires
Fetch before creating the first local commit when the remote branch already has history.
- Fixed push planning so unchanged remote objects are reused in the normal linear-history case instead of being counted and uploaded again.
0.0.8
- Added new managed content domains for WordPress custom CSS and WordPress pages.
- Added a dedicated WordPress attachments domain with directory-backed repository storage using
attachment.json plus the binary file.
- Added explicit opt-in attachment sync through a
Sync with PushPull checkbox in the media library, so only marked attachments are managed.
- Added
wp_pattern_sync_status to the owned WordPress block pattern meta allowlist.
- Refactored the sync engine so managed sets can supply authoritative repository files directly, allowing non-manifest adapter families like attachments.
0.0.7
- Fixed WordPress block pattern apply/export escaping so
\\u002d sequences survive correctly in both post_content and pattern meta.
- Removed creation and modification timestamps from generic post-type canonical items to avoid false diffs across environments.
- Changed the
All Managed Sets overview so each managed set starts collapsed by default.
0.0.6
- Fixed branch commits so committing one managed set no longer removes previously committed managed-set content from the same branch.
- Reorganized the Managed Content admin UI so branch actions (
Pull, Fetch, Push) appear only in the all-managed-sets overview, while per-managed-set views keep only managed-set actions.
- Moved remote branch reset into Settings alongside the local repository reset controls.
- Added transparent current-site URL placeholder normalization for post-type-backed managed content so environment-local absolute URLs can round-trip across sites.
- Split plugin runtime assets from WordPress.org listing assets, with packaging and SVN deploy updated to use the correct directories.
0.0.5
- Added GitHub-backed remote repository support using GitHub's Git Database API.
- Added end-to-end commit, fetch, pull, merge, conflict resolution, apply, and push workflows in WordPress admin.
- Added local and remote repository reset actions, audit logging, and operation locking.
- Added support for multiple managed content domains, including GenerateBlocks conditions and WordPress block patterns.
- Added release automation for packaging, Plugin Check, WordPress.org SVN deploy, and public GitHub sync.
0.0.1
Initial public release focused on GitHub-backed synchronization of GenerateBlocks Global Styles.