I have spent about fifteen years marketing Red Bridge as a WordPress agency, and the blog showed it. Twenty categories, fifty-five tags, posts going back to 2007. Magento, Joomla, osCommerce, and a catch-all bucket called Stream. Good history, but it had stopped matching the work. We are repositioning around applied AI now, and the taxonomy still read like 2011.
So we fixed it, in one working session. I sat with an agent, Claude Code wired to our WordPress through the REST API, and we took the whole taxonomy apart and put it back together. This is the write-up of how that went. If you want the unedited version, the full session is tucked at the bottom of this page.
Report first, edits later
The thing that made this work was the order. The agent did not start by changing anything. It started by reading. It pulled the live categories and tags from the API, read the new site to see where we are positioned, and sampled the posts in the categories whose names did not explain themselves. What exactly is "Stream"? Sixty-seven posts, 2007 to 2018, which turned out to be the old firehose from before we sorted the blog by topic. Then it wrote a report and a recommendation, and stopped.
| Category | Posts | What it was | The call |
|---|---|---|---|
| How To | 94 | A format, not a topic. Cross-cuts everything, 2007 to now. | Freeze. Keep for ranking, stop assigning. |
| WordPress | 87 | The SEO and referral anchor. | Keep. |
| Stream | 67 | The old firehose / default bucket, 2007 to 2018. | Rename to Archive. |
| Development | 43 | General engineering craft. | Keep. Absorb Tools, Snippets, Design. |
| Business | 20 | Running the shop, working with marketing teams. | Keep. Absorb News, Social. |
| SEO | 14 | Still on message. | Keep, merge Optimization in as Performance & SEO. |
| Joomla | 12 | Dead platform. | Freeze, nest under Platforms (archive). |
| osCommerce | 10 | Dead platform. | Freeze, nest. |
| Magento | 9 | Dead platform. | Freeze, nest. |
| Optimization | 8 | Overlaps SEO and performance. | Merge into Performance & SEO. |
| News | 6 | Announcements, meetups, 2007 to 2017. | Merge into Business. |
| AI | 5 | Early AI-generated experiments, all 2026. Quality suspect. | Draft the posts, keep as a rewrite queue. |
| Tools | 3 | Thin. | Fold into Development. |
| Snippets | 3 | Thin, format-ish. | Fold into Development. |
| WooCommerce | 3 | Platform sub-topic. | Fold into WordPress. |
| Drupal | 2 | Dead platform. | Freeze, nest. |
| Uncategorized | 2 | Cleanup. | Reassign, retire. |
| Social | 2 | Thin. | Fold into Business. |
| Design | 2 | Thin. | Fold into Development. |
| Projects | 2 | Duplicates the new /projects section. | Retire, /projects owns it now. |
That gave me something to react to instead of a pile of changes to undo. The calls stayed mine. Five posts in an "AI" category were early AI-generated experiments I was not proud of, so we agreed to pull them into a rewrite queue rather than let them seed the new flagship. The old Magento and Joomla posts stay published, for old times sake. Those are judgment calls, and the report surfaced them for a decision instead of guessing at them.
A dry run you can sign off on
Before a single write, the agent produced a change plan with the actual term IDs, the before-and-after category list for every post it would touch, the tags it would delete, and the redirects it would add. I read it, answered five open questions, and told it to go. If you have ever run a big taxonomy change by hand in wp-admin, you know the value of seeing the whole thing laid out first, reversibly, before it runs.
Read the real thing
Pull the live categories and tags from the WordPress API, read the site to fix the current positioning, and sample the posts in the categories whose names do not explain themselves.
Report, do not edit
Write up what is there and what to do about it. Every judgment call goes back to a person to decide, not the model.
Plan the writes
A dry run with the exact term IDs, the before-and-after category list for every post it will touch, the tags to delete, and the redirects. Sign off before anything runs.
Execute with a net
Snapshot the taxonomy first, so every deletion is reversible. Then create, rename, reassign, and delete. Confirm a category is empty before removing it.
Verify against the build
Rebuild the site and confirm the archives are right. Catch what the plan missed, because something always shows up only when you run it end to end.
That plan is not a summary you take on faith. It is the whole list. Here is every post it moved, with where each one was and where it landed.
| Post | Was in | Now in |
|---|---|---|
| WordPress Site Audit | Optimization, WordPress | Performance & SEO, WordPress |
| Jason Cohen of WP Engine on 100% Uptime | Development, Optimization, Archive, WordPress | Development, Performance & SEO, Archive, WordPress |
| Flywheel on Back-End Performance | Optimization, Archive, WordPress | Performance & SEO, Archive, WordPress |
| How WP Optimization Improved List25 | Optimization, Archive, WordPress | Performance & SEO, Archive, WordPress |
| Keith Clark on Loading CSS Without Blocking | Optimization, Archive | Performance & SEO, Archive |
| Flywheel on Front End Performance | Optimization, Archive, WordPress | Performance & SEO, Archive, WordPress |
| Content Marketing Optimization for Voice Search | How To, Optimization, Archive | How To, Performance & SEO, Archive |
| Testimonial Rotator Page Speed | Optimization | Performance & SEO |
| Squishy | Tools | Development |
| Restricted Site Access Plus | Tools | Development |
| Make Filename Lowercase (WordPress plugin) | Tools | Development |
| Git delete branch local and remote | Development, Snippets | Development |
| Disable Individual Theme Update Notification | How To, Snippets, WordPress | How To, Development, WordPress |
| Disable Individual Plugin Update Notification | How To, Snippets, WordPress | How To, Development, WordPress |
| Need a WordPress Website Update? | Business, Design, Development, WordPress | Business, Development, WordPress |
| SF WordPress Community Meetup (Summer) | Business, Design, Development, WordPress | Business, Development, WordPress |
| SF WordPress Meetup (Fall Update) | News, WordPress | Business, WordPress |
| SF Hayes Valley Neighborhood Association | News | Business |
| Bear with us. Spring Redesign! | News | Business |
| Kliky.Com is now Red Bridge Internet | News | Business |
| Platform Event Services: Web Site Launch | News | Business |
| Indie Music Reviews Site Launch | News | Business |
| Why Engagement is Key to Social Strategy | Business, Social, Archive | Business, Archive |
| URL Shortener Marked Unsafe on Facebook | Social | Business |
| WooCommerce Shipping Set Up | Archive, WooCommerce | Archive, WordPress |
| WooCommerce Shipping Calc Issues (FedEx) | WooCommerce | WordPress |
| Packpin WooCommerce Shipment Tracking | WooCommerce, WordPress | WordPress |
| Hayes Valley Eats Community Directory | Projects, WordPress | WordPress, Business |
| Sysdig | Projects | WordPress, Business |
| Website Redesign Project Turnaround Time | Business, Development, Uncategorized, WordPress | Business, Development, WordPress |
| Why WordPress is Good for StartUps | Uncategorized | WordPress, Business |
| Video Converter Review (ClipChamp)stray draft | Optimization | Performance & SEO |
| Bloomberg Video Embeds Have a Weight Problemstray draft | Optimization | Performance & SEO |
What it looks like now
Twenty categories became seven living ones plus a frozen archive for the dead-platform years. Fifty-five tags became four. Every category now carries a plain description, written to double as a record of what it holds. And every old URL redirects to its new home, so nothing breaks when we cut the domain over.
- 20 → 7 Living categories, down from twenty, plus a frozen archive for Joomla, Magento, and the rest of the dead-platform years.
- 55 → 4 Tags. The old geo-keyword and near-duplicate cloud is gone.
- 284 Old post URLs mapped to redirects, each checked so none can hijack a real page. Nothing 404s at launch.
The parts that made it safe
None of this is magic, and it is not vibes. The agent is making real edits to a live database through an API, so the interesting engineering is in the guardrails, not the model.
Rollback first. Before any change, it saved a snapshot of the current categories and tags. Every deletion is re-creatable from that file.
It checked its own work. Before deleting a category it confirmed the category was actually empty. That check earned its keep: two old drafts were sitting in a category the first scan had missed, because that scan only looked at published posts. It caught them, moved them, then deleted the category. By hand, those two would have quietly gone with it.
The redirects were collision-checked. Two hundred eighty-four old post URLs, each checked against the real pages on the new site, so a redirect could never quietly take over /team or /projects.
And the honest friction. Cloudflare blocked the first API calls as a non-browser client until we sent a browser header. Then a rebuild briefly showed the old categories, because WordPress serves anonymous API reads from a cache that lags a few minutes behind edits. Neither is a disaster. Both are the kind of thing that only shows up when you run it end to end, which is exactly why the last step is to verify against the real build.
This is what AI for WordPress looks like
We still build and run WordPress for enterprise marketing teams. That has not changed. What is changing is how. The model did the tedious part here, a few hundred small edits I would never do by hand at that pace. But the model is the swappable piece. The method is the point: read first, plan in the open, keep a person on the decisions, leave a paper trail, verify against the real thing. When something better than today's model shows up, we swap it in and the method stands.
If you run a large WordPress site and the taxonomy, or the content, or the workflow around it has drifted from where your business actually is, that is the kind of work we do here in the Bay Area. Reach out. We are here for you.
The full session, start to finish
Here is the part I find most useful. Below is the actual session, synthesized close to verbatim: my prompts, the agent's thinking and actions, and the back and forth that got us from a vague "let's modernize the taxonomy" to a shipped change. It is long, so it is folded up. Open it if you want to see exactly how a session like this runs.
The session, eight turns click to expand
- 01
EdWe are going to rework our taxonomies. I want to modernize them for our new positioning. I have spent the last 10 years marketing myself as a WordPress agency. That is still a big part of the work, but we are repositioning for an AI-agents-for-web-development future. WordPress is the CMS for nearly all our projects. My referral network knows me for WordPress, but I am expecting future referrals for AI work, and as a bridge, AI for WordPress. It would be cool to see an initial taxonomy report. A lot of stuff is super old (ie. Megento, lol), but I want to keep the posts published just for old times sake.
AgentPulled the 20 categories and 55 tags from the WordPress REST API. Read the homepage and Insights source to distill where we are positioned now: applied AI for web marketing teams, with WordPress and AI-for-WordPress as the bridge. Sampled the posts in the categories whose names did not explain themselves. "Stream" turned out to be the old catch-all, 67 posts from 2007 to 2018. "AI" was five recent posts. Delivered a report: a seven-category spine, a frozen archive for the dead platforms, prune the tags hard, and one shared vocabulary across Blog, Insights, and Projects. Ended with two questions.
- 02
EdI like what you have done. Did any of this come out of memory of an earlier review we had? More important: the "AI" category. Those 5 posts were early AI-generated blog posts we created for content when we were publishing very little. I am suspect of their quality. Treat those accordingly. Tags: go ahead and confirm, I do not think we wired them up. Plus I never got any inbound SEO on the tag links anyway. Update the report and save.
AgentConfirmed in the code that tags are declared but never rendered on the site, so pruning them carried zero risk. Answered the memory question straight: no prior review, this was fresh. Changed course on the AI posts. Rather than seed the new "AI for WordPress" flagship from suspect experiments, draft them into a rewrite queue and build the bridge category clean. Saved the report into the repo.
- 03
EdBuild the dry-run plan.
AgentFetched the exact term IDs and the full post membership of every category that would lose or move posts. Wrote a change spec: the before-and-after category array for all 31 posts it would touch, the 51 tags to delete, the 8 categories to remove, the redirect map, and a five-item sign-off checklist. No writes yet.
- 04
Ed1. yes 2. rename stream to archive 3. yes 4. default 5. default. You have execution capabilities through the REST access I set up for the new site.
AgentAuthenticated. Cloudflare blocked the first call as a non-browser client until a browser header was added. Snapshotted the categories and tags for rollback, then executed: created the new categories, renamed SEO to "Performance & SEO" and Stream to "Archive," reassigned 31 posts, drafted the 5 AI experiments, nested the dead platforms under one parent, and deleted 8 categories and 51 tags. An emptiness check before deletion caught two stray drafts the published-only scan had missed, moved them, then finished. Verified the end state: 15 category terms, 4 tags.
- 05
EdCommit the redirects, take care of the two follow-ups.
AgentConfirmed the old WordPress category URLs were live, then wrote the launch redirect map for the folded and renamed archives. Aligned the Insights topic vocabulary with the new blog spine as a typed canonical list, and fixed a naming inconsistency between two posts. A local build briefly rebuilt the old categories, traced to WordPress serving anonymous API reads from a cache that lags edits by a few minutes. It cleared and the build came out right. Committed in two logical commits.
- 06
EdPush the commits, then use the Description field for each of the Categories to write your description of what each now represents (this gives me a record in WordPress), then tackle the post-level redirect map.
AgentPushed. Wrote a plain description on all 15 categories, in voice, doubling as a record. Generated one redirect per published post, 284 in all, each collision-checked against the real routes so none could hijack a live page, plus the 5 drafted posts pointing to the blog index. Validated the sources and destinations, committed, and pushed.
- 07
EdLeave as draft for now, we will revisit later.
AgentLeft the five AI posts parked in the rewrite queue.
- 08
EdTurn this project into an Insights post. Write it up as a case study / how-to, plus a short blog post. And synthesize our real conversation as a near-verbatim reference so people can see how this is done in a single session.
AgentThis page, and the short blog post that points here.
Synthesized from the real 2026-07-12 session. Prompts are Ed's words, lightly trimmed; the agent lines summarize the actual work done in each turn.