LiveMalex Fotografie

Why a photographer stayed invisible despite having an SEO plugin

Malex Fotografie had an SEO plugin, nine city landing pages and almost no local visibility. The cause was not marketing but the foundation: two plugins cancelling each other out, every section written into the HTML three times, and city pages that were copies of the homepage. Rebuilt across twelve stages and roughly 50 hours, with measurable results.

Visit the project
Largest Contentful Paint, mobile (field)
8.3 s → under 2.5 sSource: Closing documentation, stages E1.3 / E3.1, June 2026
Largest Contentful Paint, mobile (lab)
11.6 s → 7 sSource: Closing documentation, stage E3.1, June 2026
display:none dead weight in homepage markup
77 → 12 occurrences (−84%)Source: Closing documentation, stage E1.2, June 2026
City pages with genuinely distinct content
0 of 9 → 12 of 12Source: Closing documentation, stage E2.1, June 2026
Pages carrying valid FAQ schema
0 → 14Source: Closing documentation, stage E2.2, verified via Google Rich Results Test
Stages completed
12 of 12Source: Closing documentation, June 2026

The site ran on WordPress with Kadence on shared hosting. It looked good and had everything you think local search needs: an SEO plugin, nine city pages, a portfolio. Only the homepage ranked. The causes sat below the surface and no amount of additional marketing could have fixed them.

Twelve of twelve stages completed. The homepage now loads on mobile in under 2.5 seconds instead of 8.3, the markup carries 84 percent less dead weight, and nine near-identical city pages became twelve with genuinely distinct content. The client holds documentation complete enough to run the site without me.

The real problem was not marketing

Alex photographs weddings around Regensburg. His website looked good, had an SEO plugin and nine city pages for the places he works in. Outside his own city he was still almost impossible to find.

The usual reflex here is to do more: more content, more keywords, maybe ads. That would have been money burnt. Before any measure could take effect, three things in the foundation had to be fixed — and none of them were visible from outside.

Stage 0 — Two plugins cancelling each other out

Yoast and Rank Math were both running. Yoast silently controlled robots.txt, the sitemap and the meta tags; Rank Math, which the whole plan was built on, produced no output at all in the markup. Everything maintained in the Rank Math backend never reached the site.

Fixed by exporting the Yoast settings, importing them into Rank Math and then deactivating Yoast. Since then there is a single source of truth for robots.txt, sitemap, meta tags, schema and redirects.

This is why an engagement starts with an audit rather than a list of measures. Without this finding, the remaining 49 hours would have achieved nothing.

Stage 1.2 — Every section appeared three times in the markup

The homepage contained 77 instances of display:none, and the pattern repeated on every city page. The cause: each section was built as three separate blocks — one for desktop, one for tablet, one for mobile — with two of them always hidden. A well-known page-builder anti-pattern. Kadence can handle responsive behaviour within a single block; that capability simply wasn’t used.

The fix was manual: page by page, block by block, removing the duplicate versions and configuring the survivors through the built-in breakpoints. Result: 12 instead of 77 occurrences on the homepage, 13 on a city page — roughly 84 percent less dead weight.

You don’t get to zero, and that isn’t the goal: the remainder comes from third-party plugin output and is normal for a modern WordPress site.

Stage 1.3 — When performance beats the nicer element

The hero slider was the single largest loading factor at around 3.5 seconds. The comparison made it unambiguous: homepage with slider 8.3 seconds on mobile, a city page without one 4.8 seconds.

Three options were on the table — carry the slider over to mobile, build a dedicated mobile slider, or use a static image. All three were tested. The decision went to the static image, with the reasoning written down: on a phone people scroll past the hero faster, so an instantly loaded image delivers more value there than a technically impressive but delayed slider.

That is the main contribution to the drop from 8.3 to under 2.5 seconds in real conditions.

Stage 2.2 — A mistake I found in my own closing audit

For the machine-readable description of the business, a connected entity graph was built: LocalBusiness with address, served cities and a reference to the founder, Person linking back to the business, plus FAQPage on 14 pages — all tied together through consistent @id anchors.

During verification in the closing audit it turned out that the LocalBusiness schema was invalid on the city pages. Rank Math Free only emits the full schema on the homepage, so required fields were missing everywhere else. On the homepage everything had worked — the city pages were a blind spot.

Fixed by extending the supplementary snippet with the missing fields, then re-verified with the Google Rich Results Test on the homepage and two city pages.

I include this because it is where work separates: a closing audit that only confirms what you built yourself is not an audit.

What the client is left holding

Not just a faster site, but documentation recording per stage what the situation was, what exists now and what remains open — with a technical reference for every snippet and setting, and separate task lists for him and for me.

That is deliberate. A website only its developer understands is a dependency, not a result.

Why does an SEO plugin sometimes have no effect at all?
Because a second plugin can be working against it. Here Yoast and Rank Math were both active. Yoast silently controlled robots.txt, the sitemap and the meta tags, while Rank Math produced no output in the markup at all. Every setting maintained in the Rank Math backend never reached the site. Until that is resolved, any further optimisation is wasted.
What does this kind of SEO rebuild cost?
This project took roughly 50 hours across twelve stages, from root-cause analysis to documentation. The effort depends heavily on how much legacy sits in the system, which is why every engagement starts with an audit that states the scope before any work is commissioned.
Why isn't it enough to swap the city name on a landing page?
Because Google recognises it as thin duplicate content. Here nine city pages were near-identical copies of the homepage — provable by the fact that all of them listed exactly the same 30 images. Google indexed them but ranked them behind the homepage. Only genuinely distinct text with real local references makes a city page able to rank for its city.
Is the site still maintainable once the project ends?
Yes. The engagement closes with documentation recording, per stage, what the situation was, what exists now and what remains open — including a technical reference for every snippet and setting, plus separate task lists for the client and for me.

← All work