{"id":399928,"date":"2026-11-13T07:50:52","date_gmt":"2026-11-13T07:50:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/migrator-for-elementor\/"},"modified":"2026-11-13T07:50:31","modified_gmt":"2026-11-13T07:50:31","slug":"migrator-for-elementor","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/migrator-for-elementor\/","author":23599803,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Migrator for Elementor","header_author":"Houssame17","header_description":"Make selected Elementor pages, templates and Site Settings available to another of your WordPress sites, whose administrator approves and imports them with their media and templates, remapping IDs and URLs.","last_updated":"2026-11-13 07:50:31","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":71,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"houssame17","date":"2026-11-13 07:50:31","revision":3799877}},"upgrade_notice":{"1.0.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3799981,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3799981,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3799981,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3799981,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[76538,4155,19979,1558,4516],"plugin_category":[43,59],"plugin_contributors":[292495],"plugin_business_model":[],"class_list":["post-399928","plugin","type-plugin","status-publish","hentry","plugin_tags-elementor","plugin_tags-migration","plugin_tags-staging","plugin_tags-sync","plugin_tags-templates","plugin_category-customization","plugin_category-utilities-and-tools","plugin_contributors-houssame17","plugin_committers-houssame17"],"banners":{"banner":"https:\/\/ps.w.org\/migrator-for-elementor\/assets\/banner-772x250.png?rev=3799981","banner_2x":"https:\/\/ps.w.org\/migrator-for-elementor\/assets\/banner-1544x500.png?rev=3799981","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/migrator-for-elementor\/assets\/icon-128x128.png?rev=3799981","icon_2x":"https:\/\/ps.w.org\/migrator-for-elementor\/assets\/icon-256x256.png?rev=3799981","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Migrator for Elementor copies hand-picked Elementor content from one of your WordPress sites (for\nexample a staging site) to another one of your sites (for example production). The same plugin is\ninstalled on both sites.<\/p>\n\n<p>The destination PULLS. The source only makes pages available; the destination's administrator\nlists them on the destination, approves them, and only then does the destination read and import\nthem. Nothing is pushed to the destination and nothing is stored there before that approval.<\/p>\n\n<p>Each page is imported with everything it needs: its media, the Elementor templates it uses (nested\ntemplates included), the global colors and fonts it relies on, its parent page, and the IDs it\nreferences are rewritten to the matching objects of the destination.<\/p>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>On the SOURCE site open <strong>Migrator for Elementor<\/strong>, choose <strong>Source site<\/strong> and click\n<strong>Generate connection key<\/strong>.<\/li>\n<li>On the DESTINATION site open <strong>Migrator for Elementor<\/strong>, choose <strong>Destination site<\/strong>, enter the\nsource URL and the key on <strong>Source &amp; options<\/strong>, <strong>Save<\/strong>, then <strong>Test Connection<\/strong>.<\/li>\n<li>On the source <strong>Pages<\/strong> tab (or <strong>Templates<\/strong> tab) select items and click <strong>Send to destination<\/strong>\n(or <strong>Send<\/strong> on one row). They are only made available: the <strong>Sent to destination<\/strong> tab lists\nthem, and you can withdraw them.<\/li>\n<li>On the destination, the administrator opens <strong>Incoming changes<\/strong>. The list is read live from the\nsource. They select items and click <strong>Approve and import selected<\/strong> (or <strong>Reject selected<\/strong>).<\/li>\n<li>The destination then imports the approved items (and the templates, media, Site Settings and\nparent pages they need), with overall and per-item progress, Pause, Resume, Cancel, Retry and\nRetry Media. Progress is saved after every step. The source's <strong>Sent to destination<\/strong> tab shows\neach item as imported, failed or rejected.<\/li>\n<li>Optional: tick <strong>Auto Sync<\/strong> on a page or template on the source. Saving it in Elementor makes it\navailable again; it is still imported only when the destination's administrator approves it.<\/li>\n<\/ol>\n\n<h4>Approval and security<\/h4>\n\n<ul>\n<li>The source never sends anything on its own and cannot change the destination. It answers signed,\nread-only requests from the destination, and only for the items its administrator made\navailable (plus the templates, media, Site Settings and parent pages they use).<\/li>\n<li>The destination stores nothing from the source before its administrator approves. The import\nthen runs in that administrator's own session (wp-admin, nonce, manage_options).<\/li>\n<li>No request is ever run as a user of the other site, and the connection key cannot be used to\nlog in. Requests are signed with HMAC-SHA256 and a single-use nonce, valid 5 minutes, and the\nkey is bound to one destination.<\/li>\n<\/ul>\n\n<h4>What is imported<\/h4>\n\n<ul>\n<li>Page \/ post fields: title, slug, content, excerpt, status, password, parent page (an Elementor\nparent missing on the destination is imported first), author (matched by login \/ e-mail),\ndates, menu order, page template, featured image, terms (missing terms are created).<\/li>\n<li>All Elementor data and meta. Elementor meta removed on the source is removed on the destination.<\/li>\n<li>Theme \/ SEO \/ ACF post meta, per the source's options: Astra, OceanWP, GeneratePress, Kadence,\nYoast, Rank Math, ACF values, plus custom keys.<\/li>\n<li>References by ID, rewritten to the destination objects: templates (shortcode, Template \/ Loop\nwidgets, global widgets, popups), posts and products (query controls, dynamic tags, ?page_id=\nlinks, Contact Form 7 \/ WPForms \/ WooCommerce shortcodes), terms, users, menus, media (galleries,\nElementor 4 image controls, ACF image fields), Theme Builder and popup display conditions.\nA referenced object missing on the destination is reported and the reference is cleared, never\nleft pointing to another object.<\/li>\n<li>Media: absolute, relative and CDN upload URLs. Files are deduplicated (also files uploaded by hand\non both sites); a file replaced on the source is imported again; large files are read in parts.<\/li>\n<li>Elementor templates of every type, the Site Settings (global colors and fonts are added\nautomatically when a page needs them), Elementor Pro custom fonts and custom code, and every\npost type edited with Elementor.<\/li>\n<\/ul>\n\n<p>Before an item is imported, the destination checks: Elementor version, Flexbox Containers \/ Nested\nElements features, widgets (Elementor Pro and add-ons), page template, ACF fields, shortcodes.\nBlocking problems stop the item (option), the others are listed as warnings.<\/p>\n\n<p>Two import modes (destination, Source &amp; options):<\/p>\n\n<ul>\n<li><strong>Best effort<\/strong> (default): every approved item is imported as completely as possible. The page on\nthe destination is overwritten (also one with the same slug that this plugin did not create),\nfiles the destination refuses or that cannot be read are skipped, a template that fails does not\nblock the page, and every problem is listed as a warning.<\/li>\n<li><strong>Restricted<\/strong>: choose the situations that stop an item (nothing is written): same slug not created\nby the plugin, local copy edited, refused file type, media not imported, failed template \/ Site\nSettings \/ parent page, missing Elementor widgets \/ features \/ version.<\/li>\n<\/ul>\n\n<p>Deletions are never offered automatically: on the source, a page in the trash can be offered as a\n\"move to trash\" request, which the destination's administrator approves like any other change.\nPages moved to a new path get a 301 redirect on the destination.<\/p>\n\n<h4>Trademarks<\/h4>\n\n<p>Elementor is a trademark of Elementor Ltd. This plugin is an independent project; it is not\naffiliated with, endorsed by or sponsored by Elementor Ltd.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not use any third-party service, does not track users and sends no data to the\nplugin author.<\/p>\n\n<p>It only connects <strong>two WordPress sites that you own and configure yourself<\/strong>, both running this\nplugin: the destination reads from the \"Source URL\" entered on its Source &amp; options tab, with the\nconnection key generated on that source.<\/p>\n\n<ul>\n<li>What is transferred, and when: only when the destination's administrator opens Incoming changes\n(the list of items made available) and approves items (their content and settings, the media files\nthey use, the post meta chosen in the source's options), plus the result reported back to the\nsource (imported \/ failed \/ rejected, the destination's URLs of the imported page).<\/li>\n<li>How: signed HTTPS requests from the destination to the source (HMAC-SHA256 with the connection\nkey, single-use nonce). The connection key itself is never transmitted.<\/li>\n<li>Who receives it: only your own destination site. Its terms and privacy policy are your own.<\/li>\n<\/ul>\n\n<p>Nothing is transferred until both sites are configured and the destination's administrator acts.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>On the source site the plugin stores the connection key (and the destination bound to it), its\noptions, the list of items made available with the destination's answers, and the last import date\nof each page. On the destination site it stores the source URL and connection key, its options, the\nprogress of an approved import and, on each imported post or media, the identifier of its source\n(used to update it instead of duplicating it). It does not collect personal data. Page content may\ncontain personal data you entered yourself; it is copied to your own destination site only.<\/p>\n\n<h3>Limitations<\/h3>\n\n<ul>\n<li>Content without Elementor (WooCommerce products, posts not built with Elementor, ACF field groups,\nGravity Forms forms) is not imported: references to it are matched by slug, so it must exist on the destination.<\/li>\n<li>Elementor Pro custom icon sets are not imported.<\/li>\n<li>The source must be reachable from the destination (a staging site behind a login wall or HTTP\nauthentication must let the destination's requests through).<\/li>\n<li>An approved import continues in the background through WP-Cron when the screen is closed.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Elementor and Migrator for Elementor on both sites (Plugins &gt; Add New, or upload the ZIP).<\/li>\n<li>Follow the steps of \"How it works\" above.<\/li>\n<\/ol>\n\n<p>Requirements: Elementor active on both sites (and the same Pro widgets \/ add-ons if the pages use\nthem), the source reachable over HTTP(S) from the destination, both servers' clocks within 5 minutes.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20send%20my%20content%20to%20an%20external%20service%3F\"><h3>Does it send my content to an external service?<\/h3><\/dt>\n<dd><p>No. Content only goes from your source site to your destination site, read by the destination.<\/p><\/dd>\n<dt id=\"can%20the%20source%20site%20change%20my%20destination%20site%3F\"><h3>Can the source site change my destination site?<\/h3><\/dt>\n<dd><p>No. The source cannot send anything: the destination reads from it, and only after its own\nadministrator approved the items. The connection key cannot be used to log in or to act as a user.<\/p><\/dd>\n<dt id=\"will%20it%20overwrite%20an%20existing%20page%20on%20the%20destination%3F\"><h3>Will it overwrite an existing page on the destination?<\/h3><\/dt>\n<dd><p>Only if the destination's administrator approves it. In the default \"Best effort\" mode the page\nimported earlier by the plugin, or else the page with the same slug, is then updated. Choose\n\"Restricted\" and tick \"a page or template with the same slug exists...\" to stop instead of\noverwriting a page the plugin did not create.<\/p><\/dd>\n<dt id=\"why%20is%20an%20svg%20or%20font%20file%20skipped%3F\"><h3>Why is an SVG or font file skipped?<\/h3><\/dt>\n<dd><p>WordPress refuses these file types by default. Enable \"Accept SVG, JSON and font files\" on the\ndestination (Source &amp; options tab); SVG files are then sanitized with the Elementor sanitizer.<\/p><\/dd>\n<dt id=\"my%20source%20is%20on%20localhost%20or%20a%20private%20network\"><h3>My source is on localhost or a private network<\/h3><\/dt>\n<dd><p>Requests use wp_safe_remote_post(), which refuses private addresses. On the destination, allow them with:\n    add_filter( 'migfe_allow_unsafe_urls', '__return_true' );<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data if I delete the plugin?<\/h3><\/dt>\n<dd><p>Settings, progress and import dates are removed. The source identifier stored on imported posts\nand media is kept, so a later reinstallation updates the same pages instead of duplicating them.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<li>Pull model: the source makes pages available; the destination's administrator lists them, approves\nor rejects them, and only then does the destination read and import them. Nothing is pushed to\nthe destination or stored there before approval.<\/li>\n<li>Signed, read-only source endpoints (HMAC-SHA256, single-use nonce, key bound to one destination,\nkey never transmitted); no request runs as a user of the other site.<\/li>\n<li>Site role (source or destination) chosen once; each role shows only its own tabs and settings.<\/li>\n<li>Source: Pages tab (filters, Last Sync date and status, selection, Send to destination), Templates\ntab (Elementor templates, Site Settings, Elementor Pro custom fonts and custom code), Sent to\ndestination tab (status of each item, withdraw, trash requests), Auto Sync per page or template.<\/li>\n<li>Destination: Incoming changes tab (live list, approve \/ reject selected, resumable import with\nPause, Resume, Cancel, Retry and Retry Media), import options.<\/li>\n<li>Automatic dependencies: templates (recursive), Site Settings global colors \/ fonts, parent pages.<\/li>\n<li>Generic remapping of references by ID: templates, posts, products, terms, users, menus, media,\ndynamic tags, query controls, shortcodes, Theme Builder and popup display conditions.<\/li>\n<li>Page fields, parent page, password, author, terms, featured image, and theme \/ SEO \/ ACF post meta.<\/li>\n<li>Media: absolute, relative and CDN URLs, deduplication by hash, replaced files imported again,\nlarge files read in parts, optional SVG \/ JSON \/ font support with SVG sanitization.<\/li>\n<li>Requirement checks: Elementor version, Flexbox Containers \/ Nested Elements, widgets, page\ntemplate, ACF fields, shortcodes. Two modes: \"Best effort\" (default) and \"Restricted\".<\/li>\n<li>301 redirects for pages moved to a new path.<\/li>\n<li>Uninstall removes settings and working data.<\/li>\n<\/ul>","raw_excerpt":"Copy Elementor pages, templates and Site Settings between your sites, with their media: the destination's administrator approves every import.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/399928","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=399928"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/houssame17"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=399928"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=399928"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=399928"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=399928"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=399928"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=399928"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}