LH 2015 is a block theme (2.31.0): it has templates/index.html, so wp_is_block_theme() is true and every page renders through a block template, including BuddyPress, WooCommerce and plugin pages. The Site Editor manages all of its templates and parts. Before 2.31.0 it was a hybrid theme, declaring block-templates and block-template-parts support and using a block template only where one was at least as specific as its PHP template; the views were moved over one by one (2.25.0 to 2.30.0) before index.html was added.
The classic PHP templates were removed in 2.32.0 (single, page, archive, search, 404, comments and the content-*.php parts; index.php is now only a silence guard), and author-bio.php in 2.33.0. Two remain: header.php and footer.php, for plugins that still render a PHP template with get_header() and get_footer().
The theme ships these block templates in templates/. Each reproduces the classic skeleton (div#content.site-content around main#main.site-main), so the theme’s layout and card styles apply unchanged, and filters in includes/block-template-support.php make the blocks print the classic markup.
| Template | Replaces | Notes |
|---|---|---|
| index.html | index.php | The final fallback, the posts list from home.html (2.31.0). Every common view has its own template, so it is rarely used. |
| 404.html | 404.php | Text from the hidden pattern lh-2015/hidden-404. |
| search.html | search.php | A Query Loop on the main query with excerpt cards, as content-search.php. |
| home.html | index.php for the posts index | Post cards; pagination above the list from page 2 and below it in div.bottom_pagination (2.27.0). |
| archive.html | archive.php | Breadcrumbs, archive title, term description and template notices, then post cards (2.27.0). Post type archives with a template from their plugin (events) use that. |
| page.html | page.php | Breadcrumbs, the author box when the author has a bio, and comments. Also used for BuddyPress pages (see below). |
| plain.html (“Plain”) | the Plain, Page no breadcrumb and Plain with template notices page templates | Custom page template: no breadcrumbs or author box, template notices container in the header, comments (2.28.0). |
| plain-no-comments.html (“Plain, no comments”) | the Plain No comments page template | Plain without comments, for pages that take comments another way, such as the feedback page (2.28.0). |
| single.html | single.php with content.php | Standard posts, posts of formats without a template of their own, and any other post type without a template of its own, such as games, rosters and places (2.25.0). |
| single-format-gallery.html | content-gallery.php | Tags above the content (2.26.0). |
| single-format-video.html | content-video.php | No featured image; tags above the content (2.26.0). |
| single-format-link.html | content-link.php | No featured image or meta line; title links to the URL in the post; author box after the content (2.26.0). |
Plain and Plain, no comments are registered as customTemplates in theme.json, so they are offered in a page’s Template panel. They replace the four classic page templates in page-templates/, which have been removed; schema 5 in includes/upgrade.php moved each site’s pages to them the first time the site loaded after 2.28.0.
The theme has no attachment template. Since 2.29.0, schema 6 in includes/upgrade.php turns attachment pages off on each site (wp_attachment_pages_enabled set to 0), so an attachment URL redirects to the file itself. The classic image.php and its keyboard navigation script were removed.
WordPress’s template hierarchy has no post format step, so LH 2015 adds one through the single_template_hierarchy filter: single-format-{format}, just before single (after single-{post_type}), for post types that support post formats. Block templates are looked up from that list, so a post of a format uses templates/single-format-{format}.html, or a template of that slug saved in the Site Editor, when one exists. Every format the theme supports is registered as a template type through default_template_types, so the Site Editor lists them by name (“Single Video Post” and so on) and a site can add one for any format.
In home.html, archive.html and index.html the Query Loop’s Post Template holds a single Template Part, post-card. For a post with a format, the theme switches it to post-card-{format} when a part of that slug exists, so lists vary by format the way the classic content-{format}.php cards did:
| Part | Card |
|---|---|
| post-card.html | Linked featured image, linked title, meta line, content, footer links. |
| post-card-gallery.html | As post-card, with the tags above the content. |
| post-card-video.html | No featured image; tags above the content. |
| post-card-link.html | No featured image or meta line; the title links to the URL in the post. |
The parts are registered in theme.json, so they are listed in the Site Editor (“Post Card: Video” and so on), and a site can add a card for another format by saving a part named post-card-{format}. A card part prints no wrapper element, so its blocks sit directly in the list item, and plugins’ hooked blocks (such as related posts) are not added to cards. Post Content’s more link keeps the classic “Continue reading” text.
page.html and single-format-link.html show the author box with core’s Post Author block (class author-info): a “Published by” byline, the avatar, the author’s name linking to their posts, and their bio. The theme removes it when the author has no bio, as the classic author box did, and css/blocks/core/post-author.css styles it like the classic one (2.33.0).
The single-entry templates wrap the post in a Group with the class lh-2015-entry, which becomes the classic article card. Some blocks are placeholders for the classic output:
lh-2015-entry-meta: the “Posted on … by …” line and categories from lh_2015_entry_meta().tags-links: the classic tag list.lh-2015-link-title (set to link): links to the URL in the post, for link posts.post-navigation: the Previous/Next post navigation from get_the_post_navigation(), with the neighbouring posts’ images as backgrounds.lh-2015-paged-only: prints only from page 2 onward. Every Query Pagination on the main query prints the classic the_posts_pagination() markup.Breadcrumbs show on pages, archives and other singular views, but not on single posts or pages using Plain or Plain, no comments.
Comments come from core’s Comments block with its inner blocks, not legacy mode. The block gets the classic #comments anchor and comments-area card, and prints nothing when comments are closed and there are none.
Block templates also show blocks that plugins hook into them, for example related posts after the post content and ActivityPub’s Fediverse reactions on single posts. The Webmention plugin’s form is not hooked in: LH Sites Specific (1.0.3) makes the plugin attach it to the comment form instead, so its “Show a Webmention form” setting under Settings > Discussion decides whether it shows.
BuddyPress renders its pages (directories, member and group pages, activity) through the WordPress template canvas when the theme is a block theme, and WordPress picks page.html for them: breadcrumbs, the page title, then BuddyPress’s content from the theme’s template pack. Plugins’ hooked blocks are not added to the template on BuddyPress pages (filter_buddypress_hooked_blocks()), since a BuddyPress page is not a post; blocks hooked into the header and footer parts still are.
Templates for a content type belong to the plugin that registers the type, as a block template it registers with register_block_template(), not to the theme. A content type that needs nothing special uses single.html.
| Post type | Template | Source |
|---|---|---|
| lh_governance_doc | single-lh_governance_doc | LH Governance Documents |
| post, archive status (the archived posts index at /archived/) | archive-index | LH Archived Post Status Extender (1.0.0), which puts archive-index first in the index template hierarchy while the index is served. Replaces the theme’s archive-index.php. |
| lh_crm_enquiry_post | single-lh_crm_enquiry_post | LH CRM (1.6.0), with its Enquiry Details block. Replaces the theme’s single-lh_crm_enquiry_post.php. |
The theme has no templates of its own for content types: games, rosters and places use single.html (2.29.0), and events, vouchers, enquiries and the archived posts index have templates from their plugins (see each plugin’s documentation).
The theme has no WooCommerce templates of its own (its copy of single-product.php was removed in 2.30.0, so products no longer show the post footer links). As a block theme, shop, product, cart and checkout pages use WooCommerce’s own block templates with the theme’s header and footer parts. includes/woocommerce.php declares WooCommerce support and removes WooCommerce’s classic content wrappers, which would otherwise nest a second main element inside the template’s (2.31.0).
Every template uses the header and footer parts, which each site can edit in the Site Editor (a saved part replaces the theme’s file for that site). header.php and footer.php print the same parts with block_template_part(), for plugins that still render a PHP template.
Both parts are built from core blocks and reuse Twenty Fifteen’s class names, so the theme’s styles and scripts apply to them:
sidebar holding a site-header / site-branding Group with the Site Logo, a site-summary Group with Site Title (class site-title) and Site Tagline (class site-description), and a Buttons block whose Button (class secondary-toggle, rendered as a button) is the small-screen Menu button; then a Group secondary holding the main menu and social links Navigation blocks (classes main-navigation and social-navigation). The Menu button shows and hides the whole secondary area below 955px.site-footer / site-info holding a Navigation block (class nav-menu-footer) with Log in/out, Register and Sitemap links.Filters in includes/block-template-support.php make these blocks render like the classic markup: the secondary-toggle class moves onto the button element, a site-title Site Title is an h1 only on a blog-posts front page, the custom logo gets fetchpriority="low", and main-menu Navigation blocks open submenus only from their toggles (the hover directives are removed). css/blocks/core/site-logo.css sizes the logo, and social links are shown as icons from an icon-* class on each link.
css/block-templates.css gives .wp-site-blocks > main the geometry of the content card for templates without the classic skeleton, such as WooCommerce’s and other plugin-registered ones. Post titles and content in block templates get the entry-title and entry-content classes so the theme’s typography applies. Site styling, including custom CSS, lives in each site’s global styles (Appearance > Editor > Styles), which core prints on the front end.
Register it from the plugin that owns the post type. Reference the parts by slug with tagName header and footer, and put the content in a main group (or reproduce the theme’s div#content.site-content / main#main.site-main skeleton).