Your SEO plugin is shipping broken schema. I fixed what mine emitted.
WordPress plugins inject structured data whether you've checked it or not — empty properties, wrong page types, malformed regions. The afternoon I spent fixing what mine shipped to Google.
I'm building a Swiss directory site, and last week I spent an afternoon doing something that sounds deeply unsexy: cleaning up the structured data my own plugins were emitting. It turned out to be one of the higher-leverage SEO sessions I've had in a while, precisely because almost nobody bothers to check it.
Here's the thing most people miss. If you run a content site on WordPress with an SEO plugin and a directory plugin, you are already publishing structured data. JSON-LD is being injected into every page whether you've looked at it or not. The question isn't whether you have schema. It's whether the schema you're shipping is accurate — and out of the box, it usually isn't.
What the plugins were actually emitting
When I inspected the rendered output, the directory plugin was dutifully producing a LocalBusiness block for every listing. Good. Except it was padding that block with empty review, empty image, and empty sameAs properties — placeholders with nothing in them. The region was a free-text string instead of an ISO code. The description was the raw page body, markdown headings and FAQ markup and all, rather than a clean lead paragraph.
Google's general structured data guidelines are clear that markup should describe real, user-visible content accurately. Empty and malformed properties aren't neutral. At best they're ignored; at worst they erode trust in the whole block. So I wrote hooks into the child theme to intercept what the plugins generate and fix it before it reaches the page: drop the empty properties, convert the region to its ISO code, and feed a clean description instead of the marked-up body.
You don't have schema because you installed a plugin. You have schema when you've actually read what it emits.
The list pages were lying about what they were
The bigger problem was a level up. The category and location pages — the ones listing many businesses — were being labelled as Article or WebPage. They are neither. They're collections. So I switched them to CollectionPage and added an ItemList reflecting the actual ranked order of the listings on the page.
This matters because it tells a search engine the truth about the page's job. A list page that announces itself as an article is sending a confused signal. A list page that declares itself a collection with an ordered item list is sending a precise one. Google explicitly supports multiple schema types on a single page as long as each one genuinely describes content that's there — so a location page can legitimately carry a breadcrumb, a collection type, and an item list at once.
I also rebuilt the breadcrumb trail to be geographic and properly nested: country, then region, then town, then business — with the town only linked when a page for it actually exists. Google's guidance on nesting and multiple items rewards markup that mirrors the real site hierarchy. And I wired in a reciprocal link from each business profile back up to its town page, so the internal link mesh and the structured data tell the same story.
Why this is the kind of work AI makes worth doing
This is fiddly, surgical work — diffing live output against local source, validating each block, deploying a single file at a time so I don't smear the whole theme. Five years ago I'd have either skipped it or paid someone a day's rate to do half of it. With AI handling the mechanical parts — reading the plugin's emitted JSON, generating the hook code, checking validity — I could do all of it in an afternoon and actually verify every page afterward.
But the AI didn't know that a list page shouldn't be an Article, or that an empty sameAs is worse than no sameAs. That judgment is the same edge I keep coming back to: deep domain expertise is the leverage, and the tooling just removes the friction. It's the technical-SEO cousin of how a platform finally fixing its rendering can unlock indexing overnight, and it sits right alongside the argument that pain points, not keywords, will decide your SEO future — both are about giving machines an honest, structured account of what your page is for.
Go view-source on your own most important page and search for application/ld+json. Read what's in there. I'd bet you find at least one empty property your plugin has been quietly broadcasting to Google for months.
Sources & further reading
External — Google Search Central, General structured data guidelines; Google Search Central, Intro to how structured data works (nesting and multiple items); Search Engine Journal, Google on using multiple types of schema on the same page.
Related posts — The death of generic AI; Lovable just fixed its biggest SEO problem; Why pain points, not keywords, will decide your SEO future.