The problem
Tour Napoli sells guided tours and experiences in Naples and Campania. The site had grown over many years on old WordPress setups and a hosting the owner wanted to leave. She needed a fast, clean site that she could run on her own: tours, news, reviews, social posts and first contact with tourists.
What I built
I moved the site to new hosting and wrote a custom WordPress theme with its own control panel.
- Tour catalogue — a Tour content type with price, duration, rating, number of reviews and badge, plus tour categories. Categories and single tours share the same /tour/ address without clashing, so no existing link had to change.
- AI chat with hand-off — a chat on every page answers visitors about tours, with instructions not to invent prices or availability. When someone wants to book, they pass to a person: the request is saved in the panel and emailed, or the chat opens WhatsApp.
- Tourist reviews — a public form, shown with a shortcode, and moderation before publishing. The owner sends tourists one link to leave a review.
- News from sources — the panel searches Google News for a keyword such as “Napoli” and helps write articles with AI, in a tone the owner sets.
- Images and Meta sharing — images generated with OpenAI from the panel, and dedicated images for sharing posts on Facebook and Instagram.
- One control panel — settings, social, home page hero, ads, Google Ads, mail, documentation and a support request page, all in one place.
Built with
WordPress with a custom theme written from scratch, the Anthropic or OpenAI API for the chat, the OpenAI image API, and a migration from Aruba to cPanel hosting.
Why it was done this way
The old site already had many indexed tour and category pages. I wrote custom routing so that categories and tours both live under /tour/: the new theme went live without changing a single address, and without losing what the site had built on search engines.


