Context
A portal for finding what is on — concerts, cinema, theatre, exhibitions, festivals. It runs on WordPress that has accumulated five thousand events, dozens of plugins and a runtime that no longer receives security fixes over ten years. The editorial team enters every event by hand, and advertising is sold without anyone counting how often a banner was shown.
What was wrong
- Runs on PHP 7.4, which has had no security patches since November 2022
- Five thousand events in a database nobody has cleaned in ten years
- Ten years of indexed URLs — any change to the structure costs search positions
- Every event is typed in by hand; nothing is imported from the organisers
- Ad slots are sold, but impressions are never counted
Constraints
The old site has to stay up throughout — a listings portal cannot disappear mid-season. Every URL must keep working one to one, or ten years of search positions go with it. And the rebuild runs in phases, because the editorial team keeps working in the meantime.
What we did
- Every event, venue and media file migrated off the old install — over twenty thousand files
- All 6,226 legacy URLs checked against the new site, each one lands on the right page
- A custom catalogue instead of WordPress — concerts, cinema, theatre, exhibitions, festivals, with search that understands Czech
- A new look: dark, bold and built around the event posters
- A back office for the editorial team: events, venues, media library, review queue, users
- A custom ad system — campaigns, creatives, placements, impression and click counting, monthly reports for advertisers
- Programme imports from organisers and film sources into a review queue, instead of retyping
- Bilingual interface, Czech content — an English page with no Czech translation canonicalises to the Czech one, so hreflang never claims a translation that does not exist