[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fiMNGzPeG1UeaWBnuPPRWB3hRSd_VygTLQKyMn-GPm4I":3},{"slug":4,"display_name":5,"profile_url":6,"plugin_count":7,"total_installs":8,"avg_security_score":9,"avg_patch_time_days":10,"trust_score":11,"computed_at":12,"plugins":13},"jeromesteunenberg","Jerome Steunenberg","https:\u002F\u002Fprofiles.wordpress.org\u002Fjeromesteunenberg\u002F",1,0,100,30,94,"2026-05-20T03:57:00.619Z",[14],{"slug":15,"name":16,"version":17,"author":5,"author_profile":6,"description":18,"short_description":19,"active_installs":8,"downloaded":20,"rating":8,"num_ratings":8,"last_updated":21,"tested_up_to":22,"requires_at_least":23,"requires_php":24,"tags":25,"homepage":31,"download_link":32,"security_score":9,"vuln_count":8,"unpatched_count":8,"last_vuln_date":33,"fetched_at":34},"pushpull","PushPull","0.0.20","\u003Cp>PushPull stores selected WordPress content in a Git repository using a canonical JSON representation instead of raw database dumps.\u003C\u002Fp>\n\u003Cp>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:\u002F\u002Fcreativemoods.pt\u002Fdevops-with-wordpress\u002F\u003C\u002Fp>\n\u003Ch3>Beta notice\u003C\u002Fh3>\n\u003Cp>This is a beta plugin. It is still under active development, has limited functionality, and currently supports only a narrow subset of the intended PushPull feature set.\u003C\u002Fp>\n\u003Cp>The current release supports these managed domains:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Primary domains:\u003Cbr \u002F>\n   generateblocks_global_styles\u003Cbr \u002F>\n   generateblocks_conditions\u003Cbr \u002F>\n   wordpress_block_patterns\u003Cbr \u002F>\n   wordpress_categories\u003Cbr \u002F>\n   wordpress_comments\u003Cbr \u002F>\n   wordpress_menus\u003Cbr \u002F>\n   wordpress_pages\u003Cbr \u002F>\n   wordpress_posts\u003Cbr \u002F>\n   wordpress_tags\u003Cbr \u002F>\n   wordpress_custom_css\u003Cbr \u002F>\n   generatepress_elements\u003Cbr \u002F>\n   wordpress_attachments (explicit opt-in only)\u003Cbr \u002F>\ngeneric discovered custom post types and taxonomies\u003C\u002Fli>\n\u003Cli>Config domains:\u003Cbr \u002F>\n   wordpress_core_configuration\u003Cbr \u002F>\n   wpml_configuration\u003C\u002Fli>\n\u003Cli>Overlay domains:\u003Cbr \u002F>\n   translation_management (WPML-backed)\u003Cbr \u002F>\n   media_organization (Real Media Library-backed)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>PushPull keeps a local Git-like repository inside WordPress database tables and supports the following workflow directly from WordPress admin:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Test the remote GitHub or GitLab connection\u003C\u002Fli>\n\u003Cli>Commit live managed content into the local repository\u003C\u002Fli>\n\u003Cli>Initialize an empty remote repository\u003C\u002Fli>\n\u003Cli>Fetch remote commits into a local tracking ref\u003C\u002Fli>\n\u003Cli>Diff live, local, and remote states\u003C\u002Fli>\n\u003Cli>Pull remote changes through fetch + merge\u003C\u002Fli>\n\u003Cli>Merge remote changes into the local branch\u003C\u002Fli>\n\u003Cli>Resolve conflicts when needed\u003C\u002Fli>\n\u003Cli>Apply repository content back into WordPress\u003C\u002Fli>\n\u003Cli>Push local commits to GitHub or GitLab\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>The plugin also includes:\u003C\u002Fp>\n\u003Col>\n\u003Cli>An audit log screen\u003C\u002Fli>\n\u003Cli>Local repository reset tooling\u003C\u002Fli>\n\u003Cli>Remote branch reset tooling that creates one commit removing all tracked files from the branch\u003C\u002Fli>\n\u003Cli>A dedicated Domains screen that separates WordPress core, installed plugin integrations, and discovered custom content\u003C\u002Fli>\n\u003Cli>Global and per-domain managed-content views in the admin UI\u003C\u002Fli>\n\u003Cli>A high-level PushPull status dropdown in the WordPress admin bar\u003C\u002Fli>\n\u003Cli>Menu structure export and apply with hierarchy and theme location assignment\u003C\u002Fli>\n\u003Cli>A scheduled lightweight remote-head check that highlights when \u003Ccode>Fetch\u003C\u002Fcode> likely has updates available\u003C\u002Fli>\n\u003Cli>Bulk \u003Ccode>Commit + Push All\u003C\u002Fcode> and \u003Ccode>Pull + Apply All\u003C\u002Fcode> workflows for whole-site bootstrap and deploy flows\u003C\u002Fli>\n\u003Cli>A \u003Ccode>wp pushpull\u003C\u002Fcode> WP-CLI command surface for status, configuration, domains, and sync operations\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Current scope\u003C\u002Fh3>\n\u003Cp>This is an early, focused release. At the moment, PushPull is intentionally limited to:\u003C\u002Fp>\n\u003Col>\n\u003Cli>GitHub and GitLab as implemented remote providers\u003C\u002Fli>\n\u003Cli>Managed domains across three families:\u003Cbr \u002F>\n   generateblocks\u002Fglobal-styles\u002F\u003Cbr \u002F>\n   generateblocks\u002Fconditions\u002F\u003Cbr \u002F>\n   wordpress\u002Fblock-patterns\u002F\u003Cbr \u002F>\n   wordpress\u002Fcategories\u002F\u003Cbr \u002F>\n   wordpress\u002Fcomments\u002F\u003Cbr \u002F>\n   wordpress\u002Fmenus\u002F\u003Cbr \u002F>\n   wordpress\u002Fpages\u002F\u003Cbr \u002F>\n   wordpress\u002Fposts\u002F\u003Cbr \u002F>\n   wordpress\u002Ftags\u002F\u003Cbr \u002F>\n   wordpress\u002Fcustom-css\u002F\u003Cbr \u002F>\n   wordpress\u002Fattachments\u002F\u003Cbr \u002F>\n   wordpress\u002Fconfiguration\u002F\u003Cbr \u002F>\n   wpml\u002Fconfiguration\u002F\u003Cbr \u002F>\n   wordpress\u002Fgeneratepress-elements\u002F\u003Cbr \u002F>\n   wordpress\u002Fcustom-post-types\u002F\u002F\u003Cbr \u002F>\n   wordpress\u002Fcustom-taxonomies\u002F\u002F\u003Cbr \u002F>\n   translations\u002Fmanagement\u002F\u003Cbr \u002F>\n   media\u002Forganization\u002F\u003C\u002Fli>\n\u003Cli>Canonical JSON storage with one file per managed item for manifest-backed sets, plus directory-backed storage for attachments using \u003Ccode>attachment.json\u003C\u002Fcode> and the binary file\u003C\u002Fli>\n\u003Cli>Explicit opt-in attachment sync through a media-library checkbox\u003C\u002Fli>\n\u003Cli>Overlay domains that scope themselves to enabled compatible base domains rather than exporting every backend row blindly\u003C\u002Fli>\n\u003Cli>A cached remote-head availability signal for \u003Ccode>Fetch\u003C\u002Fcode>, driven by a configurable recurring check instead of a live provider probe on every page load\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>It does not yet manage forms, users, arbitrary \u003Ccode>wp_options\u003C\u002Fcode>, or arbitrary plugin data.\u003C\u002Fp>\n\u003Ch3>How PushPull represents content\u003C\u002Fh3>\n\u003Cp>PushPull does not use WordPress post IDs as repository identity.\u003C\u002Fp>\n\u003Cp>For the currently supported managed sets it stores:\u003C\u002Fp>\n\u003Col>\n\u003Cli>One canonical JSON file per managed item\u003C\u002Fli>\n\u003Cli>One separate \u003Ccode>manifest.json\u003C\u002Fcode> file for manifest-backed sets that preserves logical ordering\u003C\u002Fli>\n\u003Cli>One directory per attachment for the attachments set, containing \u003Ccode>attachment.json\u003C\u002Fcode> and the binary file\u003C\u002Fli>\n\u003Cli>Stable logical keys instead of environment-specific database IDs\u003C\u002Fli>\n\u003Cli>Canonical logical-key references for cross-domain relationships such as reading settings, translation groups, media folders, GeneratePress condition targets, and menu object references\u003C\u002Fli>\n\u003Cli>Recursive placeholder normalization for current-site absolute URLs in post-type-backed content\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Configuration\u003C\u002Fh3>\n\u003Cp>PushPull currently supports GitHub and GitLab repositories.\u003C\u002Fp>\n\u003Cp>For GitHub, grant:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Repository metadata read access\u003C\u002Fli>\n\u003Cli>Repository contents read and write access\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>For GitLab fine-grained personal access tokens, grant:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>Project: Read\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Branch: Read\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Commit: Read\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Commit: Create\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>Repository: Read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>In PushPull > Settings:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Select \u003Ccode>GitHub\u003C\u002Fcode> or \u003Ccode>GitLab\u003C\u002Fcode> as the provider\u003C\u002Fli>\n\u003Cli>Enter the repository owner and repository name\u003C\u002Fli>\n\u003Cli>Enter the target branch\u003C\u002Fli>\n\u003Cli>Enter the API token\u003C\u002Fli>\n\u003Cli>Optionally set the remote fetch check interval in minutes\u003C\u002Fli>\n\u003Cli>Click \u003Ccode>Test connection\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Save the settings\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Domain selection\u003C\u002Fh4>\n\u003Cp>In PushPull > Domains:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Enable one or more managed domains\u003C\u002Fli>\n\u003Cli>Review WordPress core, installed plugin integrations, and discovered custom content separately\u003C\u002Fli>\n\u003Cli>Opt into generic discovered custom post types and taxonomies when you want them managed\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Workflow\u003C\u002Fh4>\n\u003Cp>The normal workflow is:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>Commit\u003C\u002Fcode> to snapshot the current live managed-set content into the local repository\u003C\u002Fli>\n\u003Cli>\u003Ccode>Fetch\u003C\u002Fcode> to import the current remote branch into \u003Ccode>refs\u002Fremotes\u002Forigin\u002F\u003Cbranch>\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Inspect the live\u002Flocal and local\u002Fremote diff views if needed\u003C\u002Fli>\n\u003Cli>\u003Ccode>Pull\u003C\u002Fcode> for the common fetch + merge flow, or \u003Ccode>Merge\u003C\u002Fcode> manually after fetch when you want review first\u003C\u002Fli>\n\u003Cli>\u003Ccode>Apply repo to WordPress\u003C\u002Fcode> when you want the local branch state written back into WordPress\u003C\u002Fli>\n\u003Cli>\u003Ccode>Push\u003C\u002Fcode> when you want local commits published to GitHub or GitLab\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>PushPull also performs a lightweight recurring remote-head check and visually highlights \u003Ccode>Fetch\u003C\u002Fcode> when the latest scheduled check suggests the remote branch has advanced since the last fetch.\u003C\u002Fp>\n\u003Cp>For whole-site bootstrap flows, PushPull also supports:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>Commit + Push All\u003C\u002Fcode> to snapshot and publish all enabled domains\u003C\u002Fli>\n\u003Cli>\u003Ccode>Pull + Apply All\u003C\u002Fcode> to import and apply all enabled domains on a bare target site\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>If both local and remote changed, PushPull can persist conflicts, let you resolve them in the admin UI, and then finalize a merge commit.\u003C\u002Fp>\n\u003Cp>When pushing to GitLab, PushPull currently linearizes local merge results into a normal commit on the remote branch instead of preserving merge topology. The merged tree content is preserved; only the remote Git history shape is flattened.\u003C\u002Fp>\n\u003Ch4>WP-CLI\u003C\u002Fh4>\n\u003Cp>PushPull also exposes a \u003Ccode>wp pushpull\u003C\u002Fcode> command.\u003C\u002Fp>\n\u003Cp>Examples:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Ccode>wp pushpull status\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull domains\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull config list\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull config set branch main\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull config enable-domain wordpress_pages\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull commit wordpress_pages\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull push\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull commit-push-all\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>wp pushpull pull-apply-all\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch4>Empty repositories\u003C\u002Fh4>\n\u003Cp>If the configured GitHub or GitLab repository exists but has no commits yet, \u003Ccode>Test connection\u003C\u002Fcode> will report that the repository is reachable but empty.\u003C\u002Fp>\n\u003Cp>In that case, click \u003Ccode>Initialize remote repository\u003C\u002Fcode>. PushPull will:\u003C\u002Fp>\n\u003Col>\n\u003Cli>create the first commit on the configured branch\u003C\u002Fli>\n\u003Cli>fetch that initial commit into the local remote-tracking ref\u003C\u002Fli>\n\u003Cli>make the repository ready for normal commit, fetch, merge, apply, and push workflows\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>You do not need to create the first commit manually on the provider before using PushPull.\u003C\u002Fp>\n\u003Ch3>TODO\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Cache the admin-bar PushPull status summary so the high-level live\u002Flocal and local\u002Fremote aggregation is not recomputed on every page view.\u003C\u002Fli>\n\u003Cli>Move chunked async provider resumability fully into the provider layer so \u003Ccode>AsyncBranchOperationRunner\u003C\u002Fcode> no longer needs provider-specific GitLab staging rehydration logic.\u003C\u002Fli>\n\u003Cli>Improve push progress and recap reporting to distinguish newly uploaded objects from objects reused from the remote history.\u003C\u002Fli>\n\u003Cli>Surface unresolved logical-reference mapping issues, such as GeneratePress condition IDs that could not be converted to logical placeholders, instead of silently leaving mixed raw IDs and canonical refs.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>External services\u003C\u002Fh3>\n\u003Cp>PushPull connects to the GitHub or GitLab API for the repository you configure in the plugin settings.\u003C\u002Fp>\n\u003Cp>The plugin uses the provider REST API to:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Read repository metadata and the default branch\u003C\u002Fli>\n\u003Cli>Read and update branch refs\u003C\u002Fli>\n\u003Cli>Read and create Git objects or provider-equivalent commit actions\u003C\u002Fli>\n\u003Cli>Test repository access before sync operations\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>PushPull sends the following information to the configured provider over HTTPS:\u003C\u002Fp>\n\u003Col>\n\u003Cli>The repository owner, repository name, branch, and API base URL\u003C\u002Fli>\n\u003Cli>Your configured API token in the provider-specific authentication header\u003C\u002Fli>\n\u003Cli>Canonical JSON representations of the managed content you choose to commit and push\u003C\u002Fli>\n\u003Cli>Commit metadata such as commit messages and, if configured, author name and email\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>In the current release, the managed content sent to the provider is limited to the enabled supported domains: GenerateBlocks Global Styles, GenerateBlocks Conditions, WordPress Block Patterns, WordPress Categories, WordPress Comments, WordPress Menus, WordPress Pages, WordPress Posts, WordPress Tags, WordPress Custom CSS, GeneratePress Elements, explicitly opted-in WordPress Attachments, WordPress core configuration, WPML configuration, generic discovered custom post types and taxonomies, WPML-backed translation management, and Real Media Library-backed media organization.\u003C\u002Fp>\n\u003Cp>PushPull does not send your whole WordPress database to the provider. It only sends the managed content represented by the enabled adapters.\u003C\u002Fp>\n\u003Cp>GitHub terms of service: https:\u002F\u002Fdocs.github.com\u002Fen\u002Fsite-policy\u002Fgithub-terms\u002Fgithub-terms-of-service\u003Cbr \u002F>\nGitHub privacy statement: https:\u002F\u002Fdocs.github.com\u002Fen\u002Fsite-policy\u002Fprivacy-policies\u002Fgithub-general-privacy-statement\u003Cbr \u002F>\nGitLab terms: https:\u002F\u002Fabout.gitlab.com\u002Fterms\u002F\u003Cbr \u002F>\nGitLab privacy statement: https:\u002F\u002Fabout.gitlab.com\u002Fprivacy\u002F\u003C\u002Fp>\n","Git-based content sync for WordPress. Project homepage: https:\u002F\u002Fcreativemoods.pt\u002Fpushpull\u002F",532,"2026-04-14T10:49:00.000Z","6.9.4","6.0","8.1",[26,27,28,29,30],"content-sync","devops","generateblocks","git","github","https:\u002F\u002Fgithub.com\u002Fcreativemoods\u002Fpushpull","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpushpull.0.0.20.zip",null,"2026-04-16T10:56:18.058Z"]