Twenty Twenty-Five (TT5) shipped as WordPress's default theme in late 2024, and it's a proper block theme from top to bottom. No PHP template files. No functions.php enqueue dance. Everything runs through theme.json and HTML-based templates.
That's great for the Site Editor, but it also means building a child theme works differently than what you might be used to. I spent a weekend figuring this out when I wanted to tweak TT5 for a client's photography portfolio. The old method of enqueueing parent styles in functions.php doesn't apply here. Let me walk you through what actually works.
What You Need Before Starting
Make sure you have these ready:
- WordPress 6.5 or newer (TT5 requires it)
- Twenty Twenty-Five installed (it should already be there if you're on WP 6.5+)
- FTP or file manager access to your
wp-content/themes/directory - A code editor (VS Code, Sublime Text, or even Notepad++ will do)
If you've never worked with child themes at all, read through our complete child theme guide first. It covers the fundamentals and explains why child themes matter for update safety.
Step 1: Create the Child Theme Folder
Connect to your site via FTP or open the file manager in your hosting panel. Navigate to wp-content/themes/ and create a new folder called:
twentytwentyfive-child
The folder name doesn't technically have to follow this convention, but sticking with parentname-child keeps things tidy. You'll thank yourself six months from now when you're trying to remember which theme folder belongs to what.
Step 2: Create style.css With the Required Header
Inside your new folder, create a file called style.css. This file needs a specific comment block at the top that tells WordPress it's a child theme:
/*
Theme Name: Twenty Twenty-Five Child
Theme URI: https://example.com/
Description: A child theme for Twenty Twenty-Five
Author: Your Name
Author URI: https://example.com/
Template: twentytwentyfive
Version: 1.0.0
Requires at least: 6.5
Tested up to: 6.7
Requires PHP: 7.2
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
The line that matters most is Template: twentytwentyfive. This tells WordPress which parent theme to inherit from. Get the spelling wrong and nothing will work.
You can add custom CSS below this comment block if you want, but for block themes most of your styling will happen in theme.json instead.
Step 3: Create theme.json for Block Theme Customization
Here's where TT5 child themes differ from classic child themes. With a classic theme, you'd create a functions.php file and enqueue the parent stylesheet. Block themes don't need that. WordPress automatically loads the parent theme's styles when it detects a child theme.
Instead, you control everything through theme.json. Create a theme.json file in your child theme folder:
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"settings": {
"color": {
"palette": [
{
"slug": "primary",
"color": "#1a5276",
"name": "Primary"
},
{
"slug": "secondary",
"color": "#2ecc71",
"name": "Secondary"
}
]
}
}
}
This example overrides TT5's default color palette with your own. The child theme's theme.json gets merged on top of the parent's settings, so you only need to include the parts you want to change.
If you want a deeper understanding of how theme.json works, check out our guide to block themes. It covers the full structure and how block themes changed the way WordPress handles design.
Step 4: Activate and Test Your Child Theme
Go to Appearance > Themes in your WordPress dashboard. You should see "Twenty Twenty-Five Child" listed there. Click "Activate."
Your site should look exactly like it did before, because the child theme inherits everything from the parent. If something looks broken or the theme doesn't appear at all, double-check:
- The
Template:line in style.css matchestwentytwentyfiveexactly (lowercase, no spaces) - Your style.css file is saved with UTF-8 encoding
- The folder is inside
wp-content/themes/, not nested deeper
Customizing Colors, Fonts, and Layouts via theme.json
Now for the fun part. Here's a more complete theme.json that changes fonts, adjusts content width, and adds custom spacing:
{
"$schema": "https://schemas.wp.org/wp/6.7/theme.json",
"version": 3,
"settings": {
"typography": {
"fontFamilies": [
{
"fontFamily": "\"Inter\", sans-serif",
"slug": "body-font",
"name": "Inter"
}
],
"fontSize": true,
"lineHeight": true
},
"layout": {
"contentSize": "720px",
"wideSize": "1100px"
},
"spacing": {
"units": ["px", "rem", "em", "%"]
}
},
"styles": {
"typography": {
"fontFamily": "var(--wp--preset--font-family--body-font)",
"fontSize": "1.05rem",
"lineHeight": "1.75"
},
"elements": {
"heading": {
"typography": {
"fontWeight": "700"
}
},
"link": {
"color": {
"text": "#1a5276"
}
}
}
}
}
After saving this file, open the Site Editor (Appearance > Editor) and you'll see your changes reflected. The content area narrows to 720px, body text switches to Inter, and links turn that deep blue.
You can also override individual block styles. Want all buttons to have rounded corners? Add a blocks section inside styles:
"blocks": {
"core/button": {
"border": {
"radius": "8px"
}
}
}
Common Issues and Fixes
Styles Not Loading
If your theme.json changes don't appear, try these fixes in order:
- Clear your browser cache (hard refresh with Ctrl+Shift+R)
- Clear any WordPress caching plugin you're running
- Validate your JSON at jsonlint.com. A missing comma or bracket will silently break everything
- Make sure you're using
"version": 3in theme.json (not version 2)
Template Parts Not Found
If you're overriding template parts (header, footer, sidebar), create a parts/ folder inside your child theme and place your custom HTML template files there. WordPress checks the child theme's parts/ folder first, then falls back to the parent.
The filenames must match exactly. If TT5 has parts/header.html, your override must also be parts/header.html.
Site Editor Shows Parent Theme Styles
Sometimes the Site Editor caches aggressively. Go to Appearance > Editor, click the three-dot menu in the top right, and select "Reset to defaults." Then check if your child theme changes appear.
According to the WordPress developer documentation on child themes, the child theme's theme.json should always take priority over the parent. If it doesn't, there's likely a syntax error in your JSON file.
Looking for a Head Start?
Browse our WordPress themes collection for block-ready themes you can customize right away.
Browse Themes