From WordPress to Drupal

When switching is actually worth it.

I migrate your content, structure and SEO value without data loss, with an approach that surfaces risks upfront.

Discuss your migration

From WordPress to Drupal

Switching from WordPress to Drupal isn't an improvement for most sites.
If your site runs, is up to date, and does what you need, a migration costs money without a result.
The switch pays for itself when your content structure, your languages, your permissions or your integrations start hitting the limits of WordPress.
I make that call first, before a single line of code gets written.

When you shouldn't switch

A well-running blog or a straightforward business site belongs on WordPress.
WordPress is a solid system for that, with plenty of ready-made functionality, and the migration cost never pays for itself.
I'd rather say that before the job than after.

  • ✓ You have a blog or news site with articles, categories and an author per piece.
  • ✓ Your business site has twenty to fifty pages, one language and two people working on it.
  • ✓ Your site is fast, up to date, and someone handles the updates.
  • ✓ You mainly want a new design, since that's possible within WordPress.
  • ✓ You have no technical profile in-house and no budget for maintenance, since Drupal needs more of both.
WordPress plugins that don't carry over in a migration

The choice isn't about which platform is better, but about what your site needs to be able to do.
I worked out that comparison in Drupal versus WordPress.
If that shows WordPress is enough, the conversation stops there.

The real reasons to switch

A switch is defensible once WordPress starts moving work around instead of solving it.
Five triggers come up repeatedly, and usually two or three apply at once.

Content structures with relationships

WordPress knows posts and pages, everything beyond that comes from plugins.
Once you're linking products to projects to locations with custom post types, ACF field groups and three relationship plugins, you're building a content model on top of a system that wasn't meant for it.
Drupal has entities, fields, taxonomy and entity reference in its core, so relationships are configuration, not construction.
You only notice that difference by the third extension.

Multilingualism

Multilingualism sits in Drupal core, in WordPress it's a plugin.
Keeping Dutch, French and English side by side means fields, menus, taxonomy terms, settings and interface text each need a translation, with their own workflow and revision history.
Drupal handles that per field and per entity.
With more than two languages, or an editorial team that works differently per language, this is often the argument that makes the rest unnecessary.

Permissions and workflows

Not every editor should be able to do everything, and Drupal lets you configure that with fine granularity.
Permissions apply per entity type, per bundle, per field and per workflow state.
With Content Moderation and Workspaces you can keep draft, in review and published existing side by side, have changes approved by someone else, and put a whole set of changes live in one go.
For an organisation with a communications department and local editors, that's the difference between agreements and enforceable rules.

Integrations beyond what a plugin can do

Connections to an ERP, a CRM, a PIM or a membership system are custom work, not a plugin.
Drupal gives you a service container, a queue and cron mechanism, its own import layer and JSON:API in core, so you build an integration as code that lives in Git, goes through code review and can be tested.
A plugin landscape where three different parties each manage a piece of your data flow is less durable than code you own.

Scale

Scale is about editorial workload and data volume, not just visitor numbers.
Tens of thousands of nodes, dozens of editors, hundreds of listings with filters and facets, and a caching strategy that's right per component: that's where Drupal, with Views, cache tags and BigPipe, stays predictable.
At five hundred pages and a thousand visitors a day, scale isn't the argument.

What doesn't come along: your plugins

Plugins don't migrate, because they only exist within WordPress.
What a plugin did for you, you rebuild in Drupal with core or with a contrib module, and that's usually the smallest part of the work.
The most common translations:

  • Yoast or Rank Math becomes the Metatag module, with your existing titles and meta descriptions carried over to the metatag fields.
  • WPML or Polylang becomes the multilingualism built into Drupal core.
  • ACF becomes fields on entities, with no extra module needed.
  • Contact Form 7 or Gravity Forms becomes Webform.
  • A page builder becomes Paragraphs or Layout Builder, and that's a design decision, not a module install.
  • A caching plugin becomes the caching built into core, with cache tags and BigPipe.

The real work is in the plugins without an equivalent.
Those become custom work, or they get dropped because no one uses them anymore.
Which of the two it is gets decided during the assessment, and that's also where one of the biggest cost items sits.

My approach: assess, model, migrate, verify

  1. Assessment. Mapping all post types, taxonomies, ACF field groups, plugins and templates, plus the full URL list from the sitemap, Search Console and the server logs.
    Result: what needs to move over, what's dropped, and where the custom work sits, ranked by impact.
  2. Content model in Drupal. The model redesigned in entities, bundles and fields, instead of rebuilding the WordPress structure one to one.
    This is where the switch pays off, because skipping this step means carrying your old limitations onto a more expensive platform.
  3. Migration as code. The Migrate API sits in Drupal core, and with Migrate Plus and Migrate Tools on top, the migrations live as configuration in Git.
    That makes them repeatable, reversible and testable.
    For blog content there's the contrib module wordpress_migrate, which reads in a WXR export, but it doesn't have a stable release yet.
    I usually write my own source plugins straight against the WordPress database, because a WXR export loses ACF fields and relationships.
  4. Verify and repeat. The migration runs dozens of times before it's final.
    Comparing counts per content type, spot checks on fields and internal links, and on the day of the switch, a fresh import from the latest WordPress state.

The broader migration process, including upgrades of existing Drupal sites, is on Drupal migration and upgrade.
The approach is the same, only the source differs.

URL structure and redirects: what protects your rankings

Preserving your URL structure as much as possible is the safest choice.
Pathauto generates paths per content type, so you can mirror the existing permalink structure.
It's rarely fully identical: trailing slashes, feeds and query URLs like /?p=123 get caught with 301 redirects.
Pathauto is a stable contrib module and supports Drupal 11.

Where a URL does change, it needs a 301 pointing directly to the new page.
The Redirect module manages those redirects, and the bundled Redirect 404 submodule logs which old addresses are still being requested, so you still catch forgotten cases after go-live.
I don't leave redirect chains in place: every old URL points to its destination in one step.

URL inventory of a page tree during migration

Delivery includes a new sitemap, correct canonicals, a checked robots.txt, and the titles and meta descriptions from Yoast or Rank Math carried over to the metatag fields.
Loss of visibility almost always comes from one of those four, not from the CMS.
More on that under technical SEO.

Your domain name itself doesn't move with the CMS, it stays put and points to the new hosting on the day of go-live.
The steps to take before, during and after the switchover to keep your rankings are laid out in migrating your website without losing your search visibility.

Media and attachments

Media is usually the messiest part of a WordPress migration.
In WordPress, images are attachments with their own posts, often duplicated, sometimes hard-coded into the content.
In Drupal, those become media entities with fields, so alt text, rights and reuse only become manageable at that point.

Concretely: moving files over while preserving the path where possible, converting attachments to media entities, rewriting inline image references to embeds, and redefining image styles so you serve modern formats at the right dimensions.
Missing alt text surfaces here, and it's better to fill that in during the migration than afterwards.

Bringing accessibility along from the start

A migration is the cheapest moment to fix accessibility, since you're touching every template anyway.
The European Accessibility Act, directive 2019/882, has applied since 28 June 2025, and the standards are WCAG 2.2 level AA and EN 301 549.
Drupal core delivers correct semantics and an admin environment that works with keyboard and screen reader, but your theme and components determine most of it.
Whether your site falls under it depends on what you offer, so have that checked legally.
More on that under digital accessibility.

Which Drupal version you land on

You end up on Drupal 11, currently 11.4.x.
Building new on Drupal 10 no longer makes sense, since Drupal 10 loses support on 9 December 2026.
There's no need to wait for the next version, since the path from 11 to 12 is a normal upgrade within the same architecture.
How that kind of version upgrade of an existing Drupal site works is on Drupal migration and upgrade.

What the switch costs

A price without an assessment is a guess, and I don't give those.
What determines the cost: the number of content types and fields, the number of languages, the plugins needing custom work, how much the design gets reused, and above all the state of your data.
A thousand blog articles with a fixed field pattern are simpler than two hundred pages that are each structured differently.

My rates are 75 to 95 euros per hour or 650 to 800 euros per day, excluding VAT, lower for long engagements and returning clients.
For comparison: Belgian Drupal freelancers list rates on Malt between 400 and 600 euros per day with a median around 550 euros, the broader Belgian IT freelance market sits around 710 euros per day, and Freelance.nl quotes 70 to 90 euros per hour for the Netherlands.
The full explanation is on rates, and how that kind of day rate is built up in what a freelance Drupal developer costs.

The assessment itself is a bounded assignment of a few days and delivers a list of what migrates, what becomes custom work, and where the risk sits.
After that you know what it costs, and also whether it's worth it.
Both outcomes are a valid result.

Why work with me

Want to know if a switch makes sense for your situation, send the URL of your current site and what isn't working.
I'll look at your request and usually give you honest advice or an estimate of the possibilities within 24 hours via contact.

Frequently asked questions

How can I migrate my WordPress website?

Via Drupal core's Migrate API, with Migrate Plus and Migrate Tools on top, the migrations sit as configuration in Git and are therefore repeatable.
For blog content there's the contrib module wordpress_migrate, which reads in a WXR export, but it doesn't have a stable release yet.
For ACF fields and relationships I write custom source plugins against the WordPress database, since a WXR export loses those.
The migration then runs dozens of times on a test environment.

Do my WordPress plugins carry over to Drupal?

No, plugins only work within WordPress.
What a plugin did for you gets rebuilt in Drupal with core or a contrib module: Yoast or Rank Math becomes Metatag, WPML becomes the multilingual support from core, ACF becomes fields on entities, Contact Form 7 or Gravity Forms becomes Webform, and a caching plugin becomes the caching from core.
The real work is in the plugins without an equivalent: those become custom code or they're dropped.
Which of the two it is, the inventory determines.

Can my current WordPress design carry over?

Your theme doesn't carry over, since Drupal uses Twig templates and builds components differently.
The design itself can carry over: house style, typography and the structure of your pages can be rebuilt, and that's usually also the moment to replace a page builder with Paragraphs or Layout Builder.
If you mainly want a new design and nothing else, that on its own isn't a reason to move away from WordPress.

What happens to my WordPress users and comments?

Users get carried over as user entities with their roles, but passwords in practice don't carry over, so everyone sets a new password after the switch.
Comments are a core entity in Drupal, so they migrate along with their reference to the right article.
A migration is also the moment to clean up, since spam and never-approved comments are better left behind.

Is WordPress reliable?

Yes, for what it's meant for.
WordPress runs a large part of the web, the core itself is solid, and the vulnerabilities mostly sit in plugins and themes that are no longer maintained.
So the risk grows with the number of plugins, not with WordPress itself.
That's also why a site with five plugins has no reason to switch, while a site with forty-five plugins is worth the conversation.

What are the most common problems with WordPress?

Plugin dependency and everything that follows from it.
Functionality managed separately by three different parties, updates that break each other, abandoned plugins without security follow-up, and a content model stretched with custom post types and field plugins into something nobody oversees anymore.
On top of that comes slow load times from stacked-up CSS and JavaScript.
None of those problems automatically calls for a migration, but together they make your maintenance unpredictable.

How do you back up your WordPress website?

A full backup consists of two parts: a dump of the MySQL database and the complete wp-content folder with your uploads, themes and plugins.
For a migration I take both at the same moment, since the database alone gives you content without files.
More important than the backup itself is that you actually restore it on a test environment once, because a restore procedure that's never been run is not a restore procedure.

A question about this topic?

Briefly describe your situation, and I'll let you know what's going on and what it would cost. No sales pitch.

Privacy policy

Who we are

This policy applies to David Porschmann (freelance web developer).
Contact: support@porschmann.be.

What data we process

Name, email address, company name (optional), and your message or enquiry. When you visit our website, we also process limited technical data (such as IP address and browser type) for security and analytics purposes.

Why we process your data (legal basis)

  • To respond to your enquiry or provide a quotation (consent or pre-contractual necessity).
  • For administration and invoicing during collaboration (contractual necessity).
  • For security and troubleshooting (legitimate interest).

Retention periods

Contact form submissions: maximum of 24 months.
Client records and invoicing: according to legal retention periods.

Sharing with third parties

We do not share your data with third parties, except with processors who help us host the website, send emails, or handle administration. Data processing agreements have been concluded with these partners.

Your rights

Right of access, rectification, erasure, restriction, data portability, and withdrawal of consent.
Email us at support@porschmann.be.

Security

We take appropriate technical and organisational measures to protect your data.

Cookies and analytics

Brief explanation of the tools used (e.g. Matomo, Clarity, GA) and a link to the cookie policy, if applicable.

Contact

Questions about this policy?
support@porschmann.be