## SEO, analytics and accessibility

URL: https://hub.jkdevstudio.com/knowledge-base/best-practices/seo-analytics-accessibility
Updated: 2026-09-06
Summary: Set up indexing, metadata, structured data, analytics and accessibility on a WordPress site, and know where a theme's responsibility ends.

Three related jobs: being found, being measured, and being usable. A theme provides the technical groundwork for all three, and none of them is finished by a theme alone.

## SEO

Work from indexing outward.

:::deflist

Visibility
: Confirm search engines are not blocked. The "discourage search engines" checkbox in [[Settings > Reading]] is switched on more often than anyone expects, usually left over from building the site.

A sitemap
: WordPress generates one. An SEO plugin gives you more control over what is in it.

Canonical URLs
: One address per piece of content, so the same page under two URLs does not compete with itself.

Metadata
: A title and description per page, written for a person reading a search result rather than stuffed with keywords.

Heading structure
: One h1 per page, then h2 and h3 in order. Headings are an outline, not a set of font sizes.

Internal links
: How search engines find your older content, and how readers do.

Readable URLs
: Words rather than numbers, decided before you publish rather than after.

:::

<div data-callout="note">

**No theme delivers rankings.**

A theme provides correct technical structure. What you rank for is decided by your content and by who links to it, and any theme sold on a promise of rankings is selling you the wrong thing.

</div>

## Structured data, and who owns it

Structured data is machine readable markup describing what a page is: an article, its author, a breadcrumb trail, a recipe. Search engines read it to build the extra detail shown under a result.

The division of labor between a theme and an SEO plugin is worth understanding, because getting it wrong produces duplicates rather than errors, and duplicates are hard to notice.

**An SEO plugin owns page level markup.** Article, author, organization, website, and the social sharing tags that decide what a link looks like when somebody posts it. This is what SEO plugins are for, and it is why our themes do not emit those tags: two sources of the same markup on one page is worse than one.

**The theme owns the markup for what it draws.** In our themes that is the breadcrumb trail. The theme builds the visible trail, so it also emits the `BreadcrumbList` describing it, with no plugin required. Install nothing and your breadcrumbs are still machine readable.

That brings one decision. If you run an SEO plugin that also draws breadcrumbs, you now have two trails available and should be showing one.

## Breadcrumbs and your SEO plugin

Our themes build their own breadcrumb trail and let you point it at a plugin's trail instead. The choice sits in the theme's breadcrumb settings, and the supported sources are [Yoast SEO](https://wordpress.org/plugins/wordpress-seo/), [Rank Math](https://wordpress.org/plugins/seo-by-rank-math/), [SEOPress](https://wordpress.org/plugins/wp-seopress/) and [All in One SEO](https://wordpress.org/plugins/all-in-one-seo-pack/).

Every one of the four is always listed. The ones whose plugin is not active appear disabled, so the list tells you what is supported rather than hiding it.

:::deflist

Built in
: The theme builds the trail and emits the `BreadcrumbList` for it. This is the default, and it is complete on its own.

An SEO plugin
: The plugin builds the trail and the theme displays it. The theme emits no structured data in this mode, because the plugin is already describing its own trail.

:::

A separate setting decides whether a plugin supplied trail is repainted in the theme's styling or left with the plugin's styling. Repainting is the default, so switching source does not change how the page looks.

<div data-callout="warning">

**Never show the theme trail and a plugin trail at the same time.**

Two `BreadcrumbList` blocks on one page is a conflict a search engine resolves by picking one, and which one it picks is not up to you.

</div>

## Analytics

Connect analytics through the provider's official plugin, or through a plugin whose job is inserting code. Do not put the tracking code in the theme, because it disappears the day you change theme.

After connecting, check three things: that data actually arrives, that your caching and optimization plugins are not stripping the script, and how much weight the third party script added to your pages.

On consent: a banner by itself does not block anything. The tracking script has to be registered with a consent category in whichever consent solution you use, or consent will be requested and the script will run regardless.

<a data-type="kb-embed" href="/knowledge-base/integration/cookie-consent-integration">Cookie consent and GDPR</a>

## Accessibility

A practical checklist that covers most of what matters:

- [ ] Alt text on images that carry meaning
- [ ] A consistent heading hierarchy
- [ ] Link text that describes its destination, never "click here"
- [ ] Enough contrast between text and background
- [ ] Captions on video
- [ ] A visible focus indicator
- [ ] The whole page reachable with a keyboard

The final result depends on the theme, your content, the palette you chose and any third party plugins. A theme can give you accessible components and cannot stop you putting grey text on a white background.

Finish with two checks. Walk one page using only the keyboard, which finds problems no tool reports. Then run an automated audit such as [WAVE](https://wave.webaim.org/), treating it as a supplement rather than a verdict.

## Common questions

<details><summary>Which SEO plugin should I use?</summary>

Any of the well maintained ones, since what matters is picking one, because two SEO plugins emit competing metadata for the same page.

</details>

<details><summary>Does the theme add structured data?</summary>

Yes, for the breadcrumb trail and with no plugin needed, while article, author and organisation markup comes from your SEO plugin as the correct owner of it, which means a page with no SEO plugin carries breadcrumb markup and no article level markup.

</details>

<details><summary>Who writes the social sharing preview?</summary>

Your SEO plugin, since the image, title and description a link shows when posted are set per page there and the theme stays out of it so the two never disagree.

</details>

<details><summary>How do I check what my pages actually emit?</summary>

Run a page through [the Google Rich Results Test](https://search.google.com/test/rich-results) or the [Schema Markup Validator](https://validator.schema.org/), both of which list every block of structured data found, which is how you spot a duplicate you did not know about.

</details>

<details><summary>My pages are not indexed</summary>

Check the reading setting first, then your `robots.txt`, then whether the pages are linked from anywhere at all, and remember that new sites simply take time regardless of how correct everything is.

</details>

<details><summary>Is an accessibility overlay widget enough?</summary>

No, overlays sit on top of problems rather than fixing them, and the checklist above does more for real users than any widget does.

</details>

<details><summary>Analytics shows no data</summary>

Check in a private window with any ad blocker off, since blockers stop most analytics, then check whether your consent setup is holding the script until consent is given, which is correct behaviour and looks identical to a broken install.

</details>

## Still stuck

[Open a support ticket](https://hub.jkdevstudio.com/support) with the page URL and what the validator reports for it.