{"id":383580,"date":"2026-10-19T10:39:22","date_gmt":"2026-10-19T10:39:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/selective-entity-sync\/"},"modified":"2026-10-19T10:39:04","modified_gmt":"2026-10-19T10:39:04","slug":"cherrylift","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cherrylift\/","author":20232033,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.0","stable_tag":"0.3.0","tested":"7.1.3","requires":"6.9","requires_php":"7.4","requires_plugins":null,"header_name":"Cherrylift \u2013 Selective Content Sync","header_author":"Gabriel de Tassigny","header_description":"Push selected content (posts, pages, custom post types, terms and media) from one WordPress site to another (e.g. staging to production) using entity manifests, with automatic ID remapping, so live data is never overwritten.","assets_banners_color":"556bd8","last_updated":"2026-10-19 10:39:04","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/gabriel-detassigny\/cherrylift","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":59,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.0":{"tag":"0.3.0","author":"gdetassigny","date":"2026-10-19 10:39:04","revision":3754525}},"upgrade_notice":{"0.3.0":"<p>WP-CLI exports no longer take --file: packages are written to wp-content\/uploads\/cherrylift\/exports\/.<\/p>","0.2.0":"<p>Renamed to Cherrylift: code using the old hooks, REST API or WP-CLI command must switch to the cherrylift names.<\/p>","0.1.1":"<p>Maintenance release: safer error messages and packaging fixes.<\/p>","0.1.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3754525,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3754525,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3754525,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3754525,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3754525,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.3.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3754525,"resolution":"1","location":"assets","locale":"","width":1280,"height":860},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3754525,"resolution":"2","location":"assets","locale":"","width":1280,"height":860},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3754525,"resolution":"3","location":"assets","locale":"","width":1280,"height":860},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3754525,"resolution":"4","location":"assets","locale":"","width":1280,"height":860}},"screenshots":{"1":"Select the content to export, with search and filters by type and status.","2":"The export preview lists the selected items and every dependency added automatically, with the package size.","3":"The import preview shows what will be created or updated on this site. Untick anything you want to keep unchanged.","4":"The import report links to every imported item."}},"plugin_section":[],"plugin_tags":[529,16271,4155,19979,1558],"plugin_category":[59],"plugin_contributors":[287485],"plugin_business_model":[],"class_list":["post-383580","plugin","type-plugin","status-publish","hentry","plugin_tags-content","plugin_tags-deployment","plugin_tags-migration","plugin_tags-staging","plugin_tags-sync","plugin_category-utilities-and-tools","plugin_contributors-gdetassigny","plugin_committers-gdetassigny"],"banners":{"banner":"https:\/\/ps.w.org\/cherrylift\/assets\/banner-772x250.png?rev=3754525","banner_2x":"https:\/\/ps.w.org\/cherrylift\/assets\/banner-1544x500.png?rev=3754525","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/cherrylift\/assets\/icon.svg?rev=3754525","icon":"https:\/\/ps.w.org\/cherrylift\/assets\/icon.svg?rev=3754525","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cherrylift\/assets\/screenshot-1.png?rev=3754525","caption":"Select the content to export, with search and filters by type and status."},{"src":"https:\/\/ps.w.org\/cherrylift\/assets\/screenshot-2.png?rev=3754525","caption":"The export preview lists the selected items and every dependency added automatically, with the package size."},{"src":"https:\/\/ps.w.org\/cherrylift\/assets\/screenshot-3.png?rev=3754525","caption":"The import preview shows what will be created or updated on this site. Untick anything you want to keep unchanged."},{"src":"https:\/\/ps.w.org\/cherrylift\/assets\/screenshot-4.png?rev=3754525","caption":"The import report links to every imported item."}],"raw_content":"<!--section=description-->\n<p>Cherrylift copies the content you choose from one WordPress site to another, for example from staging to production, without migrating the database.<\/p>\n\n<p>Copying a whole database (or whole tables) overwrites everything created on the target since the last sync: orders, user accounts, form entries, comments. Cherrylift only moves the items you pick, plus everything they depend on, and leaves the rest of the target site alone.<\/p>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>On the source site, go to <strong>Tools \u2192 Cherrylift \u2192 Export<\/strong>, select content and download a package (a zip file).<\/li>\n<li>On the target site, upload it under <strong>Import<\/strong>. A preview shows what will be <strong>created<\/strong> or <strong>updated<\/strong>, and you can untick anything you don't want to change.<\/li>\n<li>Import. Every reference is remapped to the target site's IDs and URLs.<\/li>\n<\/ol>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Dependencies included automatically<\/strong>: parent pages, categories and tags (with their parent terms), featured images, media used in blocks and galleries, and synced patterns.<\/li>\n<li><strong>Safe to repeat<\/strong>: every item gets a stable ID that travels with it, so syncing again updates the same content instead of duplicating it. Content created separately with the same slug is recognized too.<\/li>\n<li><strong>References remapped<\/strong>: parent pages, featured images, term hierarchy, image, gallery, cover, file and video block IDs, <code>wp-image-\u2026<\/code> classes, <code>[gallery]<\/code> shortcodes, media URLs (including every image size) and links to the source domain.<\/li>\n<li><strong>Media handled carefully<\/strong>: files are uploaded with WordPress's usual checks and image sizes are regenerated; existing media is only replaced when the file actually changed.<\/li>\n<li><strong>Meta merged, not wiped<\/strong>: custom fields in the package are updated; fields that only exist on the target are kept.<\/li>\n<li><strong>Large packages<\/strong> are imported in batches with a progress bar.<\/li>\n<li><strong>Drafts, scheduled and private content<\/strong> can be synced and keep their status.<\/li>\n<li><strong>WP-CLI<\/strong>: <code>wp cherrylift export<\/code> and <code>wp cherrylift import<\/code>, including dry runs.<\/li>\n<li><strong>REST API<\/strong> for automation.<\/li>\n<li><strong>Developer-friendly<\/strong>: more than 25 actions and filters to change what is exported, how content is matched, which meta keys hold IDs, and more. See the <a href=\"https:\/\/github.com\/gabriel-detassigny\/cherrylift#hooks-reference\">hooks reference<\/a>.<\/li>\n<li>Translation-ready.<\/li>\n<\/ul>\n\n<h4>What is never synced<\/h4>\n\n<p>Users, comments, orders and other non-content data, by design. Site settings, themes, plugins, menus, templates and global styles are not synced either.<\/p>\n\n<h4>Source code<\/h4>\n\n<p>The full source code, tests and issue tracker are on <a href=\"https:\/\/github.com\/gabriel-detassigny\/cherrylift\">GitHub<\/a>. The admin screen's JavaScript in <code>build\/<\/code> is compiled from <code>src-js\/<\/code> in that repository with <code>@wordpress\/scripts<\/code>: run <code>npm install<\/code> and <code>npm run build<\/code> to rebuild it. Contributions are welcome; see <code>CONTRIBUTING.md<\/code> in the repository.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin on <strong>both<\/strong> the source and the target site.<\/li>\n<li>Go to <strong>Tools \u2192 Cherrylift<\/strong>.<\/li>\n<li>Export from the source site, then import the package on the target site.<\/li>\n<\/ol>\n\n<p>Imports from the admin screen are limited by PHP's upload size (<code>upload_max_filesize<\/code> and <code>post_max_size<\/code>). For very large packages, use WP-CLI on the target site:<\/p>\n\n<pre><code>wp cherrylift import package.zip --user=admin\n<\/code><\/pre>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20importing%20overwrite%20my%20orders%2C%20users%20or%20form%20entries%3F\"><h3>Will importing overwrite my orders, users or form entries?<\/h3><\/dt>\n<dd><p>No. Only the items in the package are created or updated. Nothing else on the target site is changed.<\/p><\/dd>\n<dt id=\"what%20exactly%20ends%20up%20in%20a%20package%3F\"><h3>What exactly ends up in a package?<\/h3><\/dt>\n<dd><p>The items you select, plus what they need to display correctly: parent pages, categories, tags and their parents, featured images, media used in the content, and synced patterns. The export preview lists every item before you download. Child pages are not included unless you select them.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20import%20the%20same%20package%20twice%2C%20or%20sync%20again%20later%3F\"><h3>What happens if I import the same package twice, or sync again later?<\/h3><\/dt>\n<dd><p>Items are updated in place. Each item carries a stable ID (stored as hidden metadata) that is used to recognize it on the target, so nothing is duplicated.<\/p><\/dd>\n<dt id=\"what%20if%20the%20target%20already%20has%20a%20page%20with%20the%20same%20slug%20that%20was%20created%20separately%3F\"><h3>What if the target already has a page with the same slug that was created separately?<\/h3><\/dt>\n<dd><p>It is treated as the same page and updated, then linked for future syncs. This avoids \"contact-2\" duplicates on sites that were set up separately. Developers can turn this off with the <code>cherrylift_match_existing_entity<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20some%20items%20on%20the%20target%20unchanged%3F\"><h3>Can I keep some items on the target unchanged?<\/h3><\/dt>\n<dd><p>Yes. In the import preview, untick the items you don't want to create or update.<\/p><\/dd>\n<dt id=\"are%20custom%20fields%20supported%3F\"><h3>Are custom fields supported?<\/h3><\/dt>\n<dd><p>Custom fields (post meta and term meta) are copied. Fields that store IDs of other content (beyond featured images) are only remapped if a developer declares them with the <code>cherrylift_id_reference_meta_keys<\/code> filter. Advanced Custom Fields relationship, post object, image and gallery fields are not remapped automatically yet.<\/p><\/dd>\n<dt id=\"some%20media%20wasn%27t%20imported.%20why%3F\"><h3>Some media wasn't imported. Why?<\/h3><\/dt>\n<dd><p>The target site only accepts file types allowed for uploads there. For example, SVG files are rejected by a default WordPress install. The import report lists anything that was skipped or failed.<\/p><\/dd>\n<dt id=\"are%20links%20to%20other%20pages%20updated%3F\"><h3>Are links to other pages updated?<\/h3><\/dt>\n<dd><p>Links that point to the source site's domain are rewritten to the target site's domain. Links whose page has a different slug on the target are not adjusted.<\/p><\/dd>\n<dt id=\"who%20can%20use%20it%3F\"><h3>Who can use it?<\/h3><\/dt>\n<dd><p>Administrators (the <code>manage_options<\/code> capability) by default. Developers can change this with the <code>cherrylift_capability<\/code> filter; WordPress's normal per-item permissions then still apply.<\/p><\/dd>\n<dt id=\"is%20it%20safe%20to%20import%20a%20package%20someone%20sent%20me%3F\"><h3>Is it safe to import a package someone sent me?<\/h3><\/dt>\n<dd><p>Only import packages you trust: a package is content from another site. Packages are validated before anything is extracted (sizes, file list, file types, checksums), and only content types can be written, never site configuration. Users without the <code>unfiltered_html<\/code> capability get their imported content filtered as usual.<\/p><\/dd>\n<dt id=\"i%20use%20nginx.%20anything%20to%20configure%3F\"><h3>I use nginx. Anything to configure?<\/h3><\/dt>\n<dd><p>Uploaded packages wait in <code>wp-content\/uploads\/cherrylift\/<\/code> until they are imported, and WP-CLI exports are written there too. Their names are random and the folder blocks web access with an <code>.htaccess<\/code> file, which nginx ignores. Add a <code>location ^~ \/wp-content\/uploads\/cherrylift\/ { deny all; }<\/code> rule to block it there too.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Multisite networks haven't been tested yet. Syncing directly between sites of the same network isn't supported: export from one site and import on the other.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Changed: <code>wp cherrylift export<\/code> writes packages to <code>wp-content\/uploads\/cherrylift\/exports\/<\/code> and prints their path (<code>--porcelain<\/code> prints only the path). The <code>--file<\/code> option is removed.<\/li>\n<li>Changed: uploaded packages waiting for import are kept in <code>wp-content\/uploads\/cherrylift\/packages\/<\/code>.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Renamed from Selective Entity Sync to Cherrylift. Hooks (<code>cherrylift_*<\/code>), the REST API (<code>cherrylift\/v1<\/code>) and the WP-CLI command (<code>wp cherrylift<\/code>) use the new name.<\/li>\n<li>Fixed: when a site lowers the plugin's capability, the Export list only shows content the user can read.<\/li>\n<li>Changed: WP-CLI exports only write new <code>.zip<\/code> files and never overwrite existing ones.<\/li>\n<li>Translations now come from translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fixed: error messages are now escaped for safe display everywhere, and still read normally in the admin screen, the import report and WP-CLI.<\/li>\n<li>The plugin package now includes composer.json.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release: export, import with preview and batching, ID and URL remapping, WP-CLI commands, REST API, French translation.<\/li>\n<\/ul>","raw_excerpt":"Move selected posts, pages, terms and media between WordPress sites without overwriting live data. IDs and links are remapped automatically.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/383580","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=383580"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/gdetassigny"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=383580"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=383580"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=383580"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=383580"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=383580"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=383580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}