Passer for Craft CMS

Configuration

Plans, not settings

Passer is configured per migration plan, in the control panel under Passer. A plan holds the source connection, the mapping and the phase selection. It is saved, re-runnable and exportable, because a real migration is never run once: it is run against a copy, examined, corrected, and run again over weeks while the WordPress site is still being edited.

The config file

Plugin-wide defaults can be set under Settings → Passer, or in config/passer.php so they can differ per environment:

<?php
return [
    // Where downloaded WordPress attachments land
    'mediaVolumeHandle' => 'images',

    // Records per queue job. Lower it on constrained hosts.
    'batchSize' => 100,

    // How many of each element a test-import brings across
    'testImportLimit' => 5,

    // Rewrite links to the old site as Craft reference tags
    'rewriteLinks' => true,

    // Keep unhandled Gutenberg blocks as rendered markup rather than dropping them
    'preserveUnknownBlocks' => true,

    // Refuse a database connection that turns out to be writable
    'requireReadOnlySource' => true,
];

Choosing destinations

During plan, each domain gets a destination. Passer detects what is installed and offers the preferred target, falling back to something that needs nothing but Craft:

DomainPreferredFallback
SEOSEOmatic, ether/seoPlain Craft fields Passer creates
RedirectsRetour, Venveo Redirect, FriendsA config/redirects.php of URL rules
MenusFreeNav, Verbb NavigationA structure section of link entries
FormsFormieBandage, or a written specification
CommentsVerbb CommentsCounted and reported
WidgetsGlobal sets, or a widgets section
CommerceCraft CommerceProducts as plain entries

Mapping

The plan proposes a full mapping you can override row by row:

  • which post type becomes which section and entry type
  • where each meta key lands, or that it is deliberately dropped
  • which taxonomy becomes which category group
  • which ACF field group becomes which field layout

The proposal comes out of analyse, so it is shaped by what is actually in the database rather than by what WordPress claims is installed.

The wp-import bridge

If craftcms/wp-import is installed, Passer reuses its ACF adapters and Gutenberg block transformers for anything it does not handle itself — including adapters you wrote in config/wp-import/.

The coupling is deliberately loose. wp-import ships as dev-main with no tagged releases, so a bridge that cannot load leaves Passer's own adapters in place rather than failing the migration.