WordPress Block Theme Template Hierarchy
The full block-theme (FSE) template hierarchy: for every request type, the ordered list of templates WordPress looks for, most specific first, falling back to index.html. The block-era equivalent of the classic hierarchy chart.
For each request, WordPress looks for these templates in order — most specific first — and stops at the first one that exists in your theme’s /templates folder. The chain always ends at index.html.
Front page
The site's front page, whether it is set to your latest posts or a static page.
- front-page.html
- home.html
- index.html
front-page.html wins regardless of the Settings → Reading choice. If the front page is a static page and there is no front-page.html, it falls through to the static-page chain, not home.html.
Blog posts index
The page that lists your latest posts (the "posts page" in Settings → Reading).
- home.html
- index.html
Single post
An individual blog post.
- single-post-{slug}.html
- single-post.html
- single.html
- singular.html
- index.html
Single custom post type
An individual entry of a custom post type (e.g. a "book").
- single-{post-type}-{slug}.html
- single-{post-type}.html
- single.html
- singular.html
- index.html
For a post type "book" with slug "dune": single-book-dune.html, then single-book.html, then single.html.
Static page
A regular WordPress page.
- page-{slug}.html
- page-{id}.html
- page.html
- singular.html
- index.html
Page with a custom template
A page assigned a custom template in the editor's Template panel.
- {custom-template}.html
- page-{slug}.html
- page-{id}.html
- page.html
- singular.html
- index.html
Custom templates are declared in theme.json's customTemplates array and live in /templates. The assigned one wins over the whole page chain.
Category archive
The archive listing posts in one category.
- category-{slug}.html
- category-{id}.html
- category.html
- archive.html
- index.html
Tag archive
The archive listing posts with one tag.
- tag-{slug}.html
- tag-{id}.html
- tag.html
- archive.html
- index.html
Custom taxonomy archive
The archive for a term in a custom taxonomy.
- taxonomy-{taxonomy}-{term}.html
- taxonomy-{taxonomy}.html
- taxonomy.html
- archive.html
- index.html
Author archive
The archive of one author's posts.
- author-{nicename}.html
- author-{id}.html
- author.html
- archive.html
- index.html
Date archive
A year / month / day archive.
- date.html
- archive.html
- index.html
Post type archive
The archive index for a custom post type that has has_archive set.
- archive-{post-type}.html
- archive.html
- index.html
Search results
The results page for a site search.
- search.html
- index.html
404 (not found)
Shown when no content matches the URL.
- 404.html
- index.html
Attachment page
The page for a single media attachment.
- attachment.html
- single.html
- singular.html
- index.html
Many sites disable attachment pages entirely (they are thin content). If you keep them, this is the chain.
Privacy policy page
The page set as the site's privacy policy in Settings.
- page-privacy-policy.html
- privacy-policy.html
- page.html
- singular.html
- index.html
How this differs from the classic (PHP) hierarchy
- Templates are .html files in /templates, not .php files in the theme root. There is no single.php — it is single.html.
- Reusable regions (header, footer) are template PARTS in /parts, referenced with the wp:template-part block, not get_header() / get_footer() PHP calls.
- There is no get_template_part() chain and no get_header()/get_footer(). Composition is done with the Template Part block inside the .html files.
- index.html is REQUIRED. A block theme without templates/index.html is not a valid block theme — it is the mandatory final fallback for every route above.
- The theme is declared a block theme by the PRESENCE of templates/index.html plus a theme.json, not by any header flag.
- You can edit any of these templates in the Site Editor (Appearance → Editor) and save the changes to the database — which then OVERRIDE the theme's files until you clear the customization. This surprises people debugging "why does my template change do nothing".