40+
October 3, 2026
March 5, 2020
WP Branches For Post adds a Git-like editorial workflow to WordPress.
When a published page or post needs a larger edit, you do not have to change the live content directly. Create a private working branch, edit it in the normal WordPress editor, review the differences, and merge only when you are ready. The public original keeps its post ID, URL and publication identity throughout the workflow.
Version 2.1 adds a three-way merge review. The plugin remembers the original state at branch creation, compares the current original with the current branch, separates non-conflicting work from real conflicts, and helps you update or merge without silently overwriting newer changes.
The screenshots on the plugin page follow the same workflow described below, so you can see what each control looks like before using it:
On an original post, the panel shows whether a branch can be created and lists active branches you can edit.
On a branch, the panel shows:
The review separates changes into four groups:
For reviewable fields, the panel also shows the baseline, current original and branch values so you can understand why an item is listed.
A successful merge can synchronize normal editorial content, supported post meta, and taxonomies.
The plugin intentionally preserves the original post’s identity and publication state. In particular, the merge does not replace the original post ID, GUID, slug, author or publication dates. For hierarchical content, the branch cannot change the original parent relationship because that can change a public URL.
Media IDs already referenced by content and featured-image metadata remain usable. Attachments are not re-parented.
Version 2.1 uses the baseline captured at branch creation to distinguish three situations:
This is why a branch can often merge safely even when the original changed after branch creation.
When the original has newer non-conflicting changes, “Update branch from original” rebases the working branch onto the newer original state.
Branch-only work is preserved, original-only work is imported into the branch, and a fresh baseline is recorded. If the operation cannot complete safely, the plugin attempts to restore the branch to its previous state instead of leaving a partial update.
Force merge is intentionally not the default path.
It is offered only after a conflict is detected and reviewed. For listed merge conflicts, force merge prefers the branch value. Non-conflicting newer work on the original is still preserved.
Extensions can further restrict who is allowed to force merge through the plugin’s capability/filter boundary.
A WordPress synced pattern is global content. Editing the synced pattern itself changes that pattern everywhere it is used and is not isolated by a post branch.
When a branch references synced patterns, WP Branches For Post warns you in the branch panel so that global pattern edits are not mistaken for isolated branch edits.
The complete review experience is available in the Block Editor document sidebar.
Classic Editor, post-list row actions and the admin bar retain compatibility controls for creating/opening branches and performing supported branch actions. For the clearest conflict review, use the Block Editor panel.
If an action is unavailable or the plugin stops a merge, that is normally a safety check rather than a hidden setting:
Branches created by older plugin versions remain recognizable.
A 2.0-style branch with a compatible stored baseline hash can still merge normally when the original has not changed. Older branches without a full 2.1 snapshot cannot show the detailed three-way comparison, so the plugin treats them conservatively and requires explicit review when the state is uncertain.
Useful filters and actions include:
wbfp_branchable_post_statuseswbfp_create_branch_post_datawbfp_excluded_meta_keyswbfp_mergeable_post_fieldswbfp_can_force_mergewbfp_branch_createdwbfp_before_mergewbfp_after_mergeSecurity-critical invariants remain enforced after extension filters run. A branch remains a draft of the same post type, protected runtime metadata remains excluded, mergeable core fields stay inside the plugin’s allowlist, and force merge still passes through the plugin’s authorization boundary.
See ARCHITECTURE.md for the data flow, SECURITY.md for authorization and synchronization boundaries, and TESTING.md for the reproducible full-validation environment used for 2.1.
The Block Editor source is in src/index.js and is built with @wordpress/scripts.
Human-readable source code and build tooling are maintained at https://github.com/hsxk/WP-Branches-For-Post/.
/wp-content/plugins/wp-branches-for-post.No separate settings page is required for the normal workflow.
No. A branch is an isolated working draft. A normal WordPress publish attempt is forced back to draft. Use the plugin’s merge action when the work is ready.
No. The existing original post remains the public resource. Its post ID and identity are preserved, and identity-related values such as slug, author and publication dates are not taken from the branch.
The plugin compares the original, the branch and the saved baseline. Original-only work can be preserved, non-conflicting work can be rebased, and overlapping divergent edits are reported as conflicts instead of being silently overwritten.
No. If newer original changes do not conflict with the branch, the three-way merge can preserve them. Updating the branch first is useful when you want to continue editing on top of the newest original state.
For conflicts you explicitly review, force merge prefers the branch value. Newer original work that does not conflict with the branch is still preserved.
Yes. The branch panel provides a branch preview link and a link to the current original so you can compare them outside the editor.
The branch is moved to Trash. The original post is not changed.
The original is updated through WordPress, keeping its identity, and the merged branch is moved to Trash.
Supported taxonomies are synchronized as part of the branch workflow, including clearing a taxonomy when that is the reviewed branch state.
Supported post metadata is synchronized. Runtime/plugin bookkeeping keys are excluded, and extensions can add their own exclusions.
Featured-image metadata is part of normal synchronized metadata. The referenced media item keeps its existing attachment identity.
No. Synced patterns are global WordPress entities. The plugin detects references and warns you, but editing a synced pattern itself affects every place that pattern is used.
Yes, when the post type uses the normal WordPress editing APIs and the current user has the required capabilities.
Yes. Compatibility paths remain, but older branches may not have the full 2.1 baseline required for detailed three-way review and are therefore handled more conservatively.