{"id":20869,"date":"2026-10-23T10:08:00","date_gmt":"2026-10-23T08:08:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=20869"},"modified":"2026-10-09T22:33:50","modified_gmt":"2026-10-09T20:33:50","slug":"block-themes-theme-json","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/","title":{"rendered":"Block themes with theme.json: templates, parts and child themes"},"content":{"rendered":"<p>A block theme mainly consists of HTML files containing block markup and a single JSON file. To understand how it works, you also need to know which template WordPress renders for a request, why a changed file sometimes has no visible effect, and what happens to the parent theme\u2019s settings when a child theme supplies its own <code>theme.json<\/code>. A handful of functions in core determine this behavior.<\/p>\n<p>This article builds a minimal but complete block theme with <code>style.css<\/code>, <code>theme.json<\/code>, a template, two template parts, a pattern and a style variation, and then a child theme on top of it. Along the way it follows the WordPress 7.1 source code to show where the Site Editor stores changes, in which order templates are resolved and how the data layers of global settings and styles are merged. The current release on 29.09.2026, according to the WordPress.org version-check API, is 7.1.2.<\/p>\n<h2>The files of a minimal block theme<\/h2>\n<p>WordPress treats a theme as a block theme once it finds a readable <code>templates\/index.html<\/code>. <code>WP_Theme::is_block_theme()<\/code> checks exactly this path and, for backward compatibility, the older <code>block-templates\/index.html<\/code>. Everything else is optional, but a usable theme needs a few more pieces. The folder of the example theme looks like this:<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">lw-base\/\n<\/span><span class=\"cbb-line\">\u251c\u2500\u2500 style.css\n<\/span><span class=\"cbb-line\">\u251c\u2500\u2500 theme.json\n<\/span><span class=\"cbb-line\">\u251c\u2500\u2500 templates\/\n<\/span><span class=\"cbb-line\">\u2502   \u2514\u2500\u2500 index.html\n<\/span><span class=\"cbb-line\">\u251c\u2500\u2500 parts\/\n<\/span><span class=\"cbb-line\">\u2502   \u251c\u2500\u2500 header.html\n<\/span><span class=\"cbb-line\">\u2502   \u2514\u2500\u2500 footer.html\n<\/span><span class=\"cbb-line\">\u251c\u2500\u2500 patterns\/\n<\/span><span class=\"cbb-line\">\u2502   \u2514\u2500\u2500 footer-credits.php\n<\/span><span class=\"cbb-line\">\u2514\u2500\u2500 styles\/\n<\/span><span class=\"cbb-line\">    \u2514\u2500\u2500 night.json<\/span><\/code><\/pre><\/figure>\n\n\n<p>The <code>style.css<\/code> file carries the theme header. For a block theme it does not need any CSS at all, because the styles come from <code>theme.json<\/code>. The Theme Handbook lists Theme Name, Description, Version, Author, Text Domain, Tested up to, Requires at least, Requires PHP, License and License URI as required fields for the theme directory. The example sets <code>Requires at least: 6.6<\/code> because it uses <code>theme.json<\/code> version 3, which was introduced with WordPress 6.6.<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"yaml\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">YAML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-yaml\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">\/*\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Theme Name<\/span>: LW Base\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Theme URI<\/span>: https:\/\/example.com\/lw-base\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Author<\/span>: Lukas Wojcik\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Author URI<\/span>: https:\/\/lukaswojcik.com\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Description<\/span>: Minimal block theme with templates, template parts, a pattern and a style variation.\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Version<\/span>: 1.0.0\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Requires at least<\/span>: <span class=\"cbb-number\">6.6<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Tested up to<\/span>: <span class=\"cbb-number\">7.1<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Requires PHP<\/span>: <span class=\"cbb-number\">7.4<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">License<\/span>: GNU General Public License v2 or later\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">License URI<\/span>: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Text Domain<\/span>: lw-base\n<\/span><span class=\"cbb-line\">*\/<\/span><\/code><\/pre><\/figure>\n\n\n<p>The folder names are fixed: templates go into <code>templates\/<\/code>, template parts into <code>parts\/<\/code>, patterns into <code>patterns\/<\/code> and style variations into <code>styles\/<\/code>. The legacy names <code>block-templates\/<\/code> and <code>block-template-parts\/<\/code> are still recognized by <code>WP_Theme::get_block_template_folders()<\/code>, but only as a fallback for older themes.<\/p>\n<h2>theme.json: settings, styles and version 3<\/h2>\n<p><code>theme.json<\/code> has two main sections. <code>settings<\/code> defines what the editor offers: color palettes, font sizes, font families, layout widths and which design tools are enabled. <code>styles<\/code> applies values to the whole page, to elements such as links and headings, and to individual blocks. In addition, the top level accepts <code>customTemplates<\/code>, <code>templateParts<\/code> and <code>patterns<\/code>; the JSON schema for 7.1 also lists <code>title<\/code>, <code>slug<\/code>, <code>description<\/code> and <code>blockTypes<\/code>, which are relevant for style variations.<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"json\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JSON<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-json\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">{\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"$schema\"<\/span>: <span class=\"cbb-string\">\"https:\/\/schemas.wp.org\/wp\/7.1\/theme.json\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"version\"<\/span>: <span class=\"cbb-number\">3<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"settings\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"appearanceTools\"<\/span>: <span class=\"cbb-constant\">true<\/span>,\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"layout\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"contentSize\"<\/span>: <span class=\"cbb-string\">\"720px\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"wideSize\"<\/span>: <span class=\"cbb-string\">\"1200px\"<\/span>\n<\/span><span class=\"cbb-line\">\t\t},\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"color\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"defaultPalette\"<\/span>: <span class=\"cbb-constant\">false<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"palette\"<\/span>: &#91;\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"base\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#ffffff\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Base\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"contrast\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#111827\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Contrast\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"accent\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#0369a1\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Accent\"<\/span> }\n<\/span><span class=\"cbb-line\">\t\t\t&#93;\n<\/span><span class=\"cbb-line\">\t\t},\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"typography\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"defaultFontSizes\"<\/span>: <span class=\"cbb-constant\">false<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"fontSizes\"<\/span>: &#91;\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"small\"<\/span>, <span class=\"cbb-attr\">\"size\"<\/span>: <span class=\"cbb-string\">\"0.875rem\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Small\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"medium\"<\/span>, <span class=\"cbb-attr\">\"size\"<\/span>: <span class=\"cbb-string\">\"1rem\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Medium\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"large\"<\/span>, <span class=\"cbb-attr\">\"size\"<\/span>: <span class=\"cbb-string\">\"1.5rem\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Large\"<\/span> }\n<\/span><span class=\"cbb-line\">\t\t\t&#93;,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"fontFamilies\"<\/span>: &#91;\n<\/span><span class=\"cbb-line\">\t\t\t\t{\n<\/span><span class=\"cbb-line\">\t\t\t\t\t<span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"system\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t\t\t<span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"System\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t\t\t<span class=\"cbb-attr\">\"fontFamily\"<\/span>: <span class=\"cbb-string\">\"-apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif\"<\/span>\n<\/span><span class=\"cbb-line\">\t\t\t\t}\n<\/span><span class=\"cbb-line\">\t\t\t&#93;\n<\/span><span class=\"cbb-line\">\t\t}\n<\/span><span class=\"cbb-line\">\t},\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"styles\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"color\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"background\"<\/span>: <span class=\"cbb-string\">\"var(--wp--preset--color--base)\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"text\"<\/span>: <span class=\"cbb-string\">\"var(--wp--preset--color--contrast)\"<\/span>\n<\/span><span class=\"cbb-line\">\t\t},\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"typography\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"fontFamily\"<\/span>: <span class=\"cbb-string\">\"var(--wp--preset--font-family--system)\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"fontSize\"<\/span>: <span class=\"cbb-string\">\"var(--wp--preset--font-size--medium)\"<\/span>,\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"lineHeight\"<\/span>: <span class=\"cbb-string\">\"1.6\"<\/span>\n<\/span><span class=\"cbb-line\">\t\t},\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"spacing\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"padding\"<\/span>: { <span class=\"cbb-attr\">\"top\"<\/span>: <span class=\"cbb-string\">\"1.5rem\"<\/span>, <span class=\"cbb-attr\">\"right\"<\/span>: <span class=\"cbb-string\">\"1.5rem\"<\/span>, <span class=\"cbb-attr\">\"bottom\"<\/span>: <span class=\"cbb-string\">\"1.5rem\"<\/span>, <span class=\"cbb-attr\">\"left\"<\/span>: <span class=\"cbb-string\">\"1.5rem\"<\/span> }\n<\/span><span class=\"cbb-line\">\t\t},\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"elements\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"link\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t\t<span class=\"cbb-attr\">\"color\"<\/span>: { <span class=\"cbb-attr\">\"text\"<\/span>: <span class=\"cbb-string\">\"var(--wp--preset--color--accent)\"<\/span> }\n<\/span><span class=\"cbb-line\">\t\t\t}\n<\/span><span class=\"cbb-line\">\t\t}\n<\/span><span class=\"cbb-line\">\t},\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"templateParts\"<\/span>: &#91;\n<\/span><span class=\"cbb-line\">\t\t{ <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"header\"<\/span>, <span class=\"cbb-attr\">\"title\"<\/span>: <span class=\"cbb-string\">\"Header\"<\/span>, <span class=\"cbb-attr\">\"area\"<\/span>: <span class=\"cbb-string\">\"header\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t{ <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"footer\"<\/span>, <span class=\"cbb-attr\">\"title\"<\/span>: <span class=\"cbb-string\">\"Footer\"<\/span>, <span class=\"cbb-attr\">\"area\"<\/span>: <span class=\"cbb-string\">\"footer\"<\/span> }\n<\/span><span class=\"cbb-line\">\t&#93;\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n\n\n<p>The version number matters. The theme.json reference on developer.wordpress.org documents version 3, and the Block Editor Handbook states that it was introduced with WordPress 6.6. In the 7.1 source, <code>WP_Theme_JSON::LATEST_SCHEMA<\/code> is 3 as well. The dev note on make.wordpress.org describes the only breaking change: from version 3 onwards, a theme can no longer silently replace the default font sizes or spacing sizes by reusing their slugs. Anyone who wants to use slugs like <code>small<\/code>, <code>medium<\/code> and <code>large<\/code> for custom values has to set <code>defaultFontSizes<\/code> (or <code>defaultSpacingSizes<\/code>) to <code>false<\/code>, as the example does. According to the Block Editor Handbook, older versions remain supported.<\/p>\n<p>For the <code>$schema<\/code> key there are two variants: <code>https:\/\/schemas.wp.org\/trunk\/theme.json<\/code> follows development, while <code>https:\/\/schemas.wp.org\/wp\/7.1\/theme.json<\/code> is pinned to one release. The export function in core writes the versioned form, and that is also the safer choice for editor autocompletion because the trunk schema may already describe properties that the installed release does not know. All three JSON files in this article were validated against the 7.1 schema.<\/p>\n<p>The <code>templateParts<\/code> array assigns each file in <code>parts\/<\/code> a title and an area. Core defines the areas <code>header<\/code>, <code>footer<\/code> and <code>uncategorized<\/code>; since 7.0, the source code also contains <code>navigation-overlay<\/code>. The area decides where the Site Editor lists the part and which HTML element wraps it when no <code>tagName<\/code> is set.<\/p>\n<h2>Templates, template parts and a pattern<\/h2>\n<p>A template is an HTML file with serialized blocks. The following <code>index.html<\/code> embeds the header and footer parts, wraps the content in a <code>main<\/code> element and uses the Query Loop block with <code>\"inherit\":true<\/code>, so that it shows whatever the main query of the current request contains: the blog index, an archive or search results.<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">&lt;!-- wp:template-part {\"slug\":\"header\",\"tagName\":\"header\"} \/--&gt;\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">&lt;!-- wp:group {\"tagName\":\"main\",\"layout\":{\"type\":\"constrained\"}} --&gt;\n<\/span><span class=\"cbb-line\">&lt;main class=\"wp-block-group\"&gt;\n<\/span><span class=\"cbb-line\">\t&lt;!-- wp:query {\"queryId\":1,\"query\":{\"perPage\":10,\"pages\":0,\"offset\":0,\"postType\":\"post\",\"order\":\"desc\",\"orderBy\":\"date\",\"inherit\":true}} --&gt;\n<\/span><span class=\"cbb-line\">\t&lt;div class=\"wp-block-query\"&gt;\n<\/span><span class=\"cbb-line\">\t\t&lt;!-- wp:post-template --&gt;\n<\/span><span class=\"cbb-line\">\t\t\t&lt;!-- wp:post-title {\"isLink\":true} \/--&gt;\n<\/span><span class=\"cbb-line\">\t\t\t&lt;!-- wp:post-excerpt \/--&gt;\n<\/span><span class=\"cbb-line\">\t\t&lt;!-- \/wp:post-template --&gt;\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\t\t&lt;!-- wp:query-pagination --&gt;\n<\/span><span class=\"cbb-line\">\t\t\t&lt;!-- wp:query-pagination-previous \/--&gt;\n<\/span><span class=\"cbb-line\">\t\t\t&lt;!-- wp:query-pagination-numbers \/--&gt;\n<\/span><span class=\"cbb-line\">\t\t\t&lt;!-- wp:query-pagination-next \/--&gt;\n<\/span><span class=\"cbb-line\">\t\t&lt;!-- \/wp:query-pagination --&gt;\n<\/span><span class=\"cbb-line\">\t&lt;\/div&gt;\n<\/span><span class=\"cbb-line\">\t&lt;!-- \/wp:query --&gt;\n<\/span><span class=\"cbb-line\">&lt;\/main&gt;\n<\/span><span class=\"cbb-line\">&lt;!-- \/wp:group --&gt;\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">&lt;!-- wp:template-part {\"slug\":\"footer\",\"tagName\":\"footer\"} \/--&gt;<\/span><\/code><\/pre><\/figure>\n\n\n<p>Template parts are referenced by slug. The attribute <code>theme<\/code> is deliberately missing. The render function of the Template Part block falls back to <code>get_stylesheet()<\/code>, the active theme. If a parent theme hard-coded its own slug there, the lookup would no longer match once a child theme is active, and the part would render as an empty string. Leaving the attribute out is what allows a child theme to replace the part.<\/p>\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">&lt;!-- wp:group {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\"}} --&gt;\n<\/span><span class=\"cbb-line\">&lt;div class=\"wp-block-group\"&gt;\n<\/span><span class=\"cbb-line\">\t&lt;!-- wp:site-title \/--&gt;\n<\/span><span class=\"cbb-line\">\t&lt;!-- wp:navigation \/--&gt;\n<\/span><span class=\"cbb-line\">&lt;\/div&gt;\n<\/span><span class=\"cbb-line\">&lt;!-- \/wp:group --&gt;<\/span><\/code><\/pre><\/figure>\n\n\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">&lt;!-- wp:group {\"layout\":{\"type\":\"constrained\"}} --&gt;\n<\/span><span class=\"cbb-line\">&lt;div class=\"wp-block-group\"&gt;\n<\/span><span class=\"cbb-line\">\t&lt;!-- wp:pattern {\"slug\":\"lw-base\/footer-credits\"} \/--&gt;\n<\/span><span class=\"cbb-line\">&lt;\/div&gt;\n<\/span><span class=\"cbb-line\">&lt;!-- \/wp:group --&gt;<\/span><\/code><\/pre><\/figure>\n\n\n<p>The footer does not contain its own text but loads a pattern. Pattern files in <code>patterns\/<\/code> are registered automatically on <code>init<\/code>, provided the file header has at least a <code>Title<\/code> and a <code>Slug<\/code>; core rejects files without them with a <code>_doing_it_wrong()<\/code> notice. Because the file is PHP, texts can be translated with the theme\u2019s text domain, which is not possible in a plain HTML template.<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"php\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">PHP<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-php\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-meta\">&lt;?php<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\">\/**<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Title: Footer credits<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Slug: lw-base\/footer-credits<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Categories: footer<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Block Types: core\/template-part\/footer<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * Description: Short credit line for the site footer.<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> *<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> * @package lw-base<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"> *\/<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-meta\">?&gt;<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\">&lt;!-- wp:paragraph {\"fontSize\":\"small\"} --&gt;<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-punct\">&lt;<\/span><span class=\"cbb-tag\">p<\/span> <span class=\"cbb-attr\">class<\/span><span class=\"cbb-punct\">=<\/span><span class=\"cbb-string\">\"has-small-font-size\"<\/span><span class=\"cbb-punct\">&gt;<\/span><span class=\"cbb-meta\">&lt;?php<\/span> <span class=\"cbb-function\">esc_html_e<\/span>( <span class=\"cbb-string\">'Published with a block theme.'<\/span>, <span class=\"cbb-string\">'lw-base'<\/span> ); <span class=\"cbb-meta\">?&gt;<\/span><span class=\"cbb-punct\">&lt;\/<\/span><span class=\"cbb-tag\">p<\/span><span class=\"cbb-punct\">&gt;<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\">&lt;!-- \/wp:paragraph --&gt;<\/span><\/span><\/code><\/pre><\/figure>\n\n\n<p>A style variation is a partial <code>theme.json<\/code> in <code>styles\/<\/code>. It only contains what differs from the main file. When a user selects it in the Site Editor, the Theme Handbook explains that its data is copied into the database as a user customization. Later updates of the variation file therefore do not reach sites that have already saved it.<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"json\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JSON<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-json\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">{\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"$schema\"<\/span>: <span class=\"cbb-string\">\"https:\/\/schemas.wp.org\/wp\/7.1\/theme.json\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"version\"<\/span>: <span class=\"cbb-number\">3<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"title\"<\/span>: <span class=\"cbb-string\">\"Night\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"settings\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"color\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"palette\"<\/span>: &#91;\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"base\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#0a0e14\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Base\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"contrast\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#e5e7eb\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Contrast\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"accent\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#38bdf8\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Accent\"<\/span> }\n<\/span><span class=\"cbb-line\">\t\t\t&#93;\n<\/span><span class=\"cbb-line\">\t\t}\n<\/span><span class=\"cbb-line\">\t}\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n\n\n<h2>What the Site Editor writes to the database<\/h2>\n<p>As long as nobody edits anything, WordPress reads the theme files directly. When a template is saved in the Site Editor, core stores the complete block markup as a post. Three post types are involved: <code>wp_template<\/code> for templates, <code>wp_template_part<\/code> for template parts and <code>wp_global_styles<\/code> for changes to global styles, including a selected style variation. The <code>post_name<\/code> of a template post is the template slug, for example <code>index<\/code> or <code>single<\/code>.<\/p>\n<p>What ties these posts to a theme is the taxonomy <code>wp_theme<\/code>. Its term is the stylesheet, meaning the folder name of the active theme. With a child theme active, that is the child\u2019s folder name, not the parent\u2019s. <code>get_block_templates()<\/code> queries only posts whose term equals <code>get_stylesheet()<\/code>. Template parts additionally carry a term of the taxonomy <code>wp_template_part_area<\/code>. Internally, each template has the ID <code>stylesheet\/\/slug<\/code>, for example <code>lw-child\/\/index<\/code>.<\/p>\n<p>The consequence is simple: a stored template wins over the file of the same slug. In <code>get_block_templates()<\/code>, the database result is fetched first, and its slugs are then passed as <code>slug__not_in<\/code> to the file lookup, so the theme file is no longer considered at all. Changes to <code>templates\/index.html<\/code> made later by a theme update stay invisible until the customization is removed. The REST controller for templates only allows deleting templates whose source is <code>custom<\/code>; for a template based on a theme file, deleting the post restores the file version. To find out which customizations exist on a site, WP-CLI helps:<\/p>\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\"># Which templates, template parts and global styles live in the database?<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">wp<\/span> post list <span class=\"cbb-attr\">--post_type<\/span>=wp_template,wp_template_part,wp_global_styles <span class=\"cbb-attr\">--post_status<\/span>=any <span class=\"cbb-attr\">--fields<\/span>=ID,post_type,post_name,post_modified\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Which theme (stylesheet) does a customization belong to? 123 = an ID from the list above.<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">wp<\/span> post term list <span class=\"cbb-number\">123<\/span> wp_theme <span class=\"cbb-attr\">--fields<\/span>=name<\/span><\/code><\/pre><\/figure>\n\n\n<p>Because the query filters by the stylesheet term, a theme switch makes these posts inactive rather than removing them: they stay in the database under the old term and apply again once that theme is reactivated. The Site Editor export, implemented in <code>wp_generate_block_templates_export_file()<\/code>, writes a ZIP containing the theme files, the current templates and parts, and a <code>theme.json<\/code> in which the theme data and the user data are merged.<\/p>\n<h2>Template resolution: database, child theme, parent theme, fallback<\/h2>\n<p>The template hierarchy of block themes is the same as for classic themes; the Theme Handbook only notes that HTML files replace PHP files. For a single post, WordPress builds a list of candidate slugs such as <code>single-post-hello-world<\/code>, <code>single-post<\/code>, <code>single<\/code>, <code>singular<\/code> and <code>index<\/code>. <code>locate_block_template()<\/code> passes this list to <code>resolve_block_template()<\/code>, which in turn calls <code>get_block_templates()<\/code> with all candidate slugs and then sorts the results by their position in the hierarchy.<\/p>\n<p>For each slug, the sources are consulted in a fixed order. First comes a <code>wp_template<\/code> post for the active stylesheet. Next, <code>_get_block_templates_files()<\/code> reads the child theme\u2019s <code>templates\/<\/code> folder before the parent\u2019s; a slug already found in the child is skipped in the parent. After that come templates that plugins register with <code>register_block_template()<\/code>, available since WordPress 6.7, but only if no theme file with the same slug exists. WordPress itself ships no HTML templates for themes, so the actual core fallback is the next, less specific slug in the hierarchy, ending with <code>index.html<\/code>.<\/p>\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/wp-block-theme-en.png?v=20260930\" width=\"1120\" height=\"580\" alt=\"Template resolution in a block theme: for each slug from single-post-{slug} down to index, WordPress checks the database, child theme, parent theme and plugin registry in that order; template-canvas.php renders the first hit, index.html is the last fallback, and template parts follow the same order\">\n<figcaption>Per slug: database before child theme before parent theme before plugin registry; no hit means the next, less specific slug<\/figcaption>\n<\/figure>\n<p>The most specific slug always wins, regardless of its source. A <code>single.html<\/code> in the parent therefore beats an <code>index.html<\/code> customized in the Site Editor, because <code>single<\/code> comes before <code>index<\/code> in the hierarchy. The source order only decides between entries of the same slug. Template parts follow the same pattern: the render function of the Template Part block first looks for a <code>wp_template_part<\/code> post, then calls <code>get_block_file_template()<\/code>, which in turn uses <code>_get_block_template_file()<\/code> to search the stylesheet directory before the template directory.<\/p>\n<p>The found block markup is rendered through <code>wp-includes\/template-canvas.php<\/code>. For logged-in users, an empty stored template leads to a notice with a link to the Site Editor since 6.8; visitors instead see the content of the theme file, if there is one.<\/p>\n<h2>A child theme for a block theme<\/h2>\n<p>The only file a child theme strictly needs is <code>style.css<\/code> with a <code>Template<\/code> header. According to the Theme Handbook, its value must match the folder name of the parent theme exactly. The example child theme adds its own palette and a modified header.<\/p>\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">lw-child\/\n<\/span><span class=\"cbb-line\">\u251c\u2500\u2500 style.css\n<\/span><span class=\"cbb-line\">\u251c\u2500\u2500 theme.json\n<\/span><span class=\"cbb-line\">\u2514\u2500\u2500 parts\/\n<\/span><span class=\"cbb-line\">    \u2514\u2500\u2500 header.html<\/span><\/code><\/pre><\/figure>\n\n\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">\/*\n<\/span><span class=\"cbb-line\">Theme Name: LW Child\n<\/span><span class=\"cbb-line\">Template: lw-base\n<\/span><span class=\"cbb-line\">Description: Child theme of LW Base with its own palette and header.\n<\/span><span class=\"cbb-line\">Version: 1.0.0\n<\/span><span class=\"cbb-line\">Requires at least: 6.6\n<\/span><span class=\"cbb-line\">Tested up to: 7.1\n<\/span><span class=\"cbb-line\">Requires PHP: 7.4\n<\/span><span class=\"cbb-line\">License: GNU General Public License v2 or later\n<\/span><span class=\"cbb-line\">License URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n<\/span><span class=\"cbb-line\">Text Domain: lw-child\n<\/span><span class=\"cbb-line\">*\/<\/span><\/code><\/pre><\/figure>\n\n\n<p>The child theme needs no <code>templates\/index.html<\/code> of its own. <code>WP_Theme::get_file_path()<\/code> searches the stylesheet directory first and then the template directory, so <code>is_block_theme()<\/code> finds the parent\u2019s file and treats the child as a block theme too. Everything that is missing in the child is taken from the parent: templates, template parts, patterns and style variations.<\/p>\n<p>Overriding works per item. A file with the same name in <code>templates\/<\/code> or <code>parts\/<\/code> replaces the parent\u2019s version. For patterns, the decisive factor in <code>_register_theme_block_patterns()<\/code> is not the file name but the <code>Slug<\/code> in the header: the child\u2019s patterns are registered first, and a parent pattern with an already registered slug is skipped. For style variations, <code>get_style_variations()<\/code> compares file names in both <code>styles\/<\/code> folders and keeps only the child\u2019s file on a match. The replaced header in the child looks like this:<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">&lt;!-- wp:group {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\"}} --&gt;\n<\/span><span class=\"cbb-line\">&lt;div class=\"wp-block-group\"&gt;\n<\/span><span class=\"cbb-line\">\t&lt;!-- wp:group {\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} --&gt;\n<\/span><span class=\"cbb-line\">\t&lt;div class=\"wp-block-group\"&gt;\n<\/span><span class=\"cbb-line\">\t\t&lt;!-- wp:site-title \/--&gt;\n<\/span><span class=\"cbb-line\">\t\t&lt;!-- wp:site-tagline \/--&gt;\n<\/span><span class=\"cbb-line\">\t&lt;\/div&gt;\n<\/span><span class=\"cbb-line\">\t&lt;!-- \/wp:group --&gt;\n<\/span><span class=\"cbb-line\">\t&lt;!-- wp:navigation \/--&gt;\n<\/span><span class=\"cbb-line\">&lt;\/div&gt;\n<\/span><span class=\"cbb-line\">&lt;!-- \/wp:group --&gt;<\/span><\/code><\/pre><\/figure>\n\n\n<p>One practical detail follows from the stylesheet term. Customizations made in the Site Editor while the parent was active belong to the parent\u2019s stylesheet. After switching to the child theme, they no longer apply; the child starts from the files.<\/p>\n<h2>How parent and child theme.json are merged<\/h2>\n<p>Global settings and styles come from four origins, which <code>WP_Theme_JSON_Resolver::get_merged_data()<\/code> merges in a fixed order: <code>default<\/code> (core\u2019s own <code>theme.json<\/code>), <code>blocks<\/code> (data from block registrations), <code>theme<\/code> and <code>custom<\/code> (user data from the <code>wp_global_styles<\/code> post). Each later layer overrides the earlier ones. The code documentation gives the example of a background color for the Paragraph block set by both theme and user: the user preference wins.<\/p>\n<p>The <code>theme<\/code> layer itself consists of several parts. <code>get_theme_data()<\/code> first reads the active theme\u2019s <code>theme.json<\/code>, meaning the child\u2019s. If a parent exists and has a different <code>theme.json<\/code>, the resolver creates a <code>WP_Theme_JSON<\/code> object from the parent file and merges the child data into it; the source comment says the child takes precedence. Finally, this result is merged onto values from <code>add_theme_support()<\/code>, so <code>theme.json<\/code> beats theme supports.<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"json\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JSON<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-json\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">{\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"$schema\"<\/span>: <span class=\"cbb-string\">\"https:\/\/schemas.wp.org\/wp\/7.1\/theme.json\"<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"version\"<\/span>: <span class=\"cbb-number\">3<\/span>,\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"settings\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"color\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"palette\"<\/span>: &#91;\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"base\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#f4f6f9\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Base\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"contrast\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#111827\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Contrast\"<\/span> },\n<\/span><span class=\"cbb-line\">\t\t\t\t{ <span class=\"cbb-attr\">\"slug\"<\/span>: <span class=\"cbb-string\">\"accent\"<\/span>, <span class=\"cbb-attr\">\"color\"<\/span>: <span class=\"cbb-string\">\"#c2410c\"<\/span>, <span class=\"cbb-attr\">\"name\"<\/span>: <span class=\"cbb-string\">\"Accent\"<\/span> }\n<\/span><span class=\"cbb-line\">\t\t\t&#93;\n<\/span><span class=\"cbb-line\">\t\t}\n<\/span><span class=\"cbb-line\">\t},\n<\/span><span class=\"cbb-line\">\t<span class=\"cbb-attr\">\"styles\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t<span class=\"cbb-attr\">\"elements\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t<span class=\"cbb-attr\">\"heading\"<\/span>: {\n<\/span><span class=\"cbb-line\">\t\t\t\t<span class=\"cbb-attr\">\"typography\"<\/span>: { <span class=\"cbb-attr\">\"fontWeight\"<\/span>: <span class=\"cbb-string\">\"700\"<\/span> }\n<\/span><span class=\"cbb-line\">\t\t\t}\n<\/span><span class=\"cbb-line\">\t\t}\n<\/span><span class=\"cbb-line\">\t}\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n\n\n<p>The merge itself, <code>WP_Theme_JSON::merge()<\/code>, uses <code>array_replace_recursive()<\/code>, so nested objects are combined key by key. In the example, the parent\u2019s layout, typography and link color are preserved, while the child adds the heading weight.<\/p>\n<p>Presets are an exception: palettes, gradients, duotone filters, font sizes, font families and the other preset lists, such as spacing sizes and shadows, are replaced as whole lists. The child\u2019s palette replaces the parent\u2019s rather than extending it.<\/p>\n<p>That is why the child repeats all three slugs. If it listed only <code>accent<\/code>, the colors <code>base<\/code> and <code>contrast<\/code> would be missing, and every style that references them would lose its value. You can check the effective theme palette on a test installation:<\/p>\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap wp-block-code-beautifier-block-code\" data-lang=\"javascript\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JavaScript<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-javascript\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">wp eval <span class=\"cbb-string\">'echo wp_json_encode( wp_get_global_settings( array( \"color\", \"palette\", \"theme\" ), array( \"origin\" =&gt; \"base\" ) ), JSON_PRETTY_PRINT );'<\/span><\/span><\/code><\/pre><\/figure>\n\n\n<p>The option <code>\"origin\" =&gt; \"base\"<\/code> leaves out the user layer, so the output shows the merged result of parent and child only.<\/p>\n<h2>Limits and open points<\/h2>\n<ul>\n<li>The filter <code>wp_theme_json_data_theme<\/code> receives the child\u2019s data before the parent file is merged in. A callback that expects the complete theme data sees only the child part when a child theme is active.<\/li>\n<li>Hybrid setups with PHP templates follow additional rules. If <code>locate_template()<\/code> finds a PHP file, only block templates with equal or higher specificity are considered, and a PHP template in the child can take precedence over a block template of the same slug in the parent.<\/li>\n<li>The Theme Handbook says patterns in a child theme are overridden by a file with the same name; the 7.1 source compares slugs. This article follows the source code.<\/li>\n<li>Some Handbook pages still show <code>\"version\": 2<\/code> in their examples, while the reference documents version 3.<\/li>\n<li>The examples were tested on WordPress 7.1.2 on 30.09.2026: both themes activate without notices, the child counts as a block theme without its own <code>index.html<\/code>, the block markup validates in the Site Editor, and the template precedence, the effect of a theme switch and the palette replacement behave as described. <a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/wordpress-7-1-2-security-template-resolution\/\">The article on the WordPress 7.1.2 security fix for page templates<\/a> covers a related topic.<\/li>\n<\/ul>\n\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n\n<h3>Does a child theme of a block theme need its own templates\/index.html?<\/h3>\n<p>No. <code>WP_Theme::is_block_theme()<\/code> locates the file through <code>get_file_path()<\/code>, which checks the stylesheet directory first and the template directory second. The parent\u2019s <code>index.html<\/code> is enough for the child to count as a block theme as well. A separate file is only needed when the child actually changes that template.<\/p>\n\n<h3>Why does a changed template file have no effect after a theme update?<\/h3>\n<p>Usually a Site Editor customization exists for the same slug. It is stored as a <code>wp_template<\/code> (or <code>wp_template_part<\/code>) post in the database and takes precedence, so the file is not read at all. <code>wp post list --post_type=wp_template,wp_template_part<\/code> shows such entries. Only after the customization is removed does the file version apply again.<\/p>\n\n<h3>Does the child theme\u2019s color palette extend the parent\u2019s palette?<\/h3>\n<p>No, it replaces it. <code>WP_Theme_JSON::merge()<\/code> combines nested objects key by key, but presets such as palettes, gradients, font sizes and font families are taken over as a complete list. The child therefore has to list every color that should remain available, including the unchanged ones.<\/p>\n<\/div>\n\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/themes\/templates\/introduction-to-templates\/\" target=\"_blank\" rel=\"noopener noreferrer\">Theme Handbook: Introduction to templates<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/themes\/templates\/template-parts\/\" target=\"_blank\" rel=\"noopener noreferrer\">Theme Handbook: Template parts<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/themes\/patterns\/registering-patterns\/\" target=\"_blank\" rel=\"noopener noreferrer\">Theme Handbook: Registering patterns<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/themes\/global-settings-and-styles\/style-variations\/\" target=\"_blank\" rel=\"noopener noreferrer\">Theme Handbook: Style variations<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/themes\/advanced-topics\/child-themes\/\" target=\"_blank\" rel=\"noopener noreferrer\">Theme Handbook: Child themes<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/themes\/basics\/template-hierarchy\/\" target=\"_blank\" rel=\"noopener noreferrer\">Theme Handbook: Template hierarchy<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/themes\/core-concepts\/main-stylesheet\/\" target=\"_blank\" rel=\"noopener noreferrer\">Theme Handbook: Main stylesheet (style.css)<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/theme-json-reference\/theme-json-living\/\" target=\"_blank\" rel=\"noopener noreferrer\">Block Editor Handbook: Theme.json version 3 reference<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/themes\/global-settings-and-styles\/\" target=\"_blank\" rel=\"noopener noreferrer\">Block Editor Handbook: Global settings and styles (theme.json)<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/make.wordpress.org\/core\/2024\/06\/19\/theme-json-version-3\/\" target=\"_blank\" rel=\"noopener noreferrer\">Make WordPress Core: Theme.json version 3<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/schemas.wp.org\/wp\/7.1\/theme.json\" target=\"_blank\" rel=\"noopener noreferrer\">JSON schema theme.json for WordPress 7.1<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.1\/src\/wp-includes\/class-wp-theme-json-resolver.php\" target=\"_blank\" rel=\"noopener noreferrer\">wordpress-develop 7.1: class-wp-theme-json-resolver.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.1\/src\/wp-includes\/class-wp-theme-json.php\" target=\"_blank\" rel=\"noopener noreferrer\">wordpress-develop 7.1: class-wp-theme-json.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.1\/src\/wp-includes\/block-template-utils.php\" target=\"_blank\" rel=\"noopener noreferrer\">wordpress-develop 7.1: block-template-utils.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.1\/src\/wp-includes\/block-template.php\" target=\"_blank\" rel=\"noopener noreferrer\">wordpress-develop 7.1: block-template.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.1\/src\/wp-includes\/blocks\/template-part.php\" target=\"_blank\" rel=\"noopener noreferrer\">wordpress-develop 7.1: blocks\/template-part.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.1\/src\/wp-includes\/block-patterns.php\" target=\"_blank\" rel=\"noopener noreferrer\">wordpress-develop 7.1: block-patterns.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.1\/src\/wp-includes\/class-wp-theme.php\" target=\"_blank\" rel=\"noopener noreferrer\">wordpress-develop 7.1: class-wp-theme.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/wordpress-develop\/blob\/7.1\/src\/wp-includes\/rest-api\/endpoints\/class-wp-rest-templates-controller.php\" target=\"_blank\" rel=\"noopener noreferrer\">wordpress-develop 7.1: class-wp-rest-templates-controller.php<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/post\/list\/\" target=\"_blank\" rel=\"noopener noreferrer\">WP-CLI: wp post list<\/a> (retrieved 29.09.2026)<\/li>\n<li><a href=\"https:\/\/api.wordpress.org\/core\/version-check\/1.7\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress.org version-check API (current release)<\/a> (retrieved 29.09.2026)<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>A minimal block theme and a child theme, built step by step: which template WordPress renders, where the Site Editor stores changes and how theme.json files merge.<\/p>\n","protected":false},"author":1,"featured_media":20917,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[92757,91096],"class_list":["post-20869","post","type-post","status-publish","format-standard","hentry","category-wordpress-plugins-tricks","tag-web-development","tag-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Block themes with theme.json: templates, parts and child themes | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Block theme with theme.json v3, templates, parts, a pattern and a child theme: template resolution order and how parent and child theme.json merge.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Block themes with theme.json: templates, parts and child themes | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Block theme with theme.json v3, templates, parts, a pattern and a child theme: template resolution order and how parent and child theme.json merge.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-23T08:08:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20869-block-themes-theme-json.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Block themes with theme.json: templates, parts and child themes\",\"datePublished\":\"2026-10-23T08:08:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/\"},\"wordCount\":2351,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20869-block-themes-theme-json.png\",\"keywords\":[\"Web Development\",\"WordPress\"],\"articleSection\":[\"WordPress Plugins &amp; Tricks\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/\",\"name\":\"Block themes with theme.json: templates, parts and child themes | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20869-block-themes-theme-json.png\",\"datePublished\":\"2026-10-23T08:08:00+00:00\",\"description\":\"Block theme with theme.json v3, templates, parts, a pattern and a child theme: template resolution order and how parent and child theme.json merge.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20869-block-themes-theme-json.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/fi-20869-block-themes-theme-json.png\",\"width\":1200,\"height\":630,\"caption\":\"Block themes with theme.json: templates, parts and child themes\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/wordpress-plugins-tricks\\\/block-themes-theme-json\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Block themes with theme.json: templates, parts and child themes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Block themes with theme.json: templates, parts and child themes | Lukas Wojcik","description":"Block theme with theme.json v3, templates, parts, a pattern and a child theme: template resolution order and how parent and child theme.json merge.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/","og_locale":"en_US","og_type":"article","og_title":"Block themes with theme.json: templates, parts and child themes | Lukas Wojcik","og_description":"Block theme with theme.json v3, templates, parts, a pattern and a child theme: template resolution order and how parent and child theme.json merge.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-23T08:08:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20869-block-themes-theme-json.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Block themes with theme.json: templates, parts and child themes","datePublished":"2026-10-23T08:08:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/"},"wordCount":2351,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20869-block-themes-theme-json.png","keywords":["Web Development","WordPress"],"articleSection":["WordPress Plugins &amp; Tricks"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/","name":"Block themes with theme.json: templates, parts and child themes | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20869-block-themes-theme-json.png","datePublished":"2026-10-23T08:08:00+00:00","description":"Block theme with theme.json v3, templates, parts, a pattern and a child theme: template resolution order and how parent and child theme.json merge.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20869-block-themes-theme-json.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/fi-20869-block-themes-theme-json.png","width":1200,"height":630,"caption":"Block themes with theme.json: templates, parts and child themes"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/wordpress-plugins-tricks\/block-themes-theme-json\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Block themes with theme.json: templates, parts and child themes"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=20869"}],"version-history":[{"count":2,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20869\/revisions"}],"predecessor-version":[{"id":22799,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20869\/revisions\/22799"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/20917"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=20869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}