<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">palette</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">&#91;</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">slug</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;primary&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;#0073aa&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">name</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;Primary&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">slug</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;base&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;#ffffff&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">name</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;Base&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">slug</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;contrast&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;#333333&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">name</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;Contrast&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&#93;</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">typography</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">fontSizes</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">&#91;</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">slug</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;medium&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">size</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;18px&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">name</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;Medium&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&#93;</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">styles</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">background</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;var:preset|color|base&quot;</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">text</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;var:preset|color|contrast&quot;</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">typography</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">fontSize</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;var:preset|font-size|medium&quot;</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">lineHeight</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;1.6&quot;</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">elements</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">link</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">text</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;var:preset|color|primary&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">heading</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">typography</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">fontWeight</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;700&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">blocks</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">core/button</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">border</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">radius</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;4px&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">background</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;var:preset|color|primary&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">core/quote</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">typography</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">fontStyle</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;italic&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #797593;">}</span></span></code></pre></div>



<p class="wp-block-paragraph">This token-based approach pays off in a few ways. When a user changes &#8220;Primary&#8221; in the Global Styles UI, every element referencing that token updates automatically. It keeps your theme internally consistent — no risk of one button being <code>#0073aa</code> while another drifted to <code>#0074ab</code>. And it makes global style variations far simpler to create: a dark mode variation only needs to redefine the palette, not hunt down every color reference in styles. Either approach is valid, but tokens tend to save time as a theme matures.</p>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li><strong>Automatic integration with the Global Styles UI:</strong> Users can view and override your styles in the Site Editor without writing CSS.</li>



<li><strong>WordPress manages specificity for you:</strong> the &#8220;base → theme → user&#8221; cascade works correctly.</li>



<li><strong>Generates CSS custom properties automatically</strong> (e.g. <code>--wp--preset--color--primary</code>).</li>



<li><strong>Visual parity</strong> between editor and front end.</li>



<li><strong>Machine-readable: </strong>other tools and plugins can consume and extend these styles.</li>



<li><strong>Reduces the amount of CSS</strong> enqueued overall.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Can only express what <a href="https://schemas.wp.org/trunk/theme.json.">theme.json&#8217;s schema</a> supports (growing with each release, but not yet comprehensive).</li>



<li>Pseudo-classes like <code>:hover</code>, <code>:focus</code>, <code>:active</code>, and <code>:visited</code> are supported for elements such as links and buttons (e.g., <code>"elements": { "link": { ":hover": { "color": { "text": "var:preset|color|contrast" } } } }</code>), but pseudo-elements like <code>::before</code> and <code>::after</code>, media queries, and more complex selectors are not available in the structured properties — use the <code>css</code> property (#2) or block stylesheets (#3) for those.</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li><a href="https://developer.wordpress.org/themes/global-settings-and-styles/">Global Settings and Styles (theme.json)</a></li>



<li><a href="https://developer.wordpress.org/news/2024/10/mastering-theme-json-you-might-not-need-css/">Mastering theme.json: You might not need CSS</a></li>



<li><a href="https://developer.wordpress.org/themes/global-settings-and-styles/styles/using-presets/">Using Presets</a></li>



<li><a href="https://developer.wordpress.org/themes/global-settings-and-styles/styles/styles-reference/">Styles Reference</a></li>
</ul>



<h2 class="wp-block-heading" id="2-theme-json-the-css-property">2. theme.json — The <code>css</code> Property </h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Theme developers<br /><strong>Where:</strong> <code>theme.json</code> → <code>styles.css</code> (global) or <code>styles.blocks.[blockname].css</code> (per-block)</p>



<p class="wp-block-paragraph">When theme.json&#8217;s structured properties aren&#8217;t enough, you can drop to raw CSS strings within theme.json itself. Available since WordPress 6.2.</p>



<h3 class="wp-block-heading" id="global-custom-css">Global custom CSS</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>JSON</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">{
  "version": 3,
  "styles": {
    "css": ".my-custom-class { opacity: 0.8; } body { scroll-behavior: smooth; }"
  }
}</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">version</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #D7827E;">3</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">styles</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">css</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;.my-custom-class { opacity: 0.8; } body { scroll-behavior: smooth; }&quot;</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #797593;">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="per-block-custom-css">Per-block custom CSS</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>JSON</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">{
  "version": 3,
    "styles": {    
       "blocks": {
          "core/image": {
              "css": "&amp; img { border-radius: 8px; transition: transform 0.3s; } &amp;:hover img { transform: scale(1.02); }"
              },     
          "core/post-title": {
              "css": "letter-spacing: 1px;"
             },
         "core/paragraph": {       
              "css": "&amp;.has-background { padding: .5rem .8rem; }"
           }
        }
    }
}</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">version</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #D7827E;">3</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">styles</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span><span style="color: #575279;">    </span></span>
<span class="line"><span style="color: #575279;">       </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">blocks</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">          </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">core/image</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">              </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">css</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;&amp; img { border-radius: 8px; transition: transform 0.3s; } &amp;:hover img { transform: scale(1.02); }&quot;</span></span>
<span class="line"><span style="color: #575279;">              </span><span style="color: #797593;">},</span><span style="color: #575279;">     </span></span>
<span class="line"><span style="color: #575279;">          </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">core/post-title</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">              </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">css</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;letter-spacing: 1px;&quot;</span></span>
<span class="line"><span style="color: #575279;">             </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">         </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">core/paragraph</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span><span style="color: #575279;">       </span></span>
<span class="line"><span style="color: #575279;">              </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">css</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;&amp;.has-background { padding: .5rem .8rem; }&quot;</span></span>
<span class="line"><span style="color: #575279;">           </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #797593;">}</span></span></code></pre></div>



<p class="wp-block-paragraph">WordPress auto-generates the selector for per-block CSS—you don&#8217;t need to know the block&#8217;s class name. The <code>&amp;</code> selector is supported for targeting nested elements and pseudo-selectors (<code>:before</code>, <code>:after</code>, <code>:hover</code>, <code>:not()</code>, etc.).</p>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Integrates with the Styles interface in the Site Editor — users can see and modify your per-block CSS under Styles → Blocks → [Block] → Advanced → Additional CSS.</li>



<li>WordPress handles the selector, so you avoid specificity conflicts.</li>



<li>CSS from elements and variations is also supported (from WordPress 6.6).</li>



<li>Provides a bridge between structured theme.json properties and full CSS freedom.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>JSON doesn&#8217;t support line breaks, so everything must be on one line — cumbersome for large blocks of CSS.</li>



<li>No syntax highlighting in JSON files.</li>



<li>Best for small, targeted additions — for anything extensive, use block stylesheets instead.</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li><a href="https://make.wordpress.org/core/2023/03/06/custom-css-for-global-styles-and-per-block/">Custom CSS for global styles and per block</a></li>
</ul>



<h2 class="wp-block-heading" id="3-custom-css-properties-variables-via-theme-json-settings">3. Custom CSS Properties (Variables) via theme.json Settings</h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Theme developers<br /><strong>Where:</strong> <code>theme.json</code> → <code>settings.custom</code></p>



<p class="wp-block-paragraph">Create your own CSS custom properties that can be used anywhere in your CSS—in stylesheets, block stylesheets, or even within the <code>css</code> property.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>JSON</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">{
  "version": 3,
  "settings": {
    "custom": {
      "contentMaxWidth": "800px",
      "spacing": {
        "gutter": "2rem"
      },
      "transition": "all 0.3s ease"
    }
  }
}</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">version</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #D7827E;">3</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">settings</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">custom</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">contentMaxWidth</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;800px&quot;</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">spacing</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">gutter</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;2rem&quot;</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">transition</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;all 0.3s ease&quot;</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #797593;">}</span></span></code></pre></div>



<p class="wp-block-paragraph">This generates:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>JSON</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">body {
  --wp--custom--content-max-width: 800px;
  --wp--custom--spacing--gutter: 2rem;
  --wp--custom--transition: all 0.3s ease;
}</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #575279;">body </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #B4637A;">--wp--custom--content-max-width</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #D7827E;">800</span><span style="color: #B4637A;">px;</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #B4637A;">--wp--custom--spacing--gutter:</span><span style="color: #575279;"> </span><span style="color: #D7827E;">2</span><span style="color: #B4637A;">rem;</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #B4637A;">--wp--custom--transition:</span><span style="color: #575279;"> </span><span style="color: #B4637A;">all</span><span style="color: #575279;"> </span><span style="color: #D7827E;">0.3</span><span style="color: #B4637A;">s</span><span style="color: #575279;"> </span><span style="color: #B4637A;">ease;</span></span>
<span class="line"><span style="color: #797593;">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Centralized design tokens accessible from any CSS source.</li>



<li>Automatic generation of CSS custom properties following WordPress naming conventions.</li>



<li>Changes propagate everywhere the variable is used.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Only generates the variables — you still need to reference them in your CSS.</li>



<li>Not directly editable by users in the Site Editor UI (unlike presets for colors or font sizes).</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li><a href="https://developer.wordpress.org/news/2023/08/adding-and-using-custom-settings-in-theme-json/">Adding and using custom settings in theme.json</a></li>
</ul>



<h2 class="wp-block-heading" id="4-child-theme-s-theme-json">4. Child Theme&#8217;s <code>theme.json</code></h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Developers customizing a parent theme<br /><strong>Where:</strong> <code>theme.json</code> in the child theme root</p>



<p class="wp-block-paragraph">Override or extend the parent theme&#8217;s <code>theme.json</code> with a child theme. WordPress merges both files automatically.</p>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>All changes survive parent theme updates.</li>



<li>Full access to every theme.json capability — structured properties, css property, presets, and settings.</li>



<li>Combined with block stylesheets and style.css, it provides a complete override system.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Requires maintaining a child theme.</li>



<li>Merging behavior can be tricky: child values override parent values at the same path but won&#8217;t remove parent values at other paths.</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li>Theme Handbook: <a href="https://developer.wordpress.org/themes/advanced-topics/child-themes/">Child Themes</a></li>
</ul>



<h2 class="wp-block-heading" id="5-global-styles-ui">5. Global Styles UI </h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Site owners, content editors (no code required)<br /><strong>Where:</strong> <strong>Appearance → Editor → Styles</strong></p>



<p class="wp-block-paragraph">The visual interface for customizing your site&#8217;s appearance. Users can adjust typography, colors, spacing, and layout for the entire site, individual elements, or specific block types — all without writing any code.</p>



<figure class="wp-block-image size-full"><img alt="" class="wp-image-44500" height="569" src="https://i0.wp.com/gutenbergtimes.com/wp-content/uploads/2026/02/Screenshot-2026-02-24-at-18.40.45.png?resize=652%2C569&#038;ssl=1" width="652" /></figure>



<p class="wp-block-paragraph">The <strong>Style Book</strong> helps you keep the overall context for your styles and you and double-check on how blocks behave when Styles change. </p>



<figure class="wp-block-image size-large"><img alt="" class="wp-image-44499" height="334" src="https://i0.wp.com/gutenbergtimes.com/wp-content/uploads/2026/02/Screenshot-2026-02-24-at-18.38.39.png?resize=652%2C334&#038;ssl=1" width="652" /></figure>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>No code required — fully visual.</li>



<li>Highest specificity: user styles override theme defaults.</li>



<li>Changes are stored in the database (<code>wp_global_styles</code> post type), separate from theme files, so they survive theme updates.</li>



<li>Supports global style variations — users can switch between whole-site style presets.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Limited to what the UI controls expose (which grows with each WordPress release).</li>



<li>For anything the UI can&#8217;t handle, users fall back to the Additional CSS options below.</li>
</ul>



<h2 class="wp-block-heading" id="6-additional-css">6. Additional CSS </h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Site owners with CSS knowledge<br /><strong>Where:</strong> Appearance → Editor → Styles → three-dot menu (⋮) → Additional CSS</p>



<p class="wp-block-paragraph">This is the block theme replacement for the classic Customizer&#8217;s Additional CSS panel. A free-form CSS editor for site-wide custom styles.</p>





<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Free-form CSS handles any valid CSS.</li>



<li>Stored in the database as part of Global Styles (not in theme files), so it&#8217;s theme-specific but survives code deployments.</li>



<li>Preview changes before saving.</li>



<li>Revision history (last 25 versions).</li>



<li>Higher specificity than theme styles.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Not scoped to blocks — loads globally.</li>



<li>No syntax highlighting or code formatting.</li>



<li>Intended as a last resort for styles that can&#8217;t be achieved through theme.json or the visual Styles interface.</li>
</ul>



<h2 class="wp-block-heading" id="7-per-block-additional-css">7. Per-Block Additional CSS </h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Site owners with CSS knowledge<br /><strong>Where:</strong> Appearance → Editor → Styles → Blocks → select a block → scroll to Advanced → Additional CSS</p>



<p class="wp-block-paragraph">Target CSS to a specific block type site-wide. WordPress auto-generates the selector — you just write the CSS properties.</p>



<figure class="wp-block-video wp-block-embed is-type-video is-provider-videopress"><div class="wp-block-embed__wrapper">

</div></figure>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>CSS</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">/* Example: added to Styles → Blocks → Quote → Additional CSS */
font-style: italic;
border-left: 4px solid currentColor;
padding-left: 1.5em;</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #797593; font-style: italic;">/*</span><span style="color: #9893A5; font-style: italic;"> Example: added to Styles → Blocks → Quote → Additional CSS </span><span style="color: #797593; font-style: italic;">*/</span></span>
<span class="line"><span style="color: #56949F;">font-style</span><span style="color: #575279;">: italic;</span></span>
<span class="line"><span style="color: #56949F;">border-left</span><span style="color: #575279;">: 4px solid currentColor;</span></span>
<span class="line"><span style="color: #56949F;">padding-left</span><span style="color: #575279;">: 1.5em;</span></span></code></pre></div>



<p class="wp-block-paragraph">The <code>&amp;</code> selector works here for nested elements and pseudo-selectors.</p>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Scoped to a specific block type — only loads when that block is present on a page.</li>



<li>No need to know CSS selectors — WordPress handles them.</li>



<li>User-level styles (highest priority in the cascade).</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Media queries may not work reliably (as of 2025). Use CSS functions like <code>clamp()</code>, <code>min()</code>, and <code>max()</code> for responsive behavior, or put responsive styles in theme-level CSS.</li>



<li>Small text area with no code formatting.</li>
</ul>



<h2 class="wp-block-heading" id="8-additional-css-class-es-on-individual-block-instances">8. Additional CSS Class(es) on individual block instances</h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Content editors with CSS knowledge<br /><strong>Where:</strong> Select any block in the editor → Settings sidebar → Advanced → Additional CSS Class(es)</p>



<p class="wp-block-paragraph">Add custom class names to a specific block instance. The CSS itself must be defined elsewhere (style.css, block stylesheets, Additional CSS, etc.). As a user the global Additional CSS is probably the most practical place. </p>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Precision targeting of individual block instances rather than all blocks of a type.</li>



<li>Perfect for one-off styling: a highlighted paragraph, a special call to action, etc.</li>



<li>Multiple classes can be added, separated by spaces.</li>



<li>Works with any CSS source — just define the class styles somewhere.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Only adds class names — you still need to write the CSS elsewhere.</li>



<li>Per-instance, which means it doesn&#8217;t scale well for repeated patterns (use block style variations for those).</li>
</ul>



<h2 class="wp-block-heading" id="9-global-style-variations-theme-level-style-presets">9. Global Style Variations (Theme-Level Style Presets)</h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Theme developers<br /><strong>Where:</strong> JSON files in the theme&#8217;s <code>/styles</code> directory (at the top level, not in a <code>/blocks</code> subfolder)</p>



<p class="wp-block-paragraph">Provide entire alternative site-wide style schemes. Each variation is a JSON partial that can override settings and styles from the main theme.json. </p>



<p class="wp-block-paragraph">Since WordPress 6.6, style variations are further classified into three subtypes based on their content. </p>



<p class="wp-block-paragraph">A variation file that defines only <code>settings.color</code> or <code>styles.color</code> is automatically recognized as a <strong>color variation</strong>, appearing under <strong>Styles → Colors → Palette. </strong></p>



<p class="wp-block-paragraph">One that defines only <code>settings.typography</code> or <code>styles.typography</code> becomes a <strong>typography variation</strong>, appearing under <strong>Styles → Typography → Presets. </strong></p>



<p class="wp-block-paragraph">Files that touch other properties remain full <strong>theme style variations</strong>. </p>



<p class="wp-block-paragraph">Color and typography variations can be mixed and matched with each other and with theme variations. </p>



<p class="wp-block-paragraph">To keep the <code>/styles</code> folder organized, it&#8217;s recommended to use subfolders (e.g., <code>/styles/color</code>, <code>/styles/typography</code>, <code>/styles/global</code>). </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>JSON</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">// /styles/dark-mode.json
{
  "$schema": "https://schemas.wp.org/trunk/theme.json",
  "version": 3,
  "title": "Dark Mode",
  "settings": {
    "color": {
      "palette": &#91;
        { "slug": "base", "color": "#1a1a2e", "name": "Base" },
        { "slug": "contrast", "color": "#e0e0e0", "name": "Contrast" }
      &#93;
    }
  },
  "styles": {
    "color": {
      "background": "#1a1a2e",
      "text": "#e0e0e0"
    }
  }
}</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #797593; font-style: italic;">//</span><span style="color: #9893A5; font-style: italic;"> /styles/dark-mode.json</span></span>
<span class="line"><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">$schema</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;https://schemas.wp.org/trunk/theme.json&quot;</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">version</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #D7827E;">3</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">title</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;Dark Mode&quot;</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">settings</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">palette</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">&#91;</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">slug</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;base&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;#1a1a2e&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">name</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;Base&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #797593;">{</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">slug</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;contrast&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;#e0e0e0&quot;</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">name</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;Contrast&quot;</span><span style="color: #575279;"> </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&#93;</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">},</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">styles</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">color</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">background</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;#1a1a2e&quot;</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">      </span><span style="color: #797593;">&quot;</span><span style="color: #56949F;">text</span><span style="color: #797593;">&quot;</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">&quot;#e0e0e0&quot;</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #575279;">  </span><span style="color: #797593;">}</span></span>
<span class="line"><span style="color: #797593;">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Users can switch between entire style schemes (light/dark, color themes, typographic variations) from the Styles panel.</li>



<li>Makes one theme feel like many — more versatile without requiring separate themes.</li>



<li>Fully declarative (no PHP).</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Only affects settings and styles — not templates or patterns.</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li><a href="https://developer.wordpress.org/themes/global-settings-and-styles/style-variations/">Style Variations</a></li>



<li><a href="https://developer.wordpress.org/news/2024/07/mixing-and-matching-styles-colors-and-typography-in-wordpress-6-6/">Mixing and matching styles, colors, and typography in WordPress 6.6</a></li>
</ul>



<h2 class="wp-block-heading" id="10-block-style-variations-json-php-and-javascript">10. Block Style Variations (JSON, PHP, and JavaScript)</h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Theme developers, plugin developers<br /><strong>Where:</strong> JSON files in <code>/styles</code>, PHP via <code>register_block_style()</code>, or JavaScript via <code>wp.blocks.registerBlockStyle()</code></p>



<p class="wp-block-paragraph">Block style variations give content creators pre-made styling options in the Styles panel — like &#8220;Rounded&#8221; or &#8220;Outline&#8221; on core blocks. You can register them via JSON files in <code>/styles</code> (WordPress 6.6+, no PHP needed), PHP with <code>register_block_style()</code>, or JavaScript. The JSON-based methods integrate with Global Styles so users can customize them in the Site Editor; <code>inline_style</code>, <code>style_handle</code>, and JavaScript methods do not.</p>



<p class="wp-block-paragraph">For a thorough walkthrough of all six registration methods — with code examples, a companion theme and plugin on GitHub, and a comparison table showing which methods support Global Styles — see the comprehensive guide <strong><a href="https://wordpress.com/blog/2025/05/07/custom-block-styles/">Mastering Custom Block Styles in WordPress: 6 Methods for Theme and Plugin Developers</a>.</strong></p>



<h2 class="wp-block-heading" id="11-section-styles">11. Section Styles </h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Theme developers<br /><strong>Where:</strong> JSON files in <code>/styles</code> directory, targeting mostly group or column blocks. </p>



<p class="wp-block-paragraph">Section styles are more of a convention than a separate feature. They are essentially Block Style Variations. The difference is naming the variation slug: <code>style-1</code>, <code>style-2</code>, etc. so that they can be reused across themes.</p>



<p class="wp-block-paragraph">Since WordPress 6.6, block style variations can style nested inner blocks and elements, enabling &#8220;section styling&#8221; — where a Group block&#8217;s style variation changes the appearance of all blocks within it.</p>



<p class="wp-block-paragraph">The Twenty Twenty Five theme showcases this convention quite nicely. </p>



		<figure class="wp-block-jetpack-videopress jetpack-videopress-player">
			<div class="jetpack-videopress-player__wrapper"> </div>
			
			
		</figure>
		


<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Apply coordinated styles to entire sections (background, text color, button colors, link colors) with a single click.</li>



<li>Users select the section style in the block&#8217;s Styles panel.</li>



<li>Powerful for creating consistent design sections (hero areas, dark sections, testimonials).</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Easy to overwhelm users with too many section style options — restraint is needed.</li>



<li>Requires careful design token architecture (using base/contrast/primary/secondary color naming).</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li><a href="https://make.wordpress.org/core/2024/06/24/section-styles/">Section Styles</a> (WordPress 6.6)</li>
</ul>



<h2 class="wp-block-heading" id="12-block-stylesheets-via-wp-enqueue-block-style">12. Block Stylesheets via <code>wp_enqueue_block_style()</code></h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Theme developers<br /><strong>Where:</strong> Separate <code>.css</code> files in your theme (e.g., <code>/assets/blocks/core-image.css</code>), registered in <code>functions.php</code></p>



<p class="wp-block-paragraph">This is the recommended approach when you have more CSS than what&#8217;s comfortable in theme.json&#8217;s <code>css</code> property.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>JSON</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">/* /assets/blocks/core-image.css */
.wp-block-image img {
    padding: 1rem;
    background: linear-gradient(-60deg, #ff5858, #f09819);
}</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #797593; font-style: italic;">/*</span><span style="color: #9893A5; font-style: italic;"> /assets/blocks/core-image.css </span><span style="color: #797593; font-style: italic;">*/</span></span>
<span class="line"><span style="color: #575279;">.wp-block-image img </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #B4637A;">padding</span><span style="color: #797593;">:</span><span style="color: #575279;"> </span><span style="color: #D7827E;">1</span><span style="color: #B4637A;">rem;</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #B4637A;">background:</span><span style="color: #575279;"> </span><span style="color: #B4637A;">linear-gradient(</span><span style="color: #D7827E;">-60</span><span style="color: #B4637A;">deg</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #B4637A;">#ff5858,</span><span style="color: #575279;"> </span><span style="color: #B4637A;">#f09819);</span></span>
<span class="line"><span style="color: #797593;">}</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>JSON</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">// functions.php
add_action( 'init', function() {
    wp_enqueue_block_style( 'core/image', array(
        'handle' => 'my-theme-image-styles',
        'src'    => get_theme_file_uri( 'assets/blocks/core-image.css' ),
        'path'   => get_theme_file_path( 'assets/blocks/core-image.css' ),
    ) );
});</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #797593; font-style: italic;">//</span><span style="color: #9893A5; font-style: italic;"> functions.php</span></span>
<span class="line"><span style="color: #575279;">add_action( 'init', function() </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #B4637A;">wp_enqueue_block_style(</span><span style="color: #575279;"> </span><span style="color: #B4637A;">'core/image',</span><span style="color: #575279;"> </span><span style="color: #B4637A;">array(</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #B4637A;">'handle'</span><span style="color: #575279;"> </span><span style="color: #B4637A;">=&gt;</span><span style="color: #575279;"> </span><span style="color: #B4637A;">'my-theme-image-styles',</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #B4637A;">'src'</span><span style="color: #575279;">    </span><span style="color: #B4637A;">=&gt;</span><span style="color: #575279;"> </span><span style="color: #B4637A;">get_theme_file_uri(</span><span style="color: #575279;"> </span><span style="color: #B4637A;">'assets/blocks/core-image.css'</span><span style="color: #575279;"> </span><span style="color: #B4637A;">),</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #B4637A;">'path'</span><span style="color: #575279;">   </span><span style="color: #B4637A;">=&gt;</span><span style="color: #575279;"> </span><span style="color: #B4637A;">get_theme_file_path(</span><span style="color: #575279;"> </span><span style="color: #B4637A;">'assets/blocks/core-image.css'</span><span style="color: #575279;"> </span><span style="color: #B4637A;">),</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #B4637A;">)</span><span style="color: #575279;"> </span><span style="color: #B4637A;">);</span></span>
<span class="line"><span style="color: #797593;">}</span><span style="color: #575279;">);</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li><strong>Performance:</strong> CSS only loads when the block is actually present on the page. WordPress inlines it in the <code>&lt;head&gt;</code> section</li>



<li>Full CSS syntax with syntax highlighting, multi-line formatting, and preprocessor support (Sass/SCSS).</li>



<li>Clean code organization — one file per block.</li>



<li>Works for any CSS, including media queries, animations, complex selectors, and pseudo-elements.</li>



<li>Applies in both the editor and front end.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Requires PHP registration in functions.php.</li>



<li>These styles aren&#8217;t exposed in the Global Styles UI for user editing.</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li><a href="https://developer.wordpress.org/themes/features/block-stylesheets/">Block Stylesheets</a></li>



<li><a href="https://developer.wordpress.org/news/2022/12/leveraging-theme-json-and-per-block-styles-for-more-performant-themes/">Leveraging theme.json and per-block styles for more performant themes</a></li>
</ul>



<h2 class="wp-block-heading" id="13-enqueuing-stylesheets-via-wp-enqueue-style-in-php">13. Enqueuing Stylesheets via <code>wp_enqueue_style()</code> in PHP</h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Theme and plugin developers<br /><strong>Where:</strong> <code>functions.php</code> using the <code>wp_enqueue_scripts</code> (front end) and <code>enqueue_block_editor_assets</code> (editor) hooks</p>



<p class="wp-block-paragraph">The traditional WordPress approach still works and is useful for loading third-party CSS libraries, fonts, or complex stylesheets. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>PHP</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">add_action( 'wp_enqueue_scripts', function() {
    wp_enqueue_style(
        'my-theme-custom',
        get_theme_file_uri( 'assets/css/custom.css' ),
        array(),
        '1.0.0'
    );
});

// For editor-only styles:
add_action( 'enqueue_block_editor_assets', function() {
    wp_enqueue_style(
        'my-theme-editor',
        get_theme_file_uri( 'assets/css/editor.css' ),
        array(),
        '1.0.0'
    );
});</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #D7827E;">add_action</span><span style="color: #797593;">(</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">'wp_enqueue_scripts'</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #286983;">function</span><span style="color: #797593;">()</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #D7827E;">wp_enqueue_style</span><span style="color: #797593;">(</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #EA9D34;">'my-theme-custom'</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #D7827E;">get_theme_file_uri</span><span style="color: #797593;">(</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">'assets/css/custom.css'</span><span style="color: #575279;"> </span><span style="color: #797593;">),</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #B4637A; font-style: italic;">array</span><span style="color: #797593;">(),</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #EA9D34;">'1.0.0'</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">);</span></span>
<span class="line"><span style="color: #797593;">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #797593; font-style: italic;">//</span><span style="color: #9893A5; font-style: italic;"> For editor-only styles:</span></span>
<span class="line"><span style="color: #D7827E;">add_action</span><span style="color: #797593;">(</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">'enqueue_block_editor_assets'</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #286983;">function</span><span style="color: #797593;">()</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #D7827E;">wp_enqueue_style</span><span style="color: #797593;">(</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #EA9D34;">'my-theme-editor'</span><span style="color: #797593;">,</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #D7827E;">get_theme_file_uri</span><span style="color: #797593;">(</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">'assets/css/editor.css'</span><span style="color: #575279;"> </span><span style="color: #797593;">),</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #B4637A; font-style: italic;">array</span><span style="color: #797593;">(),</span></span>
<span class="line"><span style="color: #575279;">        </span><span style="color: #EA9D34;">'1.0.0'</span></span>
<span class="line"><span style="color: #575279;">    </span><span style="color: #797593;">);</span></span>
<span class="line"><span style="color: #797593;">});</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Full control over loading conditions (you can conditionally enqueue based on page, template, user role, etc.).</li>



<li>Familiar to all WordPress developers.</li>



<li>Can load external stylesheets, Google Fonts, icon libraries, etc.</li>



<li>Supports dependencies, versioning, and media attributes.</li>



<li>Can target editor-only or front-end-only.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Loads on every page (unless you add conditional logic).</li>



<li>No integration with the Global Styles UI.</li>



<li>Doesn&#8217;t benefit from the block stylesheet system&#8217;s per-block inlining.</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li><a href="https://developer.wordpress.org/block-editor/how-to-guides/enqueueing-assets-in-the-editor/#editor-scripts-and-styles">Enqueueing assets in the Editor</a></li>



<li><a href="https://developer.wordpress.org/themes/core-concepts/including-assets/#editor-stylesheets" rel="noreferrer noopener" target="_blank">Editor Stylesheets</a></li>



<li><a href="https://developer.wordpress.org/reference/hooks/wp_enqueue_scripts/">do_action( ‘wp_enqueue_scripts’ )</a></li>



<li><a href="https://developer.wordpress.org/reference/functions/wp_enqueue_style/">wp_enqueue_style( string $handle, string $src, string[] $deps = array(), string|bool|null $ver = false, string $media )</a></li>
</ul>



<h3 class="wp-block-heading" id="what-s-the-difference-between-wp-enqueue-style-and-add-editor-style">What&#8217;s the difference between wp_enqueue_style and add_editor_style?</h3>



<p class="wp-block-paragraph"><code>wp_enqueue_style()</code> is the general-purpose function for loading stylesheets — you choose where it loads by picking your hook (<code>wp_enqueue_scripts</code> for the frontend, <code>enqueue_block_editor_assets</code> for the editor). When you use it on the editor hook, the stylesheet loads into the entire editor page, including the UI chrome (sidebar, toolbar, etc.).</p>



<p class="wp-block-paragraph"><code>add_editor_style()</code> is specifically designed for visual parity between the editor and the frontend. WordPress takes the stylesheet you pass it and automatically scopes every selector to <code>.editor-styles-wrapper</code>, so your styles only affect the content canvas and don&#8217;t bleed into the editor UI. In block themes it&#8217;s typically called from an <code>after_setup_theme</code> hook — this is how themes get their <code>style.css</code> to apply inside the editor.</p>



<p class="wp-block-paragraph">The practical upshot: if you want your theme&#8217;s frontend styles to look the same in the editor, use <code>add_editor_style()</code>. If you need to style the editor UI itself (like a custom sidebar panel) or need fine-grained control over loading conditions, dependencies, and versioning, use <code>wp_enqueue_style()</code> on the appropriate hook.</p>



<h2 class="wp-block-heading" id="14-the-theme-s-style-css">14. The Theme&#8217;s <code>style.css</code></h2>



<p class="wp-block-paragraph"><strong>Who:</strong> Theme developers<br /><strong>Where:</strong> <code>style.css</code> in the theme root</p>



<p class="wp-block-paragraph">The traditional main stylesheet still works in block themes, but its role has changed significantly. It now primarily holds theme metadata (name, version, description) and is loaded globally. </p>



<p class="wp-block-paragraph">In block themes it&#8217;s typically called from an <code>after_setup_theme</code> hook — this is how themes get their <code>style.css</code> to apply inside the editor.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers"><span>PHP</span><span class="code-block-pro-copy-button" style="color: #575279; display: none;" tabindex="0"><pre class="code-block-pro-copy-button-pre"><textarea class="code-block-pro-copy-button-textarea" readonly="readonly" tabindex="-1">add_action( 'after_setup_theme', 'theme_slug_setup' );

function theme_slug_setup() {
	add_editor_style( get_stylesheet_uri() );
}</textarea></pre><svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="with-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path class="without-check" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><pre class="shiki rose-pine-dawn" style="background-color: #faf4ed;" tabindex="0"><code><span class="line"><span style="color: #D7827E;">add_action</span><span style="color: #797593;">(</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">'after_setup_theme'</span><span style="color: #797593;">,</span><span style="color: #575279;"> </span><span style="color: #EA9D34;">'theme_slug_setup'</span><span style="color: #575279;"> </span><span style="color: #797593;">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #286983;">function</span><span style="color: #575279;"> </span><span style="color: #D7827E;">theme_slug_setup</span><span style="color: #797593;">()</span><span style="color: #575279;"> </span><span style="color: #797593;">{</span></span>
<span class="line"><span style="color: #575279;">	</span><span style="color: #D7827E;">add_editor_style</span><span style="color: #797593;">(</span><span style="color: #575279;"> </span><span style="color: #D7827E;">get_stylesheet_uri</span><span style="color: #797593;">()</span><span style="color: #575279;"> </span><span style="color: #797593;">);</span></span>
<span class="line"><span style="color: #797593;">}</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Advantages:</strong></p>



<ul class="wp-block-list">
<li>Familiar workflow for developers with classic theme experience.</li>



<li>Good for truly global CSS that should always be available (e.g., custom utility classes, print styles, CSS resets beyond what theme.json handles).</li>



<li>Full CSS syntax, syntax highlighting, and preprocessor support.</li>
</ul>



<p class="wp-block-paragraph"><strong>Limitations:</strong></p>



<ul class="wp-block-list">
<li>Needs to be enqueued like any other stylesheet file (see #13)  </li>



<li>Loads on every page, even if the styles aren&#8217;t needed — no per-block performance optimization.</li>



<li>Not integrated with the Global Styles UI.</li>



<li>Not the recommended approach for block-specific styling; use block stylesheets instead (#12)</li>
</ul>



<p class="wp-block-paragraph"><strong>Documentation</strong></p>



<ul class="wp-block-list">
<li><a href="https://developer.wordpress.org/themes/core-concepts/main-stylesheet/">Main Stylesheet (style.css)</a></li>
</ul>



<h2 class="wp-block-heading" id="summary-table">Summary Table</h2>



<figure class="wp-block-table alignwide is-style-stripes" style="font-size: 0px;"><table><thead><tr><th>#</th><th>Method</th><th>Who</th><th>Scope</th><th>Loads When</th><th>Editable by Users</th></tr></thead><tbody><tr><td>1</td><td>theme.json structured properties</td><td>Developer</td><td>Global / block / element</td><td>Always (inlined)</td><td>Yes, via Global Styles UI</td></tr><tr><td>2</td><td>theme.json <code>css</code> property</td><td>Developer</td><td>Global or per-block</td><td>Always (inlined)</td><td>Yes, per-block CSS is visible in Styles</td></tr><tr><td>3</td><td>Custom CSS properties (<code>settings.custom</code>)</td><td>Developer</td><td>Global (variables)</td><td>Always</td><td>No (indirectly via tokens)</td></tr><tr><td>4</td><td>Child theme.json</td><td>Developer</td><td>Inherits parent</td><td>Same as parent</td><td>Same as parent</td></tr><tr><td>5</td><td>Global Styles UI (visual)</td><td>User</td><td>Global / block / element</td><td>Always (inlined)</td><td>It <em>is</em> the user editing</td></tr><tr><td>6</td><td>Additional CSS (site-wide)</td><td>User</td><td>Global</td><td>Every page</td><td>Yes</td></tr><tr><td>7</td><td>Per-block Additional CSS</td><td>User</td><td>Per-block type</td><td>When block present</td><td>Yes</td></tr><tr><td>8</td><td>Additional CSS Class(es)</td><td>User</td><td>Single block instance</td><td>When that block is present</td><td>N/A (class only)</td></tr><tr><td>9</td><td>Global style variations</td><td>Developer</td><td>Whole site preset</td><td>When active</td><td>Users switch presets</td></tr><tr><td>10</td><td>Block style variations (JSON, PHP, JS)</td><td>Developer</td><td>Per-block variation</td><td>Only when block + variation is used</td><td>JSON/<code>style_data</code> methods: yes; <code>inline_style</code>/JS: no</td></tr><tr><td>11</td><td>Section styles</td><td>Developer</td><td>container blocks </td><td>When block + variation is used</td><td>Yes, via Styles panel</td></tr><tr><td>12<br /> </td><td>Block stylesheets (<code>wp_enqueue_block_style</code>)</td><td>Developer</td><td>Per-block</td><td>Only when block is present</td><td>No</td></tr><tr><td>13</td><td><code>wp_enqueue_style()</code></td><td>Developer</td><td>Configurable</td><td>Configurable</td><td>No</td></tr><tr><td>14</td><td><code>style.css</code></td><td>Developer</td><td>Global</td><td>Every page</td><td>No</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="decision-guide">Decision Guide</h2>



<p class="wp-block-paragraph"><strong>Start here:</strong> Use <strong>theme.json structured properties</strong> (#1) for everything they support. This gives you the best integration with the Global Styles system and lets users customize your styles.</p>



<p class="wp-block-paragraph"><strong>Need CSS that theme.json properties can&#8217;t express?</strong> Use the <strong>theme.json <code>css</code> property</strong> (#2) for small additions or <strong>block stylesheets</strong> (#12) for anything substantial.</p>



<p class="wp-block-paragraph"><strong>Want to offer style choices to content editors?</strong> Create <strong>block style variations</strong> (#10) so they appear in the Styles panel.</p>



<p class="wp-block-paragraph"><strong>Site owner making tweaks?</strong> Use the <strong>Global Styles UI</strong> (#5) first, then fall back to <strong>Additional CSS</strong> (#7 or #7) for anything the visual interface can&#8217;t handle.</p>



<p class="wp-block-paragraph"><strong>Need to target one specific block instance?</strong> Use <strong>Additional CSS Class(es)</strong> (#8) and define the class in your preferred CSS source.</p>



<p class="wp-block-paragraph"><strong>Building a child theme?</strong> Override the parent via <strong>child theme.json</strong> (#4) and add block stylesheets as needed.</p>



<p class="wp-block-paragraph"><strong>Need to sync user edits with theme files</strong>? Use the <a href="https://wordpress.org/plugins/create-block-theme/">Create Block Theme plugin</a>. </p>



<p class="wp-block-paragraph"><strong>How to sync user editor to theme files and maintain version control?</strong> Here is a tutorial: <a href="https://developer.wordpress.org/news/2026/01/streamlining-block-theme-development-with-wordpress-playground-and-github/">Streamlining block theme development with WordPress Playground and GitHub</a>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" />



<p class="wp-block-paragraph"><em>Huge Thank you to Justin Tadlock for reviewing the post to make sure it&#8217;s all technically accurate. </em></p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 27 Feb 2026 18:01:03 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:18:"Birgit Pauli-Haack";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:43;a:6:{s:4:"data";s:21:"
	
	
	
	
	
	
	
	
	
	
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:25:"Open Channels FM: Empathy";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:34:"https://openchannels.fm/?p=1497274";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:32:"https://openchannels.fm/empathy/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:73:"For some of us it comes naturally. For others, it may need to be learned.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 27 Feb 2026 09:55:43 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:8:"Bob Dunn";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:44;a:6:{s:4:"data";s:21:"
	
	
	
	
	
	
	
	
	
	
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:16:"Matt: Enablement";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:23:"https://ma.tt/?p=151317";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:33:"https://ma.tt/2026/02/enablement/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:474:"<p class="wp-block-paragraph">This year at <a href="https://automattic.com/">Automattic</a> has been intense. We kicked it off with two weeks of in-person AI enablement training, <a href="https://automattic.com/2026/02/25/ai-enablement-wordpress/">and there&#8217;s a great post about it now</a>. I&#8217;ve been so impressed and inspired by my colleagues leaning in to learn and grow together in the most consequential time in software development in the past 40 years.</p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 27 Feb 2026 02:00:52 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:45;a:6:{s:4:"data";s:21:"
	
	
	
	
	
	
	
	
	
	
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:40:"WordPress.org blog: WordPress 7.0 Beta 2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:35:"https://wordpress.org/news/?p=20025";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"https://wordpress.org/news/2026/02/wordpress-7-0-beta-2/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:6527:"<p class="wp-block-paragraph">WordPress 7.0 Beta 2 is now ready for testing!</p>



<p class="wp-block-paragraph"><strong>This beta version of the WordPress software is under development</strong>. Please do not install, run, or test this version of WordPress on production or mission-critical websites. Instead, you should evaluate Beta 2 on a test server and site. You can test WordPress 7.0 Beta 2 in any of the following ways:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Plugin</strong></td><td>Install and activate the <a href="https://wordpress.org/plugins/wordpress-beta-tester/">WordPress Beta Tester</a> plugin on a WordPress install. (Select the “Bleeding edge” channel and “Beta/RC Only” stream.)</td></tr><tr><td><strong>Direct Download</strong></td><td>Download the <a href="https://wordpress.org/wordpress-7.0-beta2.zip">Beta 2 version (zip)</a> and install it on a WordPress website.</td></tr><tr><td><strong>Command Line</strong></td><td>Use this <a href="https://make.wordpress.org/cli/">WP-CLI</a> command: <br /><code>wp core update --version=7.0-beta2</code></td></tr><tr><td><strong>WordPress Playground</strong></td><td>Use the <a href="https://playground.wordpress.net/?php=8.0&amp;wp=beta&amp;networking=no&amp;language=&amp;multisite=no&amp;random=y4q1rn88xn">WordPress Playground instance</a> to test the software directly in your browser.  No setup required – just click and go! </td></tr></tbody></table></figure>



<p class="wp-block-paragraph">The scheduled final release date for WordPress 7.0 is <strong>April 9, 2026</strong>. The full <a href="https://make.wordpress.org/core/2026/02/12/wordpress-7-0-release-party-schedule/">release schedule can be found here</a>. Your help testing Beta and RC versions is vital to making this release as stable and powerful as possible. Make sure to check the <a href="https://make.wordpress.org/core/">Make WordPress Core blog</a> for <a href="https://make.wordpress.org/core/tag/7-0">7.0-related posts</a> in the coming weeks for more information. Thank you to everyone who contributes by testing!</p>



<p class="wp-block-paragraph"><strong>Catch up on what’s new in WordPress 7.0</strong>: Read the <a href="https://wordpress.org/news/2026/02/wordpress-7-0-beta-1/">Beta 1 announcement</a> for details and highlights.</p>



<h2 class="wp-block-heading">How to test this release</h2>



<p class="wp-block-paragraph">Your help testing WordPress 7.0 Beta 2 is key to ensuring everything in the release is the best it can be. While testing the upgrade process is essential, trying out new features is equally important. This <a href="https://make.wordpress.org/test/2026/02/20/help-test-wordpress-7-0/">guide on what to test in WordPress 7.0</a> will walk you through testing features in WordPress 7.0.</p>



<p class="wp-block-paragraph">If you encounter an issue, please report it to the <a href="https://wordpress.org/support/forum/alphabeta/">Alpha/Beta area</a> of the support forums or directly to <a href="https://core.trac.wordpress.org/newticket">WordPress Trac</a> if you are comfortable writing a reproducible bug report. You can also check your issue against a list of <a href="https://core.trac.wordpress.org/tickets/major">known bugs</a>. Curious about testing releases in general? Follow along with the <a href="https://make.wordpress.org/test/">testing initiatives in Make Core</a> and join the <a href="https://wordpress.slack.com/messages/core-test/">#core-test channel</a> on <a href="https://wordpress.slack.com/">Making WordPress Slack</a>.</p>



<h2 class="wp-block-heading">Beta 2 updates and highlights</h2>



<p class="wp-block-paragraph">WordPress 7.0 Beta 2 contains more than 70 updates and fixes across the Editor and Core since the Beta 1 release. </p>



<p class="wp-block-paragraph">Each beta cycle focuses on bug fixes; and more are on the way with your help through testing. You can browse the technical details for all issues addressed since Beta 1 using these links:</p>



<ul class="wp-block-list">
<li><a href="https://github.com/WordPress/gutenberg/commits/wp/7.0?since=2026-02-20&amp;until=2026-02-26">GitHub commits for 7.0</a> since February 20, 2026</li>



<li><a href="https://core.trac.wordpress.org/query?status=closed&amp;changetime=02%2F20%2F2026..02%2F26%2F2026&amp;milestone=7.0&amp;col=id&amp;col=milestone&amp;col=owner&amp;col=type&amp;col=priority&amp;order=id">Closed Trac tickets for 7.0</a> since February 20, 2026</li>
</ul>



<p class="wp-block-paragraph"><strong>Beta 2 also contains a new feature</strong>!</p>



<p class="wp-block-paragraph">AI provider management is more intuitive in 7.0 Beta 2 with a new Connectors UI dashboard page. WordPress users can now manage external AI connections in a central place in wp-admin, under Settings &gt; Connectors. The new UI enables users to add, delete, and update external connections. It is powered by an extensible, route-based architecture that allows plugins and themes to hook into the page and expand its functionality. The new Connectors page builds on PHP-based script and menu infrastructure, and adds route components powered by <code>@wordpress/components</code> and <code>@wordpress/admin-ui</code>. A new <code>connections-wp-admin-init</code> hook and registration APIs allow plugins to integrate cleanly. This makes managing external connections easier while giving developers a clearer path to extend the experience.</p>



<h2 class="wp-block-heading">A Beta 2 haiku</h2>



<p class="wp-block-paragraph"><em>New, and fresh as dew</em></p>



<p class="wp-block-paragraph"><em>Crafted and refined for you:</em></p>



<p class="wp-block-paragraph"><em>Beta 2 breaks through.</em></p>



<p class="has-text-align-right wp-block-paragraph"><em>Props to <a class="mention" href="https://profiles.wordpress.org/4thhubbard/"><span class="mentions-prefix">@</span>4thhubbard</a>, <a class="mention" href="https://profiles.wordpress.org/annezazu/"><span class="mentions-prefix">@</span>annezazu</a></em>, <em><a class="mention" href="https://profiles.wordpress.org/audrasjb/"><span class="mentions-prefix">@</span>audrasjb</a>, <a class="mention" href="https://profiles.wordpress.org/mukesh27/"><span class="mentions-prefix">@</span>mukesh27</a>, and <a class="mention" href="https://profiles.wordpress.org/chaion07/"><span class="mentions-prefix">@</span>chaion07</a></em> <em>for collaboration, proofreading and review.</em></p>



<p class="wp-block-paragraph"></p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 26 Feb 2026 16:32:56 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Amy Kamala";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:46;a:6:{s:4:"data";s:21:"
	
	
	
	
	
	
	
	
	
	
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:57:"Open Channels FM: Open Source vs SaaS: The Freedom Debate";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:34:"https://openchannels.fm/?p=1650282";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:63:"https://openchannels.fm/open-source-vs-saas-the-freedom-debate/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:126:"In this clip, hosts Dave and Robert discuss the balance between personal convenience and the ideals of open source technology.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 26 Feb 2026 14:50:00 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:8:"Bob Dunn";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:47;a:6:{s:4:"data";s:21:"
	
	
	
	
	
	
	
	
	
	
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:19:"Matt: Great Writing";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:23:"https://ma.tt/?p=151313";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:36:"https://ma.tt/2026/02/great-writing/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1961:"<p class="wp-block-paragraph">Especially in an age where generating words is cheap, when you come across truly great writing, it really stands out. I want to pull two quotes from The Economist&#8217;columnist Charlemagne&#8217;s article <a href="https://www.economist.com/europe/2026/02/25/luxury-goods-are-europes-global-tax-on-vanity">Luxury goods are Europe’s global tax on vanity</a>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Flogging luxury goods is one of the few fields of business in which Europe excels (if one excludes the crafting of regulation). In an ironic twist, an egalitarian continent with an ever-declining share of global GDP hosts an industry that thrives on inequality and bombastic money-making. For how many seasons more can this alchemy of aspiration endure?</p>
</blockquote>



<p class="wp-block-paragraph">I mean, gosh, look at every word there. How they flow. The density of concepts and metaphors. Here&#8217;s another delicious excerpt.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Luxury houses sell the idea of scarcity, with hordes of publicists explaining that the years-long wait for a Birkin handbag is due to the lack of sufficient artisans to craft these pinnacles of refinement. This is a fairy tale stitched in fine silk. The luxury-goods industry has roughly tripled in size since 2000; its €358bn in annual sales—half a Walmart or Amazon, give or take—betrays how thoroughly mainstream supposed exclusivity has become. Fifty years ago, Louis Vuitton had but two outlets, both in France. These days it has two stores in Ningbo, China’s 34th-biggest city. Exclusive, <em>moi</em>?</p>
</blockquote>



<p class="wp-block-paragraph">I guess this post also serves as an endorsement of why it&#8217;s worth subscribing to publications like The Economist. </p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 26 Feb 2026 07:04:40 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:48;a:6:{s:4:"data";s:21:"
	
	
	
	
	
	
	
	
	
	
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:112:"WPTavern: #206 – Jonathan Desrosiers on WordPress Sustainability, Community Engagement, and Release Strategies";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:48:"https://wptavern.com/?post_type=podcast&p=202772";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:124:"https://wptavern.com/podcast/206-jonathan-desrosiers-on-wordpress-sustainability-community-engagement-and-release-strategies";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:57656:"<details>Transcript<div>
<p class="wp-block-paragraph">[00:00:19] <strong>Nathan Wrigley:</strong> Welcome to the Jukebox Podcast from WP Tavern. My name is Nathan Wrigley.</p>



<p class="wp-block-paragraph">Jukebox is a podcast which is dedicated to all things WordPress. The people, the events, the plugins, the blocks, the themes, and in this case WordPress sustainability, community engagement and release strategies.</p>



<p class="wp-block-paragraph">If you&#8217;d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice. Or by going to wptavern.com/feed/podcast, and you can copy that URL into most podcast players.</p>



<p class="wp-block-paragraph">If you have a topic that you&#8217;d like us to feature on the podcast, I&#8217;m keen to hear from you and hopefully get you, or your idea, featured on the show. Head to wptavern.com/contact/jukebox, and use the form there.</p>



<p class="wp-block-paragraph">So on the podcast today, we have Jonathan Desrosiers. Jonathan has been involved with WordPress for almost two decades, both as a user and a contributor. He&#8217;s a principal software engineer at Bluehost, where his role sees him sponsored to work on WordPress through the Five for the Future program. Over the years, he&#8217;s become a Core committer, and has spent many hours thinking about how to enhance the contributor experience, and make it easier for people to get involved in the project.</p>



<p class="wp-block-paragraph">In this episode we discuss how WordPress releases might become more impactful by synchronizing them with flagship community events like WordCamps and State of the Word. A recent experiment of combining a major release with a live event spark some excitement, and Jonathan shares insights on the logistics behind such synchronized moments, the challenges posed by international holidays, and regional scheduling, and the broader vision for connecting releases with community gatherings.</p>



<p class="wp-block-paragraph">We also get into the challenging landscape of the WordPress community, how it&#8217;s recovering from the effects of COVID, the struggle to rebuild local Meetups, and efforts like mentorship and educational initiatives to bring in new contributors, particularly from younger generations.</p>



<p class="wp-block-paragraph">Jonathan reflects on the importance of making release moments engaging and fun, akin to the anticipation of a new TV series or software launch, and the role of AI and open source in empowering a new wave of builders.</p>



<p class="wp-block-paragraph">If you&#8217;re interested in how release cycles, community events, and contributor onboarding are involved in WordPress, or what the future might hold for the platform and its community, this episode is for you.</p>



<p class="wp-block-paragraph">If you&#8217;re interested in finding out more, you can find all of the links in the show notes by heading to wptavern.com/podcast, where you&#8217;ll find all the other episodes as well.</p>



<p class="wp-block-paragraph">And so without further delay, I bring you Jonathan Desrosiers.</p>



<p class="wp-block-paragraph">I am joined on the podcast by Jonathan Desrosiers. Hello.</p>



<p class="wp-block-paragraph">[00:03:06] <strong>Jonathan Desrosiers:</strong> Hi, how are you?</p>



<p class="wp-block-paragraph">[00:03:07] <strong>Nathan Wrigley:</strong> Yeah, good. Jonathan&#8217;s joining me again. Most recently, I think we were at WordCamp somewhere. I can&#8217;t exactly remember where, but I was chatting with him and Joe Dolson if memory serves. And a very different conversation to be had today because Jonathan has been mulling over how we can make releases impactful, and also how we can bind those to community events, particularly flagship WordPress events like WordCamps, things like that.</p>



<p class="wp-block-paragraph">Before we begin that conversation, Jonathan, I wonder, it&#8217;s a bit of a banal question, but people like to have the context of who you are. So would you mind just, very quick potted bio. Just tell us who you are and what you do in the WordPress space.</p>



<p class="wp-block-paragraph">[00:03:44] <strong>Jonathan Desrosiers:</strong> Sure. So my name is Jonathan Desrosiers. I am a principal software engineer at Bluehost and I am sponsored there, the majority of my time is sponsored to contribute back to the WordPress project through the Five for the Future program. And so I&#8217;ve been there, probably since 2018, I think. And I&#8217;ve been a Core committer for almost eight years now.</p>



<p class="wp-block-paragraph">I&#8217;ve been involved as an accredited contributor for 13 years now. And so I&#8217;ve been involved with WordPress for over a decade in many ways, contributing, but also as a user for almost, geez, almost two decades now I think. And so, I just had that realisation, it&#8217;s been a really long time. It&#8217;s been almost 20 years that I&#8217;ve been at least using WordPress in some way.</p>



<p class="wp-block-paragraph">But week to week I do a lot of thinking about contributor experience, how we can automate things, or how we can make our processes more clear so that more people can participate. And just generally making sure that everybody has what they need to be successful. And whether that&#8217;s mentorship, or they have blockers they need, certain people to come together and discuss, and get a consensus or understanding, you know, how the sausage is made in some way.</p>



<p class="wp-block-paragraph">[00:04:56] <strong>Nathan Wrigley:</strong> I think it&#8217;s fair to say that you are very much connected to the WordPress project. I think it&#8217;s the fulcrum of your working life, and you are working at a very high level as well. So Core committer, things like that.</p>



<p class="wp-block-paragraph">Now, in the recent past, it was probably, I want to say December in the year 2025, we had a kind of strange event happened. Not strange in the sense of weird, but strange in the sense of different, unusual. A release of WordPress came out and it coincided with an actual event. Now, in this case, it was State of the Word. So there was a bunch of people, and I believe they were gathered in New York. I could be wrong about that, but I think it was in.</p>



<p class="wp-block-paragraph">[00:05:33] <strong>Jonathan Desrosiers:</strong> It was in San Francisco.</p>



<p class="wp-block-paragraph">[00:05:35] <strong>Nathan Wrigley:</strong> San Francisco. Okay, there we go. Thank you for the correction. It was in San Francisco and the idea was that the release of WordPress would go out and it would be bound to this event. And there was this almost, how can we describe it? It was almost like television, basically. It was being filmed and streamed live all over the place. And there was this feeling of a big red button. There was a lot of people gathered around and they all sort of leaned in and pushed a big red button, and the release of WordPress came out.</p>



<p class="wp-block-paragraph">Now, I don&#8217;t know if the button actually did anything or if it was really sort of smoke and mirrors. I like the idea that the button actually did signal the release, but I don&#8217;t know if that&#8217;s the case. But the point was, there was a little bit of theater put into it. There was this idea that, okay, we&#8217;ve got this live event which lots of people will be watching. We&#8217;ve got a release which we need to do, which lots of people will be looking forward to. Why don&#8217;t we sort of combine the two things?</p>



<p class="wp-block-paragraph">And so it was a bit of PR really. And it also felt a bit like sort of marketing, and I&#8217;m going to use gimmick in the real sense of the word. So not like gimmick as in something pointless, but gimmick as in something different, unique. Something to draw your attention and grab you in. And I think the idea has been proposed that in the year 2026, the flagship events, the flagship WordCamps, so I&#8217;ll list them in order in which they&#8217;re happening.</p>



<p class="wp-block-paragraph">So we&#8217;ve got WordCamp Asia, and then we&#8217;ve WordCamp Europe, and then we&#8217;ve got WordCamp US. The three releases of WordPress during 2026 will happen in tandem with those events. Now, why? Why would we want to do this?</p>



<p class="wp-block-paragraph">[00:07:12] <strong>Jonathan Desrosiers:</strong> Yeah, so I don&#8217;t think it was intentional, but the schedule just happened to coincide. You know, we were working on 6.9 and we realised, oh, the release date is the same as State of the Word. And so, I can&#8217;t remember who originally had the idea, but it was mentioned that it would be really neat to just be able to publish it live at the event and celebrate that.</p>



<p class="wp-block-paragraph">I guess the main reason behind it is just that, the more I&#8217;m involved in open source, the more I realise that the code and the license and all those things are important, but the most important thing underneath any open source project is the community that&#8217;s involved with it. And what better way to celebrate our achievements and our accomplishments when we get together in different ways.</p>



<p class="wp-block-paragraph">And so, typically that&#8217;s in Slack or social media, right? We celebrate a release and we share the posts and say what we&#8217;re excited about. But we also get together at different events and we do the same thing, right? We talk about what we&#8217;re excited about, what we&#8217;re working on, what&#8217;s coming, or what we think should change in certain ways. Why not just do that at the same time and create even a more ultimate celebration, right? Another community moment where people have another opportunity to feel involved in something greater than them.</p>



<p class="wp-block-paragraph">[00:08:25] <strong>Nathan Wrigley:</strong> Do you have any notion that this is going to be carried forward? I mean, I know that there was obviously a bit of serendipity in how it happened. The coincidence of timing and things like that. But do you have every confidence that this will happen, that Asia will get a release, Europe will get a release, and the US will get a release. In the year 2026, do you think that&#8217;s going to actually occur?</p>



<p class="wp-block-paragraph">[00:08:46] <strong>Jonathan Desrosiers:</strong> We will see. So as the proposed schedule is for this calendar year, right? There&#8217;s three releases. Unfortunately, it&#8217;s tough because the people planning WordCamps don&#8217;t plan around our software&#8217;s release cadence, right? They plan around budget, regional holidays, travel factors, weather, cost of venues and availability.</p>



<p class="wp-block-paragraph">And so, you know, it&#8217;s not reasonable for the Core team and the people working on releases to say you have to have an event in a certain month, right? And so this year, some people may not have noticed, but WordCamp Asia is in April this year, which it&#8217;s been in February so far in the previous editions. And WordCamp Europe is in June, which it&#8217;s traditionally usually in.</p>



<p class="wp-block-paragraph">And so that&#8217;s not a big enough gap to have another major release. And so the proposed schedule is saying, let&#8217;s release during WordCamp Asia, let&#8217;s release during WordCamp US, and then we&#8217;ll release again at the end of the year around State of the Word. We don&#8217;t have a date for State of the Word yet, but it&#8217;s around where we think it might be.</p>



<p class="wp-block-paragraph">And likewise, creating a schedule for releases is incredibly hard because if we don&#8217;t release in the first week of April, for example, then I believe the whole month of April has major religious holidays scattered throughout it in different areas of the world. And if we released in March, that was way too soon because we started the alpha phase of 7.0, that starts when the previous release is branched, like it&#8217;s separated from the primary branch in the code base, and that happened in like November.</p>



<p class="wp-block-paragraph">But there&#8217;s US Thanksgiving, there&#8217;s Hanukkah, there&#8217;s Christmas, there&#8217;s New Year&#8217;s, right? A lot of people in the community take the majority of December off, and so that&#8217;s like a washed month, right? And so we would&#8217;ve had essentially four weeks until the feature complete point of the release. So that was too soon. And so it&#8217;s just as hard to plan the release schedule in a way that doesn&#8217;t negatively impact everybody as best as possible as it is to plan these major events.</p>



<p class="wp-block-paragraph">And so I can&#8217;t say that it will be a guarantee going forward. We&#8217;re trying it out this year to see how it goes and what we can learn from it. We felt that the State of the Word was successful and it was exciting. It was unique in its own ways. And so we want to try, continue trying this this year and see how it goes.</p>



<p class="wp-block-paragraph">[00:11:06] <strong>Nathan Wrigley:</strong> Gosh, the piece that you just said there about the religious holidays and what have you, that really opens up a really interesting discussion. Because it is quite likely, I imagine, that the listenership to this podcast probably never gave that any thought, that this kind of international calendar, be it a religious calendar or maybe just a vacation calendar in certain parts of the globe would really impact when the release can happen.</p>



<p class="wp-block-paragraph">Because there are people who are committing to the project, and they tend to be in certain jurisdictions. And so if there are people who are on, I don&#8217;t know, a week long holiday, nationally, in a specific jurisdiction, and they typically are a large part of the team that are committing in various different respects, that&#8217;s important, but probably something that many people would not have thought about.</p>



<p class="wp-block-paragraph">Now, in terms of these releases then, is the idea, well, I&#8217;ll backpedal a little bit. It occurred to me that quite a lot of the people who may be involved in releases are the very kind of people who would find themselves also at some of these flagship events. Now, obviously it&#8217;s not going to be 100%, maybe it&#8217;s 25% of the people who are release leads and part of the teams that are committing here, there, and everywhere.</p>



<p class="wp-block-paragraph">I was worried that there&#8217;d be people on airplanes, people trying to land and orientate themselves in the country that they&#8217;ve landed in in the same period of time when they would&#8217;ve been heads down, in their office, in their study, figuring out the bits that might be broken with the upcoming release. Is that a thing? Is that part of the jigsaw puzzle of this?</p>



<p class="wp-block-paragraph">[00:12:32] <strong>Jonathan Desrosiers:</strong> It definitely is, yeah. With any release, there&#8217;s no time of the day where everyone on the planet is available to work on something, right? And so another part of this is that, in a way it forces us to have a major release in different geographic areas so that everywhere on the globe there&#8217;s a WordPress release that they may be able to participate in, right?</p>



<p class="wp-block-paragraph">And so, likewise with travel, right? So when we assemble a release squad, we have to think, okay, it&#8217;s based in, for example, this one was planned to be released at WordCamp Asia in India. So we want to make sure we have a mix of people that are in different areas of the world. And not just so that there&#8217;s always people around to respond to things throughout the entire cycle, but we also want to have people that are present and not present at the event that are participating. And maybe the wifi is completely unusable or maybe something happens, right? So it&#8217;s good to have people that are there and not.</p>



<p class="wp-block-paragraph">And that was part of the announcement too, is that we tried to underscore the point that it would be great if everybody could go to WordCamp Asia, but traveling is not a requirement to participate in the release at all. And that&#8217;s a good thing, because it&#8217;s good to have people in multiple areas, multiple time zones.</p>



<p class="wp-block-paragraph">With WordCamp Asia, once contributor day ends, it&#8217;s the beginning of the US daytime, right? And so those contributors can sign off and there&#8217;s people around to help carry that torch and continue on if there&#8217;s any follow-up issues or anything that needs to be investigated.</p>



<p class="wp-block-paragraph">And so, yeah, that&#8217;s also a consideration is how, I guess we can call it global coverage, right? Like, how can we ensure we have global coverage so that there are people with the right skill sets, and right availability, and right knowledge, to be able to take on certain tasks or responsibilities or perform investigations, whatever may need to be done as part of that release process.</p>



<p class="wp-block-paragraph">[00:14:26] <strong>Nathan Wrigley:</strong> I, like you, am really in the weeds of the WordPress project. I obsess about it in a way that&#8217;s probably not all that healthy. I&#8217;m very well aware of when the next release is coming up. I&#8217;m usually fairly aware of what is going to be in that release. But I imagine most people using WordPress, it&#8217;s probably a bit of a surprise. You know, they open up WordPress one day and either it has updated. If it&#8217;s a point release, probably it&#8217;s a more manual thing, if it&#8217;s a major release, I should say, but if it&#8217;s a more minor release, maybe things have updated in the background during the course of the night and what have you.</p>



<p class="wp-block-paragraph">But I&#8217;m thinking of TV series now. So when a successful TV series has a new season, there&#8217;s all this fanfare and buildup and you know it&#8217;s coming. You see the commercials, you see the adverts. And the moment that TV series comes around, you are excited, you&#8217;re ready to go. And I remember back in the day, this is going back a long time, when Firefox would make a release, they sort of did this thing like, I don&#8217;t know, every 18 months or something like that. Not like now where it&#8217;s every couple of hours it seems, that browsers update themselves.</p>



<p class="wp-block-paragraph">But when it went to, I don&#8217;t know, 3.6 or something like that, there was this big fanfare, this big moment. Everybody took stock and what have you. And are you trying to encourage a bit of that? Are you trying to create a bit of razzmatazz and drama and intrigue and awareness and all of that around the release, and make it feel like an important thing, which with the best will in the world, it kind of has not been more recently? Most people, it just updates. There&#8217;s no fanfare whatsoever. But we can leverage it to make it important, significant, fun, interesting.</p>



<p class="wp-block-paragraph">[00:16:04] <strong>Jonathan Desrosiers:</strong> Yes and no, right? Like, we want to celebrate the community and the work we&#8217;re doing now. I actually would love it if we could get to a point where we&#8217;re releasing every, I don&#8217;t know, every week or every month even, right? Not have to wait every three or four months. There&#8217;s some value in having that penultimate moment, right? Of, we&#8217;ve worked for three months on this. But there&#8217;s also aspects of the world where we expect things faster and more instant and waiting for the patch that you submit in January to be released in April is not really, like maybe you lose interest in contributing in that time, right? So there&#8217;s many different things like that.</p>



<p class="wp-block-paragraph">Some things that you mentioned really resonated with me as far as awareness of what&#8217;s coming or like what&#8217;s been done. In a way, the fact that users are not so aware of what&#8217;s being added or what their site has updated to, it&#8217;s a sign of the success of auto updates and how seamless those are.</p>



<p class="wp-block-paragraph">Because for a little while I&#8217;ve been considering, when you update WordPress manually, you&#8217;re redirected into the about page in the dashboard, right? And every release, there&#8217;s a new about page that&#8217;s designed, it works hand in hand with, we call them the micro sites, which is like a wordpress.org&#8217;s landing page that showcases the release. And it just explains all the features that have been added.</p>



<p class="wp-block-paragraph">But you only see that if you either go to the about page manually or you manually click update when you&#8217;re in the dashboard. And a site might have many administrators that only the person that actually updates will see it. And so I&#8217;ve been thinking about ways that we can make users more aware that their site is updated. Or maybe that&#8217;s not the important part, but maybe it&#8217;s just the important part to make them aware of the new features that are available to them, right?</p>



<p class="wp-block-paragraph">Maybe we put some type of a widget on the dashboard where we link off to a Learn WordPress page that teaches you about how to use the Notes feature that got added. The other thing too is you mentioned about the TV shows advertise when they&#8217;re coming up, right? Maybe we need to do a better job of advertising what&#8217;s coming up and encouraging people to opt in early and test.</p>



<p class="wp-block-paragraph">And in a way a more rapid release cycle leads to that because many of the browsers have different feature flags and they build features out in different branches, and you can actually opt into testing a specific feature and that would get turned on, but maybe not all the other things that they&#8217;re working on until it&#8217;s ready.</p>



<p class="wp-block-paragraph">And so maybe we need different ways for people to get involved testing, or trying things out earlier to understand what&#8217;s coming, but also to give us valuable feedback, how it works on their site, what breaks, what it doesn&#8217;t interact with. All of that is very valuable feedback, and we should always be striving to get more testers and more awareness around what&#8217;s coming because it creates new feedback loops that are valuable for different reasons.</p>



<p class="wp-block-paragraph">[00:18:58] <strong>Nathan Wrigley:</strong> Yeah, it&#8217;s kind of interesting, and what I&#8217;m about to say, I am sure that a significant proportion of the listeners to this podcast will say, no, Nathan, we don&#8217;t want this. But here&#8217;s a proposal then. Here&#8217;s an idea. And again, I&#8217;m going to hark back to the TV series.</p>



<p class="wp-block-paragraph">The TV series, typically when they&#8217;ve started advertising between other television programs, that TV series has been made, the footage has been shot, the graphics have been done. It&#8217;s basically ready to roll. And then they parcel all that up and then they release little snippets of what&#8217;s coming so that you can prepare yourself and get excited.</p>



<p class="wp-block-paragraph">I kind of wondered if something like that in the dashboard, akin to the about us page, but in the run up to the release. So all the graphics have been made. We know basically what&#8217;s going to drop in this release. Now it may get tweaked here and there at the edges, but we know what&#8217;s coming. I&#8217;ve always thought that would be a really nice idea.</p>



<p class="wp-block-paragraph">I would love to see that. And I realise a proportion of people would think, no, we really don&#8217;t want that. But I think that&#8217;s a perfect opportunity to get people drawn into, oh, this is coming. Collaborative editing, that&#8217;s about to happen is it? Gosh, that&#8217;s really interesting.</p>



<p class="wp-block-paragraph">And then this call to action could be dropped in, but we need some testing around the edges of it. We&#8217;ve got the bare bones of it, but we need some more eyeballs on it and what have you. So that proactive demonstration of what&#8217;s going to happen rather than the reactive, your site has been updated, here&#8217;s what there is, which is already there. This is more of a here&#8217;s what&#8217;s coming, get excited, get involved, yada yada.</p>



<p class="wp-block-paragraph">[00:20:29] <strong>Jonathan Desrosiers:</strong> In some ways the feature branch model that I described lends to that, right? Because then it&#8217;s not, here comes this feature and then, oh, actually we left it out of this release, right? It&#8217;s its own thing that&#8217;s being worked on. And then when it&#8217;s released, it&#8217;s released, and it&#8217;s here. But it doesn&#8217;t make it any less, any worse off than other things that are shipping in the release, right? Because it&#8217;s its own thing, and it&#8217;s its own, it has its own criteria to be ready, in a state that we&#8217;re comfortable with shipping it and supporting it forever because of backwards compatibility.</p>



<p class="wp-block-paragraph">And so yeah, I think that what you&#8217;re describing is essentially what I was describing, a little bit more detail. And there&#8217;s of course a lot of nuance there around how often do we do that? We have a lot of parts of the release process that need to be automated before we can even consider that. The different parts of the block editor are, many of it is managed as packages, NPM packages. And so a lot of those are so interconnected, it&#8217;s a little difficult to release just one feature because they&#8217;re all being updated at the same time.</p>



<p class="wp-block-paragraph">And so like there&#8217;s some architectural things to think about around that. Like, how do we compartmentalize things better to be able to do that? Make sure we don&#8217;t accidentally include something that&#8217;s not ready but when we intended to include a certain feature. There&#8217;s a lot to unpack there and I don&#8217;t know that we&#8217;ll ever get there just because of the sheer size of the project and how, backwards compatibility, how long we&#8217;ve been around.</p>



<p class="wp-block-paragraph">But I think that training users that auto updates are important to have enabled that are quality, you know, not shipping things that break people&#8217;s sites as much as possible, even though it&#8217;s unavoidable because of how flexible WordPress is.</p>



<p class="wp-block-paragraph">After 6.9 came out, I was looking into some of the data because I had this gut feeling that 6.9 was being updated to, slower than other releases. And so for a little while I was looking at that. And after about a month, I was like, okay, this is just a hunch. Let me go and actually look at the data around this.</p>



<p class="wp-block-paragraph">And so what I noticed was actually the opposite. When I looked at, I created 5% thresholds for the percentage of total WordPress sites. And when I looked at the data, I realised that for the last 10 releases, let&#8217;s see here. So every major version of the last six to eight releases has passed 35% of all WordPress sites in two days or less. And also every one of these columns as far as percentages is increasing.</p>



<p class="wp-block-paragraph">And so WordPress 6.9 reached the 50% threshold of all WordPress sites in 10 days, and that&#8217;s four days faster than 6.8, which was the next fastest. And currently we&#8217;re approaching 65% threshold of all WordPress sites. And only six other releases have done that so far. All of them are the most recent ones, except for 4.9, which we all know had a waiting period for Gutenberg. And the only release the past 70% was 6.8.</p>



<p class="wp-block-paragraph">And so I&#8217;m interested to see how this trend continues because it&#8217;s showing an acceleration of adoption for each new major version of WordPress. They&#8217;re getting installed faster, by more people. It&#8217;s a sign that we&#8217;re shipping stable software. People are more confident. People are opting into auto updates for major versions. And in general, it&#8217;s just a quality sign that we&#8217;re doing something right here. And so how can we lean into that more?</p>



<p class="wp-block-paragraph">[00:23:52] <strong>Nathan Wrigley:</strong> Okay, let&#8217;s pivot a little bit. Let&#8217;s sort of bind community, we did touch on this a minute ago, but let&#8217;s spend a little bit of time binding the community to these kind of things because right at the start you mentioned that really the community is the underpinnings of your interest in the WordPress space. The code is obviously tremendously important, but without the community there is no code basically.</p>



<p class="wp-block-paragraph">And so we&#8217;ve got these events. We&#8217;re trying to create interest around the WordCamps and the releases at the same time. But just looking back over the last period of time, let&#8217;s go for year, two years, something like that. I don&#8217;t know what your spidey sense is telling you, but my spidey sense is telling me that that community portion, it&#8217;s sort of slowly but surely, it feels like it&#8217;s withering away slightly.</p>



<p class="wp-block-paragraph">I&#8217;m not really picking up on like this angry mob of people who are stamping their feet and shouting, I don&#8217;t want anything to do with the WordPress community and then disappearing. I mean maybe there&#8217;s a few of those, probably, somewhere. But I don&#8217;t get a sense of that. I just get this sense of sort of, somebody&#8217;s pulled the plug out of a bathtub and it&#8217;s slowly sort of draining away.</p>



<p class="wp-block-paragraph">Attendance down at WordCamps. Meetups struggling to sort of get the numbers that they had several years ago. And so it would feel like at the moment, you would have to be watching the news fairly closely, especially right now. So at the beginning of February, 2026 is when we&#8217;re recording this. There does seem to be a push from the senior leadership to make WordPress Meetups and things like that, a much more central part.</p>



<p class="wp-block-paragraph">And then there&#8217;s this whole broad spectrum of educational initiatives as well going on. So we&#8217;ve got WP Campus Connect, we&#8217;ve got the Credits Program and a whole smorgasbord of other things which is happening.</p>



<p class="wp-block-paragraph">So there&#8217;s no question there, really, what I&#8217;m just trying to do is give you the opportunity to bind the two things, the WordPress community and the software, and really just talk about whether you&#8217;ve noticed the same thing as me, where there&#8217;s this slow, withering of the community. And maybe this is a part of just sort of getting it all back together, making events like this a bit more fun and interesting.</p>



<p class="wp-block-paragraph">[00:26:02] <strong>Jonathan Desrosiers:</strong> Yeah. I think there&#8217;s a few things there to call out. The first observation I&#8217;ve had over the last year is there&#8217;s a palpable excitement to build with WordPress again. I&#8217;m noticing there&#8217;s a renewed enthusiasm. People, they want to move on from certain things, and they want to get back to building experiences and tools and things on the WordPress platform.</p>



<p class="wp-block-paragraph">But there&#8217;s also, I think we&#8217;re dealing with some, in some ways, a long tail COVID effect, right? There was obviously, you know, a lack of in-person events for a while, and during that time a lot of the people who were keeping Meetups alive and WordCamps alive, they moved on, or burnt out, and chose not to return after. And so there was a break in that pipeline of, usually there&#8217;s a lead doing that and there&#8217;s other people learning under them, and then they move up and take over. And that was totally disrupted and I think that we&#8217;re still trying to rebuild that.</p>



<p class="wp-block-paragraph">I think that it manifests differently in different areas too. So for example, the APAC WordCamp community is very strong and they have lots of WordCamps. But in the United States, there was one WordCamp that wasn&#8217;t WordCamp US last year, I think, Montclair. And I lead the Boston WordPress Meetup and so finding speakers is difficult. Getting people to come out is difficult as well. And I think those are partially just larger societal shifts where it&#8217;s harder to get people to come out to certain things. And we just have different preferences as far as how we consume information or learn.</p>



<p class="wp-block-paragraph">But I&#8217;m still not sure why the difference in the geographical areas, and I think it may have to do more with, APAC is a more emerging market when it comes to WordPress, right? Like their community, especially in certain areas has been growing and is much newer than it is in the US. And so I think that they&#8217;re growing their communities for the first time in many ways, right? But in the US it&#8217;s the second or third or fourth time that we&#8217;re growing those communities or revitalising those communities. And the form that that needs to take, I think is a little different. And I&#8217;m not clear on what the holdup is there.</p>



<p class="wp-block-paragraph">But I do know that a big factor of that is to get new people involved with WordPress and interested in WordPress, and that&#8217;s why some of the priorities that Mary Hubbard published, and one of them in particular is education and awareness and all of those different things that work together in the form of the WP Credits program, mentorship programs. There&#8217;s been the contributor mentorship programs that happen every few quarters in WordPress over the last few years.</p>



<p class="wp-block-paragraph">And we&#8217;ve seen some really great contributors who were mentored in that program, and then the next time the program happened, they mentored, and then they became a team lead, and then they served on release squads. And so we&#8217;ve seen some really great contributed journeys through those paths.</p>



<p class="wp-block-paragraph">[00:28:53] <strong>Nathan Wrigley:</strong> I&#8217;ll just sort of run through with you the kind of things that I&#8217;ve noticed in my part of the world. So I think COVID is an enormous part of it. It upended so many ordinary things in life. So, as an example, you know, people obviously, they ceased going out, and then that pattern of not going out became habituated. People didn&#8217;t go out because that&#8217;s not what you do.</p>



<p class="wp-block-paragraph">And in the UK we have this institution called the pub, which I&#8217;m sure you&#8217;ve heard of. And it used to be that prior to COVID, the pub was the real centerpiece of many communities. You know, towns, suburbs, what have you. Everybody would coalesce around the pub and that was very important. Since the pandemic, a lot of those institutions, they don&#8217;t really function in that way anymore. You know, there isn&#8217;t the throughput, there isn&#8217;t the footfall and so they go out of business.</p>



<p class="wp-block-paragraph">And the same, I presume is true in the WordPress space. You know, we&#8217;re trying to encourage people to get up, leave their home, spend money on transportation. Obviously there&#8217;s the time cost, the sunk cost of time and what have you as well. It&#8217;s difficult, but it makes me more sanguine that it&#8217;s not just like, it&#8217;s not just a WordPress thing, you know, it&#8217;s the whole of society.</p>



<p class="wp-block-paragraph">But like you said, I get the feeling that the WordPress community has begun to address it. And the way it&#8217;s being addressed is through these educational initiatives. Trying to get a throughput of younger talent. So get them at the school age, get them at the university age, and then hopefully they will have an interest. They&#8217;ll get a flavor of what it means to be involved in these Meetups and things like that and hopefully take those on.</p>



<p class="wp-block-paragraph">It&#8217;s a laudable goal. I hope that it has the capacity to transfer. You know, so in a decade&#8217;s time we can look back and say, look what happened. This young blood emerged. I think it&#8217;s yet to be seen. I think certainly in the area, the locale where I am, the United Kingdom, we don&#8217;t see evidence of that yet. Maybe in the US that would also mirror.</p>



<p class="wp-block-paragraph">But from everything that I&#8217;ve learned and the people that I&#8217;ve talked to for this podcast and events in Asia and places like that, that seems to be a really different picture. There seems to be a real thirst for solutions like WordPress. Because there&#8217;s a direct kind of career path there. You know, you can pick up a free piece of open source software, crack open a laptop and get going and start to sell your services far and wide. And so again, there&#8217;s no question there, just observations that I hope these initiatives bear fruit. But it&#8217;ll be interesting to see. Only time will tell.</p>



<p class="wp-block-paragraph">[00:31:16] <strong>Jonathan Desrosiers:</strong> I think at the root of what we&#8217;re dealing with is that people are motivated by what they see as valuable, right? If they&#8217;re not going out to events, so they&#8217;re not engaging with the community, they don&#8217;t recognise or feel that it&#8217;s valuable to them in some way. And so we&#8217;re having to reprove why communities are valuable, why open source is valuable, why you should care.</p>



<p class="wp-block-paragraph">And then the other aspect of it is, you know, overall project sustainability. We can&#8217;t just keep getting older. We need to have a balance of new, younger people that get involved as well.</p>



<p class="wp-block-paragraph">And so one way to lean into getting younger is obviously, like you said, to approach people at schooling age, right? Or university, and teach them about open source. Show them how to contribute, how to be a part of a community, and why it&#8217;s valuable. But we have to be really careful because we need to be prepared to, I&#8217;ve written in the past that we need to be prepared to activate these contributors, right?</p>



<p class="wp-block-paragraph">So it&#8217;s one thing to make them aware of this, but it&#8217;s another thing to make sure they&#8217;re properly supported and we give them pathways to grow. We give them clear criteria to be successful, clear projects to work on, so they understand what they&#8217;re doing and what they&#8217;re trying to accomplish.</p>



<p class="wp-block-paragraph">And I think that this is one thing that is also a benefit of having the releases coincide with these major events because new people are getting together already, so why not use that opportunity?</p>



<p class="wp-block-paragraph">One of the goals that every table lead and every organiser of a Contributor Day has is to ensure as many contributors see, realise their work over the finish line. And so on the Core team that&#8217;s a patch that someone tests gets committed, or a patch someone writes gets committed to WordPress, right? How can we make that more valuable, where it&#8217;s not just ending when they leave Contributor Day?</p>



<p class="wp-block-paragraph">And so I&#8217;ve been thinking about all the different logistics and helping to coordinate with the WordCamp Asia team and the 7.0 release team to make sure we&#8217;re prepared for that final day. And one of the things I&#8217;ve been thinking about is the release process itself. One of the best, lowest friction ways to get involved with WordPress in the actual release process. And you don&#8217;t need any experience contributing to really take part in it. And that&#8217;s when we get to a point where we say, okay, here&#8217;s the zip file of what we think we&#8217;re going to ship, go test it.</p>



<p class="wp-block-paragraph">And so people will take it, and they install it on their server and they say which version of PHP they&#8217;re using, and how they installed it and what they did and, you know, it worked. And the majority of that though is just looking for problems. And when problems don&#8217;t come up, we just don&#8217;t do anything with all the information that people are dropping, right? And there might be 50 people at a major release. We call them parties, but at the release parties that are dropping information. And again, if there&#8217;s no red flags, that information just largely goes away.</p>



<p class="wp-block-paragraph">But, how can we rethink that and make that effort more meaningful, and also create a pathway for them to continue contributing in some way past that moment? And having everybody in person is a great way to have pilot programs for different approaches, because there can be someone that briefs a set of contributors on what we&#8217;re going to try this time, here&#8217;s what we want to do, give us feedback on how you felt it went. Everybody that&#8217;s involved in the squad and doing the release can say, oh yeah, that actually was really helpful and better than what we do before.</p>



<p class="wp-block-paragraph">And these newer individuals that are learning also have fresh perspective. And so having them participate in these, I guess I&#8217;ll call them experiments of such, but just these processes and things that we are considering, it helps get that fresh opinion and perspective on why things are working and why things aren&#8217;t and helps us just improve.</p>



<p class="wp-block-paragraph">[00:35:04] <strong>Nathan Wrigley:</strong> I&#8217;ve got three children and they&#8217;re all of a certain age now, they&#8217;re certainly no longer small. You know, they&#8217;re basically adults. And it&#8217;s really fascinating looking at the kind of things that engage them. I think they&#8217;ve just grown up in a different era. The diet of the kind of things that excite them is very different to the kind of things that excited somebody of my generation, just because, you know, they&#8217;ve had the whole world in their pocket ever since they were born.</p>



<p class="wp-block-paragraph">And having that dialogue with the next generation, and trying to figure out what it is that they want and that they desire. And even things like open source. So when, I was already an adult before the internet began to be put into everybody&#8217;s homes, and people started to own personal computers and things like that. And so I was ready to receive that message of open source right at the start. And it became really obvious to me, oh, that&#8217;s a really clever way of making software.</p>



<p class="wp-block-paragraph">But now of course we&#8217;ve got this landscape of closed platforms. Everything&#8217;s free at the point of use, but everything&#8217;s not free in any way, shape, or form. You can think of the siloed platforms that I&#8217;m talking about. My children have been raised with those and so just even making the argument about open source is hard enough.</p>



<p class="wp-block-paragraph">So I think what I&#8217;m really advocating for is, obviously we&#8217;ve got to shepherd these people in, but at the same time, I think we have to be willing to let go of a lot of the things that we think the project is. We think the Meetup should contain. We think the WordCamp should maintain. Because at the end of the day, we&#8217;re competing for eyeballs and if we don&#8217;t make it, I&#8217;m going to use the word exciting, if we don&#8217;t make it exciting, they&#8217;re just not going to show up.</p>



<p class="wp-block-paragraph">And I feel that&#8217;s a piece of the next five, six years, trying to figure out what excites these people. Because unless we do excite them, I fear the Meetups are going to be empty and there&#8217;ll be a certain throughput from the WordPress initiatives, Campus Connect and what have you. But we need to make these things exciting, interesting, innovative, fun. But I don&#8217;t have an answer to that.</p>



<p class="wp-block-paragraph">[00:36:59] <strong>Jonathan Desrosiers:</strong> Yeah, you touched on something interesting that I&#8217;ve been thinking about quite a bit. I gave a talk last year about how to implement AI into open source communities while maintaining what makes them great in the first place, which is the human element, right? The community aspects of it.</p>



<p class="wp-block-paragraph">And so I&#8217;ve been thinking a lot about just AI and how it&#8217;s affecting us. And there&#8217;s a few things that I&#8217;m really excited about with AI and those are empowerment and learning. And so you can have an AI model that digests massive amounts of information and summarises it in the specific way that you learn best, right?</p>



<p class="wp-block-paragraph">And likewise, I&#8217;m noticing that people feel more empowered to try things themselves because they have more of an ability to distill a lot of information down into something that&#8217;s digestible, right?</p>



<p class="wp-block-paragraph">And so I feel that the tension between those two areas of closed and open is growing. Because when I was growing up, computers were just starting to be less than the size of a car, right? People were starting to have them in their house. But they were still at a point where, the computer went bad, you took it apart and fixed it. You didn&#8217;t trade it in for a new one, right?</p>



<p class="wp-block-paragraph">And so I feel like my generation, there was a level of, we had the tools, but we had to go out and build the things we needed ourselves in some ways, and experiment. And then there&#8217;s been the generations between that and now where they pretty much had everything that they needed.</p>



<p class="wp-block-paragraph">But AI is changing what we need, or what we want, and what ways we want it. And so now there&#8217;s a new found need to build again in some ways. And in some ways it&#8217;s kind of a circle, right? Because it&#8217;s, the AI is making it easier to build, but it&#8217;s also making you more aware you have to build. It&#8217;s kind of like building against itself in certain ways.</p>



<p class="wp-block-paragraph">But I&#8217;m finding that there&#8217;s more of a willingness to do things on your own, try to tackle something you would typically need to hire a professional to do in the past. You know in many ways we need to lean into that because then that gets people excited. Oh, WordPress, I could use WordPress to build this, or I could use just the WordPress for just the database part of it and the REST API and have some type of application on it because it scales well and it caches or whatever it may be.</p>



<p class="wp-block-paragraph">But I feel like people are starting to scoff at the walled gardens a little bit more, and I&#8217;m seeing that there&#8217;s a resurgence in things like RSS. I&#8217;m seeing new RSS readers are popping up. People are leaning towards the Fediverse. People are blogging more, having their own website instead of just their business on Facebook, right? Because that can get taken away.</p>



<p class="wp-block-paragraph">We saw with Twitter how they just chose to close their platform. And embeds no longer work in WordPress because they shut down oEmbeds. And I feel like it changes every month, but there&#8217;s times where you have to log in to see a post, or you can&#8217;t see a post, or you can see one post and then you can&#8217;t see any more that&#8217;s shared externally. Yeah, so it gives you more control.</p>



<p class="wp-block-paragraph">[00:40:02] <strong>Nathan Wrigley:</strong> Yeah, I think that&#8217;s really interesting. And I also noticed that swing. Obviously, I don&#8217;t have any broader data. I can only point to the things in my life, the little intuitions that I&#8217;m gaining. But I see the same thing. I see an interest in AI, so we&#8217;ll just put that to one side for a moment. But in terms of the closed platforms, I do see that the people that I know who are significantly younger than me, they have intuitions around that, and they&#8217;ve kind of figured out for themselves that this is not great. It seems to be a vehicle to serve me ads, and I wonder what the incentive is for the stuff that I&#8217;m seeing, and maybe it&#8217;s kind of pushing me off in one direction politically and all of that.</p>



<p class="wp-block-paragraph">And yeah, this resurgence of RSS, of the blog. I know it&#8217;s hard to talk about, but it&#8217;s almost like we&#8217;re doing some sort of archaeology in the internet space. We&#8217;ve gone back to something older. We kind of dug up the relics from the past and we found that they&#8217;re still usable. They&#8217;re still there.</p>



<p class="wp-block-paragraph">It&#8217;ll be so interesting. But I think if it was just the RSS and it was just the open nature of things, I think that&#8217;s going to be a hard sell. But throw AI into the mix, this capacity for somebody with very little relationship with writing code who can get something credible out. Now, it may not be robust, it may have security problems here and there. The accessibility may be something that needs to be addressed and what have you. But who can argue with the excitement of it.</p>



<p class="wp-block-paragraph">You know, you tell a computer to make a colourful website that&#8217;s got rainbows and pictures of cats, and sure enough, two minutes later you have a website with rainbows and pictures of cats. And that wasn&#8217;t possible until just a couple of years ago. And so I think we&#8217;ve got the tools. I think there&#8217;s things that we can deploy. AI seems to be the primary one at the moment. Let&#8217;s hope that that continues to be sustainable.</p>



<p class="wp-block-paragraph">But that&#8217;s interesting. That gives me some hope. And the way that you&#8217;ve encapsulated it, open source combined with things like AI. Trying to get Meetups back. Trying to combine it with educational initiatives. Trying to combine it with WordCamps and releases.</p>



<p class="wp-block-paragraph">[00:41:52] <strong>Jonathan Desrosiers:</strong> You mentioned something that&#8217;s important there in that it&#8217;s very easy for someone to get something built that they need specifically, right? And I think that&#8217;s where we&#8217;re at right now where AI is, like I said, is empowering, but more on a personal level. Once you need to scale those things, that&#8217;s when it gets difficult.</p>



<p class="wp-block-paragraph">And it&#8217;s a rollercoaster of, oh my God, there&#8217;s going to be no software. And then, oh, look at all this crappy software that AI built. We are always going to have a job. And then it&#8217;s like up and down all throughout time as new tools get released. And it definitely matches what I&#8217;m seeing is like the personal empowerment level, they could take that and run with it and build this really massive thing, or they could just build something that they just want, that does specifically what they want, that they haven&#8217;t found out there that it accomplishes.</p>



<p class="wp-block-paragraph">And I think that another aspect of that is I&#8217;m noticing that a lot of people that you may not have thought would try things in the physical world on their own are more likely to do so as well. So maybe changing their faucet, or doing a landscaping project or something. I feel like we&#8217;ve had YouTube tutorials, right, has been a big thing for maybe a decade, right? But I feel like AI has unlocked a new level of empowerment where people feel more confident to try things because of the knowledge that&#8217;s available to them in different ways.</p>



<p class="wp-block-paragraph">[00:43:09] <strong>Nathan Wrigley:</strong> The year 2026 is going to be punctuated by WordCamps. It&#8217;s going to be punctuated by WordPress releases. Hopefully we will start to see the needle move on educational initiatives, and maybe some younger people joining in with the community.</p>



<p class="wp-block-paragraph">That has been a fascinating chat, Jonathan. I really appreciate that, getting your insight into what I think we both hope is going to happen in the WordPress project. That it will still be relevant in 10 years time, and that there&#8217;ll be children who are now, not old enough to be using computers, in a decade, they&#8217;ll be coming on podcasts like this, and hosting podcasts like this, and being involved in the community that we love so very much.</p>



<p class="wp-block-paragraph">Where can we find you, Jonathan? If people want to talk to you and have a bit of a natter, where&#8217;s the best place to locate you?</p>



<p class="wp-block-paragraph">[00:43:48] <strong>Jonathan Desrosiers:</strong> My website is just jonathandesrosiers.com. I&#8217;m desrosej pretty much everywhere on the internet. I try to keep it consistent and easy. And you can also, of course, find me in the wordpress.org Slack.</p>



<p class="wp-block-paragraph">[00:44:01] <strong>Nathan Wrigley:</strong> I will link to all of those in the show notes. So if you go to the wptavern.com website, search for the episode with Jonathan Desrosiers, you&#8217;ll be able to find all of the links probably at the bottom underneath the transcript and the preamble. Go and have a look down there and hopefully we&#8217;ll be speaking soon. I&#8217;ll probably see you in Mumbai in a few weeks time. Take care, Jonathan.</p>



<p class="wp-block-paragraph">[00:44:21] <strong>Jonathan Desrosiers:</strong> Thank you. Look forward to it, and hopefully I see your listeners there as well.</p>
</div></details>



<p class="wp-block-paragraph">On the podcast today we have <a href="https://profiles.wordpress.org/desrosj/">Jonathan Desrosiers</a>.</p>



<p class="wp-block-paragraph">Jonathan has been involved with WordPress for almost two decades, both as a user and a contributor. He’s a principal software engineer at Bluehost, where his role sees him sponsored to work on WordPress through the Five for the Future program. Over the years, he’s become a Core committer, and has spent many hours thinking about how to enhance the contributor experience and make it easier for people to get involved in the project.</p>



<p class="wp-block-paragraph">In this episode we discuss how WordPress releases might be made more impactful by synchronizing them with flagship community events like WordCamps and State of the Word. A recent experiment of combining a major release with a live event sparked some excitement, and Jonathan shares insights on the logistics behind such synchronized moments, the challenges posed by international holidays and regional scheduling, and the broader vision for connecting releases with community gatherings.</p>



<p class="wp-block-paragraph">We also get into the changing landscape of the WordPress community, how it’s recovering from the effects of COVID, the struggle to rebuild local Meetups, and efforts (like mentorship and educational initiatives) to bring in new contributors, particularly from younger generations. Jonathan reflects on the importance of making release moments engaging and fun, akin to the anticipation of a new TV series or software launch, and the role of AI and open source in empowering a new wave of builders.</p>



<p class="wp-block-paragraph">If you’re interested in how release cycles, community events, and contributor onboarding are evolving in WordPress, or what the future might hold for the platform and its community, this episode is for you.</p>



<h2 class="wp-block-heading">Useful links</h2>



<p class="wp-block-paragraph"><a href="https://jonathandesrosiers.com">Jonathan&#8217;s website</a></p>



<p class="wp-block-paragraph"><a href="https://profiles.wordpress.org/desrosj/">Jonathan on WordPress.org</a></p>



<p class="wp-block-paragraph"><a href="https://x.com/desrosj">Jonathan on X</a></p>



<p class="wp-block-paragraph"><a href="https://www.bluehost.com">Bluehost</a></p>



<p class="wp-block-paragraph"><a href="https://wordpress.org/five-for-the-future/">Five for the Future</a></p>



<p class="wp-block-paragraph"><a href="https://wordpress.com/blog/2025/12/04/state-of-the-word-2025-recap/">State of the Word 2025 recap</a></p>



<p class="wp-block-paragraph"><a href="https://events.wordpress.org/campusconnect/">WP Campus Connect</a></p>



<p class="wp-block-paragraph"><a href="https://wordpress.org/education/credits/">WordPress Credits</a></p>



<p class="wp-block-paragraph">Mary Hubbard on the importance of education &#8211; <a href="https://make.wordpress.org/project/2026/01/23/big-picture-goals-for-2026/">Big Picture Goals for 2026</a></p>



<p class="wp-block-paragraph"><a href="https://en.wikipedia.org/wiki/Fediverse">Fediverse</a></p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 25 Feb 2026 15:00:00 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:14:"Nathan Wrigley";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:49;a:6:{s:4:"data";s:21:"
	
	
	
	
	
	
	
	
	
	
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:64:"Open Channels FM: AI Sidekick Features for WooCommerce Merchants";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:34:"https://openchannels.fm/?p=1650257";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:71:"https://openchannels.fm/ai-sidekick-features-for-woocommerce-merchants/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:235:"Katie Keith asks about an AI assistant for WooCommerce like Shopify's Sidekick. James LePage confirms upcoming features will simplify custom AI integration, enabling easier plugin installations and enhanced merchant management support.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 25 Feb 2026 12:32:05 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:8:"Bob Dunn";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:9:{s:6:"server";s:5:"nginx";s:4:"date";s:29:"Wed, 18 Mar 2026 03:07:39 GMT";s:12:"content-type";s:8:"text/xml";s:13:"last-modified";s:29:"Wed, 18 Mar 2026 03:00:21 GMT";s:4:"vary";s:15:"Accept-Encoding";s:15:"x-frame-options";s:10:"SAMEORIGIN";s:16:"content-encoding";s:4:"gzip";s:7:"alt-svc";s:19:"h3=":443"; ma=86400";s:4:"x-nc";s:9:"HIT ord 1";}s:5:"build";i:1764714897;s:21:"cache_expiration_time";i:1773846459;s:23:"__cache_expiration_time";i:1773846459;}