May 3, 2026
Shipping Anywhere is the Plan
Building Anywhere is the Plan from scratch: a custom WordPress theme, eighteen plugins, and a publishing system designed for the writers, not the developer.
When Lori and I decided to launch Anywhere is the Plan, my first instinct was to throw it on Squarespace and move on. The instinct lasted about an hour. The kind of editorial layout we wanted, long-form trip stories with embedded route maps, photo galleries that didn’t feel like a stock template, real review blocks with Schema.org markup, none of the off-the-shelf platforms got close without three extensions and a wrestling match with a page builder.
So I picked WordPress, partly because Gutenberg looked like it understood blocks better than its peers, partly out of stubbornness, and committed to a custom theme.
This was a mistake, in the way that building anything yourself is a mistake. It’s also how we ended up with the site we have now, which I’m proud of.
WordPress was new, but that wasn’t the hard part
I’d written PHP before. WordPress as a stack was still new to me, and its conventions take time to internalize even when the language doesn’t. The hook system is genuinely strange the first time you meet it. There’s no entry point. There’s a functions.php that runs after your theme loads. Things happen because you tell WordPress to call your function whenever it does something. Nothing returns a value if you can avoid it. Everything is a global.
But that wasn’t the hard part. The hard part was a constraint I set early and refused to relax: this had to be something Lori and our other contributing travel bloggers could publish to without ever opening a code file.
That changed what I needed to build.
The audience was always non-developers
WordPress’s block editor is a fine starting point. Stock blocks don’t know what a cruise port is, or how to render an itinerary as a clickable map, or how to flag missing alt text before you hit publish. If I wanted writers to reach for the right thing without thinking, the right thing had to exist as a block they could drop in.
So: a custom theme, no page builder, and eighteen plugins, each scoped to one specific thing the travel-blog format kept asking for.
- AITP Route Map: interactive itinerary maps with ordered stops, route lines, and Wikipedia popups, built on Leaflet and OpenStreetMap (no API key, no Google bill).
- AITP Gallery + Gallery Lightbox: six layout modes (grid, masonry, mosaic, justified, square, thumbnails), per-image spanning, drag-to-reorder, client-side image optimization, and on-device alt-text generation.
- AITP Review: Schema.org-backed review blocks for hotels, cruises, restaurants, attractions, with half-star ratings and category scores, so Google can show stars in search results.
- AITP Quick Tips: callout blocks for travel tips, warnings, costs, time estimates.
- AITP Series: groups posts into ordered series (“Atlantic Escape,” “Mediterranean Coastlines”) with auto-injected navigation.
- AITP Port Guide: a custom post type for cruise ports, with terminals, cruise lines, embedded maps, and travel tips. Closer to a small CMS-within-a-CMS.
- AITP Affiliate Manager + Affiliate Links: admin-only program management and a Gutenberg block for inserting tracked links into posts.
- AITP Facebook Poster, Pinterest Pinner: auto-publish to social on post-publish, with category-to-board mapping for Pinterest.
- AITP Comment Guard: IP blocklist, invisible honeypot, submission time-trap. No third-party services.
- AITP Alt Text Review: pre-publish audit of every image in a post; flags missing alt text and uses Claude to draft descriptions you can then edit. Syncs back to both the block attribute and the media library.
- AITP Pending Review Notify, Buttons, Map, Video: the unglamorous workhorses.
Almost every one of these started the same way. Lori or another writer would say “it would be great if I could just…” and the rest of the sentence would describe a block that didn’t exist yet.
A few of them did exist, technically. As paid plugins, premium upgrades to free ones, or features locked behind a SaaS subscription. I wasn’t excited about leasing every feature on a recurring bill for a site that’s a hobby, so I built my own. The plugins were going to be specific to our editorial style anyway; paying for a near-fit and then bending it didn’t feel like a deal.
What I’d do differently
The single biggest thing I’d change is when I started writing plugins versus the theme. I built the theme to a working state and then built the plugins, and ended up with theme styles encroaching on what should have been block-level CSS. The seam between “theme owns layout” and “block owns its own appearance” is more important than it looks.
Second: I overinvested in admin UI for a while. Custom admin screens have their place (the Affiliate Manager genuinely needed one), but most of the time I was solving a problem that didn’t exist. The block editor was already the right surface.
Third: alt text and accessibility. The Alt Text Review plugin started as a guilt-driven Sunday hack and turned into one of the things I lean on most. Building accessibility into the publishing workflow makes the result feel inevitable instead of bolted-on.
The honest verdict
If you want to see it: anywhereistheplan.com. Stories from thirteen countries (so far). Photos that load fast. Maps you can actually click.
The eighteen plugins aren’t really eighteen plugins. They’re one system, a block editor that knows what a travel blog needs and lets the writer reach for the right thing without thinking about it. Most of the year I spent on this site was getting that experience to feel obvious. The site exists, Lori publishes to it, the next writer onboards in an afternoon. That’s the thing I was actually trying to ship.