/ โ† Accessibility Fixes / Heading Structure
In this guide
  1. How people use headings to get around a page
  2. What WCAG actually requires, and what is best practice
  3. Printing the heading outline of a page
  4. Common structural mistakes and their fixes
  5. Where to fix headings on each platform
  6. The fix, step by step
  7. Edge cases
  8. Keeping the structure right
  9. Questions and answers

How people use headings to get around a page

A sighted visitor glances down a page and sees the sections at once. Someone using a screen reader cannot do that, so headings take on that job. The common ways they are used:

So the heading list should read like a sensible contents page on its own. If you can read only the headings of your page and still understand what is on it and where, the structure is working.

Headings help other visitors too. People with reading or attention difficulties rely on clear headings to find their place, and search engines and AI tools use them to understand which text belongs to which topic.

What WCAG actually requires, and what is best practice

Heading findings are a mix of genuine WCAG failures and widely agreed best practice. It helps to know which is which when deciding what to fix first.

ProblemStatusWhy
Text that looks like a heading but is coded as a paragraph or bold textWCAG failure (1.3.1 Info and Relationships, level A)The visual structure is not available in the code, so screen reader users miss it.
Heading tags used on text that is not a heading, just to make it bigWCAG failure (1.3.1)The code claims structure that is not there, cluttering the heading list.
Headings that do not describe their section, such as "More" or "Section 2"WCAG failure (2.4.6 Headings and Labels, level AA)Headings must describe the topic or purpose of what follows.
Empty headings, or headings containing only an image with no alt textCommonly treated as a failureScreen readers announce a heading with nothing in it, which is confusing, and the heading has no descriptive text.
Skipped levels, such as h2 straight to h4Best practiceWCAG does not strictly forbid it, but listeners may assume they missed a section.
No h1, or more than oneBest practiceWCAG does not require exactly one, but a single main heading describing the page is the clearest pattern for most sites.

The Accessibility Audit reports both kinds. Fix the failures first, then tidy the best-practice issues, which are usually quick once the templates are right.

๐Ÿ’ก Google has said publicly that more than one h1 on a page is not a problem for search. The reason to prefer one main heading is clarity for people, not rankings.

Printing the heading outline of a page

Before editing anything, get the real heading structure, not the one the design suggests. Paste this into the browser console (F12, then Console) on any page. It lists every heading in order, indented by level, and flags empty headings and skipped levels:

(() => {
  let last = 0;
  document.querySelectorAll('h1,h2,h3,h4,h5,h6,[role="heading"]').forEach(h => {
    const level = h.getAttribute('aria-level') ? +h.getAttribute('aria-level') : +h.tagName.slice(1) || 2;
    const text = h.textContent.replace(/\s+/g, ' ').trim();
    const flags = [];
    if (!text) flags.push('EMPTY');
    if (last && level > last + 1) flags.push('SKIPS FROM H' + last);
    console.log('  '.repeat(level - 1) + 'H' + level + ' ' + (text || '(no text)') + (flags.length ? '   <-- ' + flags.join(', ') : ''));
    last = level;
  });
})();

Run it on one page of each template: home, a standard page, a blog post, a category or collection page, a product page and the contact page. Look for three things in the output:

  1. Does the first heading describe this particular page, or is it the site name or a "Menu" label repeated everywhere?
  2. Do the levels step down one at a time as you go into a section, and back up when a new section starts?
  3. Are there headings with no text, or text that is plainly not a heading, such as a price, a phone number or a promotional line?

Then compare the output with what you see. Any bold line, large text or coloured band that looks like a section title but does not appear in the list is a fake heading.

Common structural mistakes and their fixes

The logo or site name as the h1

Many themes wrap the logo in an h1 on every page, so every page starts with the same heading and the real title appears as a second one. On inner pages, make the logo a plain link with an image whose alt text names the business, and let the page title be the main heading.

Bold paragraphs pretending to be headings

<!-- Looks like a heading, is not one -->
<p><strong>Opening hours</strong></p>

<!-- A real heading -->
<h2>Opening hours</h2>

This is especially common in text pasted from word processors and in older content where editors used bold to mark sections. It is a genuine failure, because sighted readers get structure that listeners do not.

Levels chosen for size

<!-- A small heading was wanted, so h5 was used -->
<h2>Delivery</h2>
<h5>Next-day delivery</h5>

<!-- Correct level, smaller style -->
<h2>Delivery</h2>
<h3 class="heading-small">Next-day delivery</h3>

The level describes position in the structure; the class describes appearance. Keeping them separate means designers can make any heading any size without breaking navigation.

Headings used for decoration

Taglines, prices, "Free delivery over ยฃ50" banners and testimonial quotes are often put in heading tags because they are meant to stand out. They then appear in the heading list as if they were sections. Change them to paragraphs or span elements with a class that gives the same look.

Sidebars, footers and cards

Repeated regions need levels that fit around the main content. A common and sensible pattern is: the page title as h1, main content sections as h2, sidebar and footer blocks as h2 as well, since they are separate areas of the page. Product and article cards in a listing usually sit one level below the heading of the list they belong to. Footer column titles such as "Quick links" can also simply be styled text if they do not introduce anything a listener would jump to.

Headings in the HTML5 outline myth

Older advice said you could start every section or article with an h1 and browsers would work out the levels. That outline algorithm was never implemented by browsers or screen readers and has been removed from the HTML standard. Every h1 is announced as level 1, wherever it sits, so use explicit levels.

Where to fix headings on each platform

PlatformWhere heading levels are setWhat to look for
WordPress block editorThe Heading block's level control; the Document Overview Outline view lists all headingsEditors picking levels for size; widget titles fixed by the theme
WordPress classic themesbefore_title and after_title in register_sidebar(), and the theme headerSidebar titles coded as h3 or h4; site title as h1 on every page
Page buildersThe HTML tag option on Heading and similar widgetsTags left at the builder default; text widgets styled as headings
ShopifySection Liquid files; rich text blocks in the theme editorCollection and product card titles using a level that does not fit the page
React, Vue and component librariesCard, panel and modal components with a hard-coded heading tagThe same component used at different depths; add a level prop
Hand-written HTMLThe templates and includesHeading tags copied from another page along with their styles

For reusable components, let the page decide the level. A simple approach is a prop or setting such as headingLevel that defaults to a sensible value and renders the matching tag, so the same card can sit under an h2 on one page and an h3 on another.

The fix, step by step

Step 1

Print the heading outline of each template

Run the Accessibility Audit on one page of each template and note every heading finding. On the same pages, run the console script from this guide to print the full heading list indented by level. Read the list on its own, without looking at the page, and mark anything that is empty, misleading, repeated on every page, skips a level, or is plainly not a section title, such as a price or tagline.

Step 2

Pick one main heading for the page

Make the first heading in the main content an h1 that describes this particular page: the article title, product name, service or category. If the theme puts the site name or logo in an h1 on every page, change it to a link or paragraph on inner pages. Check that hidden headings used by menus or skip links are not also coded as h1, which would add a second one.

Step 3

Turn fake headings into real ones

Look through the page for lines that act as section titles but are coded as bold paragraphs, large div text or images of words. Change each one to a heading tag at the right level so it appears in the heading list. Do the opposite for text that is in a heading tag only for emphasis, such as offers, prices and quotes, turning those into paragraphs with a class that keeps the styling.

Step 4

Close gaps in the heading levels

Work down the outline so each heading is at most one level deeper than the heading above it: h2 sections under the h1, h3 subsections under those. Where a page jumps from h2 to h4, change the h4 to h3 rather than adding an empty heading to fill the gap. Going back up several levels when a new section starts is fine and expected.

Step 5

Move the look of headings into CSS

Where a heading was given a lower level only because it needed to look smaller, restore the correct level and add a class such as heading-small in the stylesheet to control the size. In the block editor, use the Typography size setting instead of changing the level. This separates structure from appearance, so designers can adjust sizes later without breaking screen reader navigation or reintroducing skipped levels.

Step 6

Fix headings inside templates and components

Correct heading levels at source for anything that repeats: the site header, sidebar and footer widget titles, product and article cards, modals and tabs. In WordPress classic themes that means the sidebar registration; in page builders, each widget's HTML tag setting; in component frameworks, a level prop. One template fix clears the same finding on every page that uses it, which is why this step usually removes most of the report.

Step 7

Check the result with heading navigation

Open the page with NVDA and press H repeatedly, or open the VoiceOver rotor and choose Headings. Listen to the headings in order and check they make a sensible contents list, with every section you can see represented and nothing extra. Then run the console script and the Accessibility Audit again on each template to confirm that empty headings, fake headings and skipped levels are gone.

Edge cases

โš ๏ธ Do not add empty or hidden headings simply to fill a skipped level so the checker is quiet. That makes the heading list worse for real users. Change the level of the heading that is out of place instead.

Keeping the structure right

Questions and answers

1. Is it an accessibility failure to skip a heading level?

Not strictly. WCAG requires that content which looks like a heading is marked up as one and that headings describe their sections, but it does not have a rule that forbids going from an h2 to an h4. Skipping levels is still widely treated as poor practice, because screen reader users may think they have missed a section, and automated checkers flag it. It is usually quick to fix by changing the level of the heading that is out of place.

2. Can a page have more than one h1?

HTML allows it and WCAG does not forbid it, and Google has said that several h1 headings are not a problem for search. However, for most pages a single h1 that describes the page is the clearest structure for screen reader users, who often press 1 to jump straight to the main heading. If the site name or logo is an h1 on every page, that is the most common cause of two h1 headings and the easiest to fix.

3. Should the logo be the h1?

Usually not on inner pages. If the logo or site name is an h1 on every page, every page begins with the same main heading, and the real title of the article or product becomes a second h1 or drops to an h2. Make the logo a link with alt text naming the business, and use the page title as the main heading. Some sites keep the site name as the h1 on the home page only, which is a reasonable choice.

4. How do screen reader users navigate by headings?

In NVDA and JAWS on Windows, pressing H moves to the next heading and Shift with H moves back, while the number keys 1 to 6 jump to the next heading of that level. NVDA can also show a list of all headings with Insert and F7. VoiceOver on Mac and iPhone has a rotor that lists headings. Many screen reader users start on an unfamiliar page by skimming its headings, so a clear heading list saves them a lot of time.

5. Can I use a heading tag just to make text bigger?

No. Heading tags tell assistive technology that the text starts a new section, so using them for emphasis puts taglines, prices and offers into the heading list as if they were sections. That is a failure of WCAG 1.3.1. Use a paragraph or span with a CSS class for text that should look large but is not a heading, and set the size of real headings with CSS so their level can stay correct.

6. Do headings inside sections start again at h1?

No. Older guidance described an HTML5 outline algorithm where each section or article could begin with an h1 and browsers would work out the real level. Browsers and screen readers never implemented it, and it has been removed from the HTML standard. An h1 inside a section is still announced as a level 1 heading. Use explicit levels that match where the content sits in the page, whatever sectioning elements surround it.

7. Do heading fixes help SEO as well as accessibility?

Clear, descriptive headings help search engines and AI tools understand what each part of a page is about and which text answers which question, and they make pages easier for everyone to scan. There is no special ranking reward for a perfect heading order or for having exactly one h1, so treat the search benefit as a side effect. The main reason to fix heading structure is that screen reader users depend on it to find their way.

Check your heading structure now

The Accessibility Audit tests your page against WCAG 2.2 level AA, lists each finding with the element that failed and the success criterion behind it, and links to the guide that fixes it.

Open Accessibility Fixes โ†’
๐Ÿ’ฌ Got a problem?
Related Guides: All Accessibility Fixes  ·  Div Soup to Semantic HTML  ·  Fixing Vague Link Text  ·  Accessibility Guide  ·  Learning Hub

About aiwebpageseo

aiwebpageseo.com is a data-driven SEO and AEO (Answer Engine Optimisation) platform providing a free suite of technical SEO tools. Rather than relying on AI-theorised assumptions, the platform analyses live URL performance, delivering objective diagnostics, page speed metrics, CLS debugging, and site crawl data alongside actionable technical tutorials.