Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Migrating content from another CMS

Moving the content of another content management system into Exponential as an integration project - inventory, mapping, the import approach, internal links and media, users, redirects for old addresses, rehearsals, the…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/integrators/migrating-content-from-another-cms.md

On this page

Migrating content from another CMS

This page is for integrators who move a site from another content management system into Exponential. A migration is an integration that runs a few times instead of every night, but it needs the same discipline: a key per record, a dry run, a repeatable import, and a check. Migrations from earlier versions of this code base (4.x, 5.x legacy) are a different task, covered by the installation book (Migrating from 4.x).

Contents

  1. The phases
  2. Inventory and mapping
  3. The import approach
  4. Internal links, media and users
  5. Old addresses
  6. Rehearsals and cut-over
  7. Acceptance

The phases

PhaseResult
1. InventoryCounts per content type, languages, media volume, users, URL patterns of the old site
2. MappingOne mapping table per class (template) and decisions on what is not migrated
3. ExtractThe old system's content as files (database export, an API dump, XML, CSV)
4. Import buildA repeatable import keyed by remote_id (<old system>-<type>-<old id>)
5. RehearsalsAt least two full runs on a copy, with checks, timed
6. Content freeze and cut-overThe final run, redirects on, DNS or proxy switched
7. Acceptance and clean-upChecks signed off; old system archived

Inventory and mapping

Count before you estimate: content items per type and language, the depth of the tree, the number and size of media files, the share of rich text with embedded elements (tables, embeds, shortcodes), users and their groups, and the URL patterns. Each pattern of embedded markup the old system invented (shortcodes, macros) is a conversion rule to build and test.

Agree with the customer what not to migrate: outdated news, drafts, revisions, comments, statistics. Every item left out saves time in every rehearsal.

The import approach

Volume and shapeApproach
A few hundred pages, simple fieldsxrowextract import from CSV or JSON with a column mapping and a preview (page), or php bin/php/ezcsvimport.php
Thousands of items, rich text, relationsAn import command of your own with eZContentFunctions (Writing an import script)
A tree prepared offline by a toolA JSON package, installed with ezpm.php (install --as-drafts for review) (page)

Import in dependency order: folders and categories, then media, then content that refers to them, then relations in a second pass. Publish without notification. Set section_id on create where sections drive access.

  • Internal links in rich text point to old addresses. In the conversion, replace each link to a migrated item with a link to the new object (rich text in ezxmltext can link to objects and nodes); collect the links you cannot resolve into a report for editors.
  • Media: import files first, keyed by remote id, so content can relate to them. Keep the alternative text; the image datatype takes path|alternative text.
  • Users: import users as user objects with their groups. Password hashes of another system cannot be assumed to work in Exponential; plan a password reset for every migrated account (the forgotten password function, or php bin/php/resetuserpassword.php for single accounts), and tell users before the cut-over. Migrate only the users that are still needed.

Old addresses

Every old address that search engines or other sites know should answer with a permanent redirect:

PatternUse
A few important pagesGlobal URL aliases that redirect, at Setup > URL aliases (Links, URL aliases, wildcards)
A whole old path pattern (/blog/*)URL wildcards (same guide)
Thousands of individual old idsA redirect map at the web server, generated by the import from old address to new URL alias

Generate the redirect list from the import itself: each record knows its old address and, after publishing, its node's URL alias.

Rehearsals and cut-over

  • Run the full import at least twice on a copy of production; time it; fix and repeat.
  • Before the final run: freeze content in the old system, pause your other integrations' cronjob parts, and switch maintenance mode on if the new site is already public (php bin/php/maintenance.php on --message="..." --until=2h).
  • After the run: rebuild the search index if indexing was delayed (php bin/php/updatesearchindex.php), clear the caches (Caching after imports), switch redirects on, switch maintenance mode off, resume cronjob parts.

Acceptance

  • To do: Counts per class match the inventory (minus what was agreed to leave out).
  • To do: A sample of pages per class compared side by side with the old site.
  • To do: No unresolved internal links above the agreed threshold; the report handed to editors.
  • To do: Every image has its alternative text.
  • To do: A sample of old addresses answers with a permanent redirect to the right page.
  • To do: Users can reset their passwords and sign in.
  • To do: The import can be re-run without duplicates (second run reports only unchanged).

Become an Exponential Partner

Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x