WPML model
A post in English with translations to ES + FR + DE becomes 4 post rows linked by `wp_icl_translations`. Edit the source, and WPML marks the 3 translations stale. Re-sync is a per-locale job; admin gets slower with each locale.
WPML was a great answer to translation in 2010. Fifteen years later, the duplicate-post model is the source of most WordPress translation pain. Paragraphs replaces the data model. Your workflow stays.
WPML: cloned post rows. Paragraphs: external graph keyed by content fingerprint.
WPML: dictated by its schema. Paragraphs: subdir / subdomain / TLD — your call per project.
WPML: translations tied to plugin tables. Paragraphs: export JSON / XLIFF / TBX any time, free.
A post in English with translations to ES + FR + DE becomes 4 post rows linked by `wp_icl_translations`. Edit the source, and WPML marks the 3 translations stale. Re-sync is a per-locale job; admin gets slower with each locale.
A post is still a post. Each translatable unit inside it (block, title, button) is fingerprinted on save. The graph stores translations keyed by fingerprint. Edit one paragraph; only that fingerprint re-translates. Add a 13th locale; nothing slows down.
| Feature | Paragraphs | WPML |
|---|---|---|
| Storage model | External graph, fingerprinted | Duplicate posts per locale |
| URL structure | Free choice: subdir / subdomain / TLD | Plugin-controlled, schema-locked |
| Admin UI impact | None — your editor stays the same | Adds locale switcher to every screen |
| Headless story | Yes | No |
| Translated JSON-LD | Yes | Translates strings, not structure |
| Per-locale llms.txt | Yes | No |
| Block-level fingerprinting | Edit one block, only that re-translates | Re-syncs whole post |
| Migration off the product | Export JSON / XLIFF / TBX any time | Translations tied to WPML schema |
| Pricing model | Words / month, predictable | Per-site licence, annual renewals |
| Brand consistency | Glossary enforcement built in | Manual via Advanced Translation Editor |
The Paragraphs WordPress plugin ships with a WPML importer. It reads your existing post duplicates, dedupes by content, fingerprints, and writes everything to the graph as `approved` translations. Your old WPML posts stay in place until you delete them — zero-downtime cutover.
# Dry run first — preview what would happen
wp paragraphs migrate from-wpml --dry-run
# Run the migration (creates a checkpoint you can revert)
wp paragraphs migrate from-wpml --execute
# Cut traffic to the Paragraphs renderer
wp paragraphs delivery set edge-runtime
# Once you're happy — delete WPML's duplicate posts
wp paragraphs migrate from-wpml --cleanup Free tier covers a small site, so you can test the cutover end-to-end with zero cost.