What moves where

v0.0.3

This page lists each kind of item a WordPress source gives and the record it becomes in Mishka CMS. A run walks the kinds in this order, so a record that others point at is written first. Every record is written through the same action the CMS's own form runs, as the admin who pressed Import, and the permission in the table is the one that admin needs.

What it moves and how it works, on one page: Mishka CMS Migration.

The kinds

KindBecomesPermission
Authors (Users)A Mishka Blog blogger, the profile of a user of the site. The user is the one whose email is the author's.admin:dashboard:blog:post, and admin:dashboard:user to find the users
CategoriesBlog categories, with their parents written first.admin:dashboard:blog:post
TagsBlog tags.admin:dashboard:blog:post
MediaFiles in the Media library, downloaded from the source's own site.admin:dashboard:runtime:media
SettingsThe site's title, logo and icon, as site.title, site.logo and site.favicon.admin:dashboard:setting
StylesheetsA theme stylesheet with an Elementor site's global colours and fonts as tokens, and a dark twin of each colour.admin:dashboard:runtime:stylesheet
PagesPages, drawn in the site's main layout, as drafts unless you chose Live at their old addresses.admin:dashboard:runtime:page
PostsBlog posts.admin:dashboard:blog:post
CommentsBlog comments.admin:dashboard:blog:comment, and admin:dashboard:blog:post to find the posts
RedirectsA redirect rule for each address a WordPress visitor knows that the site serves elsewhere.admin:dashboard:runtime:redirect
MenusLinks in the site's layout, or a component, as you decide.admin:dashboard:runtime:layout

Posts

A post is served at its WordPress address, such as /2025/12/hello/, when you keep the addresses and the source's posts share a structure. A category is served at its chain of parents, as WordPress writes it. See Choose how post addresses move.

A post keeps its title, slug, content, excerpt and featured image. A sticky post becomes featured. A post that is pending review, private, password-protected or scheduled at the source comes in as a draft, and its item says so, such as Private at the source, so a draft. A post is in the language the source names for it, and the posts that are translations of each other are joined as one group. A post whose language the site does not publish in waits for your decision.

Categories and tags

A category or a tag the site already has waits for your decision. It is found by the slug the Blog stores, so it is matched exactly. Connect to the existing record makes the item that record: nothing is written, the posts that name it are linked to it, and it is kept as it is. Import as new with another slug writes it as its own, with its source id after its slug. See Settle what needs your decision.

Pages

A page's path is the path of its address at the source, without the host and the trailing slash. Each segment is written in Latin letters, so /Café is /cafe, and a segment with no Latin letter is written as page- and eight generated characters. See How slugs and page addresses are made. Its content is converted to the CMS's markup. Pieces the importer cannot convert are offered to plugins, and what no plugin converts is kept as text. A page built with Elementor widgets the CMS has no equivalent for waits for your decision.

Media

A file is downloaded from the host you named, and its name and folder are made as the CMS names them. A file on another host, such as a CDN, is skipped with Its file is not on the source's own site, so it is left there. A file whose type or size Media does not take is skipped with the reason. The CMS checks that a file's first bytes are the type its name says. Two files with the same content are found only when they are downloaded, so only the import can ask you about them.

Redirects

Every address a WordPress visitor knows is a redirect item: a post's, a category's, a tag's, a page's and a file's address, the old slugs of a post, the feeds, the sitemaps, the list pages, the day archives, the pages of a paged list and each author's archive. A rule sends the address with a 301 to where the site serves what it points at. A feed or a day archive goes to the Blog's list of posts, and a sitemap goes to the site's own /sitemap.xml.

A redirect is written only to an address the site serves. An item is skipped, with the reason, when:

  • the source gives no address for it: No public address at the source;
  • what it points at was not imported: What it points at was not imported, or Its post was not imported;
  • no visitor can open what it points at, such as a draft: What it points at is not public on the site, so it has no redirect;
  • the site already serves it at that address: Already at its old address, or, for the posts list, The Blog's list of posts is served at its address.

An old address that the site already redirects is not overwritten: that item fails with the CMS's reason and the site's rule stays. The dry run plans the redirects as the import writes them. With no redirects chosen, every item is skipped as Left out by this run's choices.