Skip to content

Twenty Twenty-Five: Render every template inside a shared index template - #14795

Open
scruffian wants to merge 4 commits into
WordPress:trunkfrom
scruffian:scruffian/tt5-templating-update
Open

scruffian wants to merge 4 commits into
WordPress:trunkfrom
scruffian:scruffian/tt5-templating-update

Conversation

@scruffian

@scruffian scruffian commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

This demonstrates how Gutenberg PR #85402, can help us to implement simpler themes.

  • index.html becomes the theme's shell — the header part, the shared main wrapper holding a core/template-slot block, and the footer part
  • the seven other templates carry only what is particular to them
  • Each names the template it is rendered inside in the new templates section of theme.json, so the header and the footer live in one template instead of being repeated in eight.
  • Five of the seven compose to a block-for-block identical tree and render exactly as they did before; 404 and page-no-title adopt the shared main wrapper, so they lose their own padding and their zero top margin respectively.

This relies on the templates section of theme.json and the template_include substitution added by that Gutenberg PR, neither of which core has, so on plain trunk the theme renders with no header and no footer.

Trac ticket: none. This is a companion to Gutenberg PR #85402, opened for review alongside it, and is not proposed for core as it stands.

Use of AI Tools

AI assistance: Yes
Tool(s): Claude Code
Model(s): Claude Opus 5
Used for: The template and theme.json changes, and a throwaway harness that verified the composed block trees against trunk. Directed and reviewed by me.


This Pull Request is for code review only. Please keep all other discussion in the Trac ticket. Do not merge this Pull Request. See GitHub Pull Requests for Code Review in the Core Handbook for more details.

…ate.

Following the approach in Gutenberg PR #85402, `index.html` becomes the
theme's shell — the header part, the common `main` wrapper holding a
`core/post-content` slot, and the footer part — while the seven other
templates carry only what is particular to them. Each one names the
template it is rendered inside in the new `templates` section of
`theme.json`.

Five of the seven compose to a block-for-block identical tree, so they
render as they did before. The `404` and `page-no-title` templates adopt
the shared `main` wrapper, so they lose their own padding and their zero
top margin respectively.

This relies on the `templates` section of `theme.json` and the template
substitution added by Gutenberg PR #85402, neither of which core has yet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs.

Core Committers: Use this line as a base for the props when committing in SVN:

Props scruffian.

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.


Props Bot commands

You can trigger Props Bot actions by commenting on this PR:

  • @propsbot add <username> to give props to a GitHub user. Requires write access.
  • @propsbot remove <username> to leave a user out of the props. Requires write access.
  • @propsbot refresh to refresh this list. Adding the props-bot label works too.

@scruffian scruffian self-assigned this Oct 23, 2026
@github-actions

Copy link
Copy Markdown

Test using WordPress Playground

The changes in this pull request can previewed and tested using a WordPress Playground instance.

WordPress Playground is an experimental project that creates a full WordPress instance entirely within the browser.

Some things to be aware of

  • All changes will be lost when closing a tab with a Playground instance.
  • All changes will be lost when refreshing the page.
  • A fresh instance is created each time the link below is clicked.
  • Every time this pull request is updated, a new ZIP file containing all changes is created. If changes are not reflected in the Playground instance,
    it's possible that the most recent build failed, or has not completed. Check the list of workflow runs to be sure.

For more details about these limitations and more, check out the Limitations page in the WordPress Playground documentation.

Test this pull request with WordPress Playground.

…lock of index.

The templates inside templates experiment in Gutenberg moved the slot a template is rendered in from the Content block to a block of its own, `core/template-slot`, whose inner blocks are what the template shows when it is rendered on its own. Index holds the blog heading and query loop it had before in its slot, so it renders as it did for its own requests, and every other template takes their place.

The slot is full width with a constrained layout, as the content block of the single template is, so the full width groups of the templates rendered in it still span the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019rCnBrK7NJAD3YXwHRSLgi
scruffian pushed a commit to WordPress/gutenberg that referenced this pull request Nov 11, 2026
…ne names

A template can name another template to be rendered inside, and the front
end renders a post inside its template and that template inside the one it
names, but the canvas showed a post inside its own template alone: a theme
that keeps its header and its footer in one template, such as the Twenty
Twenty-Five of WordPress/wordpress-develop#14795, showed every post and page
without them.

When the template of the post names a template, the canvas renders that one
at its root, the post's template in its slot through `templateSlotId`, and the
post in the content block of its template, which reads the post from the
context as it did. The editor waits for that template before rendering, as it
waits for the post's template, so the canvas does not render twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019rCnBt2q8NL4WPNzTrjuVR
scruffian and others added 2 commits November 11, 2026 22:35
Remove the blog heading and query loop patterns from the core/template-slot block, so index.html is only the shell. home.html keeps the blog listing.
Remove the blog heading and query loop patterns from the core/template-slot block, so index.html is only the shell. home.html keeps the blog listing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019rCnBqBF4VuSXgWLoKcCQY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019rCnBqBF4VuSXgWLoKcCQY
@github-actions

Copy link
Copy Markdown

Trac Ticket Missing

This pull request is missing a link to a Trac ticket. For a contribution to be considered, there must be a corresponding ticket in Trac.

To attach a pull request to a Trac ticket, please include the ticket's full URL in your pull request description. More information about contributing to WordPress on GitHub can be found in the Core Handbook.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant