PMS integration ships to production Feature
The theme now carries the integration itself, so the live site reads availability and files enquiries without a plugin in between.
A public site in ten languages, on a WordPress theme written from scratch, that asks the PMS what is free and hands it back the enquiries.
The public face of the same operation pms_ixa runs behind: property cards, availability, and an enquiry form that lands in the PMS inbox rather than in somebody's mail folder.
It is a block theme written by hand, no page builder and no npm — edited in place, reloaded in the browser, seeded from a repeatable script. The reason is maintenance: the people who update the content are not developers, and the thing they update should not be able to break the layout.
It began as a rescue. The previous site was a React SPA that went blank when the API behind it disappeared — a single point of failure nobody had priced in. The replacement was chosen for the opposite property: content that survives its author, and no build step between an edit and the page.
Then it grew languages. One, then two, then ten — including a Cyrillic script and a right-to-left one, which is where a layout stops being decorative and starts being tested. The theme's own interface is translated too, not just the pages.
Then it connected. The site now reads occupied dates from the PMS and posts enquiries into it, which closes the loop: a stay booked anywhere shows as taken here, and an enquiry raised here is already in the operator's queue.
One deliberate small thing I am fond of: a single line left on the dead SPA's old route, so anyone still holding that link gets an explanation instead of a white page.
The theme now carries the integration itself, so the live site reads availability and files enquiries without a plugin in between.
Enquiries go into the PMS inbox and occupied dates come back out, first proven against a staging instance running against real development data.
Polylang with a switcher, growing from two to ten: Catalan, Spanish, English, German, Polish, Dutch and the rest, including a Cyrillic script and a right-to-left layout. Pages, property cards and the theme's own interface strings are all translated — and the RTL bugs that only appear when the layout mirrors were fixed rather than hidden.
A palette of its own, a hero that carries a real photograph with a veil that actually covers, the logo and favicon served by the theme, and CC-licensed photography with its attribution visible rather than buried.
The header fits on a phone, the property cards stopped redirecting between languages, and the hero veil no longer covers the search it sits behind.
Salvaged what could be salvaged from the old site, then built a block theme from scratch and loaded the content back in. A line was left on the dead SPA's route so anyone holding an old link sees an explanation, not a blank page.