One day, 13 page pairs: what happens when your own plugin meets a real site
On 14 September 2026 we used Wimpel on a site that belongs to us and has actual visitors. Not a demo. What came out: a bilingual site, a byte-exact copy of 88,963 characters, and three gaps in our own plugin that no test case would have found.
There is a kind of sentence we do not want to write about our own products: "in our tests, this works reliably." Tests are claims about conditions you built yourself. Wimpel had 333 of them, all green, and still nobody knew what the plugin feels like on a site that belongs to someone.
On 14 September 2026, one day after approval in the WordPress plugin directory, we fixed that. The internal name for it is the golden path: walk the whole route a stranger would walk, on a real site, with content that was not invented for the occasion. Sixteen steps, each with a condition. If a step breaks, the path ends there and the finding is the result.
The site
We picked the beta of vielfalt-begleiten.nrw, a public project supporting integration work in North Rhine-Westphalia. WordPress 7.1, 22 pages, 67 posts. Eight other plugins were active at the time, several of them ours. That matters: a plugin alone on an empty installation proves very little.
The site owner's brief was narrow: German and English, but without the seven interactive tool pages and without two internal pages. That left 13 pages. Installation went through the REST API straight from the directory, no file upload, which only works because the plugin had gone live there the day before.
The real test: a copy that changes nothing
To translate a page in Wimpel you press a button and get a draft: title, content and excerpt of the source, already linked to it. Sounds trivial. It is not.
On save, WordPress runs content through a function called wptexturize, which turns straight quotes into curly ones and double hyphens into dashes. In body text that is a blessing. Inside an inline script or a raw HTML island it is sabotage. Wimpel failed exactly there once, in version 1.0.0, and iframes disappeared.
So seven page pairs were not eyeballed after copying. They were compared, character by character:
| Page | Blocks | HTML islands | Characters source | Characters copy |
|---|---|---|---|---|
| Front page | 191 / 191 | 2 / 2 | 88,963 | 88,963 |
| About the project | 10 / 10 | 1 / 1 | 9,292 | 9,292 |
| Contact | 26 / 26 | 3 / 3 | 7,745 | 7,745 |
| Privacy policy | 67 / 67 | 0 | 16,463 | 16,463 |
| FAQ | 8 / 8 | 0 | 6,859 | 6,859 |
| Legal notice | 31 / 31 | 0 | 6,424 | 6,424 |
| Transfer agency | 17 / 17 | 0 | 3,225 | 3,225 |
The front page is the interesting one: 191 blocks, two HTML islands, three inline scripts and an interactive location map. Precisely the markup a text filter normally mangles. It came through untouched.
Three gaps no test case would have found
And then came the part these runs exist for.
The page template does not travel
All 13 drafts came out on the default template, even though 12 of the 13 sources use a custom landing page template. The copy takes title, content and excerpt, but not the template assignment. You see it immediately: the English page looks different from the German one despite holding the same content. Fixable by hand in twenty seconds per page, which across 13 pages is a quarter hour of work nobody should be doing.
Neither does the parent page
The next day, the same bug's twin: the English version of "The Team" ended up at the top level instead of sitting under the transfer agency like its original. With a page hierarchy, that changes the permalink. An address you expected becomes a different one, and if you notice after indexing, you now need a redirect.
The language switcher has only one size
The switcher always prints both parts, code and language name: "DE Deutsch EN English". In this site's header that pushed the navigation onto a second line and "Kontakt" dropped below the fold of the bar. The block does accept attributes, but discards them internally. A display option is planned for the next version: code only, name only, or both.
A fourth point is not a gap in the code but still annoying: the directory build no longer ships translation files, so the interface appears in English on a German installation. The correct fix runs through the WordPress translation platform, and that is where we will submit the German strings.
What stood at the end
13 page pairs live, every English page reachable, and on all 26 pages exactly three hreflang references: German, English, x-default. On the one deliberately monolingual page Wimpel emits no hreflang at all, exactly as the readme promises. That is the difference between a claim in a text and a claim you can verify in the source of a running site.
| German | English |
|---|---|
| /ueber-das-projekt/ | /about-the-project/ |
| /die-transferstelle/ | /the-transfer-agency/ |
| /fuer-kommunen/ | /for-municipalities/ |
| /fuer-traeger/ | /for-providers/ |
| /kontakt/ | /contact/ |
The slugs are translated, not numbered. That is deliberate, and it is where real multilingual setups part company with language switchers. An English page at /about-the-project/ has business in English search results. One at /ueber-das-projekt/?lang=en does not.
Plenty stayed open, and it belongs in this report: the HTML islands are still German, some internal links still point at German targets, a mailto subject line is German, and so is the menu. That last one is not a bug but a deliberate boundary. Wimpel does not translate menus, categories or theme strings.
The day after, or: the first maintenance case
On 15 September the site owner rebuilt the German side. Four pages changed, one added. The front page grew from 88,963 to 96,061 characters, "About the project" from 9,292 to 13,904.
This is the actual test for a multilingual plugin. Almost any tool manages the first build. It gets interesting once content keeps living.
The links held. All 14 pairs still pointed at each other after the rebuild, hreflang was intact, and the new page needed one click on the quick-add button in the page list. On the fresh copy: 168 of 168 blocks identical, the location map byte-exact, and in the video island exactly one changed string pair.
What is missing is the warning. Wimpel does not tell you a translation has gone stale. The awkward part: the function that could detect it already exists in the code. It compares a stored checksum of the original against today's content. It was cut because it belonged to the paid translation line. The golden path showed that this classification was wrong: the stale marker does not belong to the AI features, it belongs to multilingual work itself.
The side finding we liked most
While translating, we found a mistake that had nothing to do with the plugin. One paragraph appeared three times on the German front page. Some helper script had appended instead of replaced, months ago, and nobody had noticed.
That is the underrated side effect of going multilingual: a translation is a second reading of your own text, and an incorruptible one. Take 13 pages into another language sentence by sentence and you will find duplications, dead links and sentences nobody ever finished thinking.
What of this applies to your site
- Check the copy, not the promise. After your first translation draft, open the code editor on both versions and compare the block count. If a block is missing, stop there and find another tool.
- Use a page with scripts as your test case, not the simplest one. If a map, a video embed or a form survives the copy, your text pages will too.
- Budget in words, not clicks. The technical part took an hour. The translations are the work.
- Leave one page deliberately monolingual and check the source for hreflang. If it is there, your plugin is promising Google a page that does not exist.
- Translate the slugs. A language parameter on a German address is not an English page.
And the point of all this
We could have done this run and said nothing. Three gaps in a freshly published plugin are not marketing material.
The alternative is worse, though. A plugin that has never run on a real site is a promise without cover, and the WordPress directory holds plenty of those. We counted in January: 58.4 percent of listed plugins had gone more than a year without a release. The difference between a maintained plugin and an abandoned one does not show on launch day. It shows four weeks later, when somebody reports a bug.
The three gaps above are on the list for 1.1.2 and 1.2. What becomes of them will be written here when it happens.