<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web Training Wheels</title>
	<atom:link href="http://webtrainingwheels.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://webtrainingwheels.com</link>
	<description>WordPress &#38; Online Marketing Training // lucy@webtrainingwheels.com</description>
	<lastBuildDate>Tue, 26 May 2026 16:33:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://webtrainingwheels.com/wp-content/uploads/2015/03/cropped-wtw-fav-120-32x32.png</url>
	<title>Web Training Wheels</title>
	<link>https://webtrainingwheels.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>10 Things You Can Learn About Your Site’s Speed From a Waterfall Chart</title>
		<link>https://webtrainingwheels.com/10-things-you-can-learn-about-your-sites-speed-from-a-waterfall-chart/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Mon, 25 May 2026 19:33:28 +0000</pubDate>
				<category><![CDATA[Speed Optimization]]></category>
		<guid isPermaLink="false">https://webtrainingwheels.com/?p=6592</guid>

					<description><![CDATA[PageSpeed is a useful tool for certain metrics but it lacks some specific details.Using a tool that shows you a waterfall chart can give you a different angle on performance. GTMetrix, Webpagetest.org and DebugBear are examples of tools that provide a waterfall chart. What’s a waterfall chart? The waterfall chart shows a list of every ... <p class="read-more-container"><a title="10 Things You Can Learn About Your Site’s Speed From a Waterfall Chart" class="read-more button" href="https://webtrainingwheels.com/10-things-you-can-learn-about-your-sites-speed-from-a-waterfall-chart/#more-6592" aria-label="Read more about 10 Things You Can Learn About Your Site’s Speed From a Waterfall Chart">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-medium"><img fetchpriority="high" decoding="async" width="500" height="183" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/waterfall-feat-image-500x183.jpg" alt="" class="wp-image-6633" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/waterfall-feat-image-500x183.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/waterfall-feat-image-1024x375.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/waterfall-feat-image-768x282.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/waterfall-feat-image.jpg 1364w" sizes="(max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>PageSpeed is a useful tool for certain metrics but it lacks some specific details.<br>Using a tool that shows you a waterfall chart can give you a different angle on performance. <a href="https://gtmetrix.com/" title="">GTMetrix</a>, <a href="https://webpagetest.org" title="">Webpagetest.org</a> and <a href="https://www.debugbear.com/test/website-speed" title="">DebugBear</a> are examples of tools that provide a waterfall chart.</p>



<p><strong>What’s a waterfall chart?</strong></p>



<p>The waterfall chart shows a list of every file that your website loads, in the order that those requests are made.</p>



<p>So it pulls back the curtain and gives you a peek at what’s going on behind the scenes when someone visits your site in their browser. It helps you find bottlenecks, errors and other performance issues.</p>



<span id="more-6592"></span>



<p>Note, you can get a lot of this info in your browser&#8217;s developer tools as well, but using a speed testing service can be more user-friendly and also give you even more details. For example, when using a speed tool, you&#8217;ll be able to check from different locations and devices.</p>



<p>Here’s 10 useful things you can learn when running a speed test using a waterfall chart.</p>



<ol class="wp-block-list">
<li>What’s the Time To First Byte (TTFB)?</li>



<li>Is the visit cached?</li>



<li>How many files are loading?</li>



<li>Are critical files loaded early?</li>



<li>Are files served from your CDN?</li>



<li>Is browser caching applied?</li>



<li>Is compression applied?</li>



<li>Are there any loading errors on files?</li>



<li>The impact of 3rd party content</li>



<li>Are there any unnecessary redirects?</li>
</ol>



<h2 class="wp-block-heading">What’s the Time To First Byte (TTFB)?</h2>



<p>The very first request in the chart represents the server response time. If this is slow, it will affect everything that comes after it, so this metric is critical.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f282bf&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f282bf" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="264" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/TTFB-1024x264.jpeg" alt="" class="wp-image-6594" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/TTFB-1024x264.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/TTFB-500x129.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/TTFB-768x198.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/TTFB-1536x396.jpeg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/TTFB.jpeg 1840w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>The very first line shows which URL is being tested. <code>/</code> means I’m testing the homepage. Under 500ms is ideal. In this case the request takes 373ms which is good.</p>



<p>Compare that to the uncached version of the page, and you can see what a difference page caching makes in TTFB. It takes 1.1s in this result &#8211; 3 times longer.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f28732&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f28732" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="176" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/uncached-ttfb-1024x176.jpeg" alt="" class="wp-image-6622" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/uncached-ttfb-1024x176.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/uncached-ttfb-500x86.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/uncached-ttfb-768x132.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/uncached-ttfb-1536x264.jpeg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/uncached-ttfb.jpeg 1708w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>So sometimes you can see at a glance whether the page is cached or not, but in the next tip we can check more specifically.</p>



<h2 class="wp-block-heading">Is the visit cached?</h2>



<p>There’s a couple of ways to check this.</p>



<p>The first is similar to the above step: Run the URL twice, once normally and once with <code>?nocache</code> appended to the URL (which in most cases will bypass any server or plugin cache). If the page is cached, the TTFB will be much faster on the normal URL compared to the <code>?nocache</code> URL.</p>



<p>The second way to check is by looking at the headers on the request to see if any server cache indicators are present. Some cache plugins may also add headers but others (like WP Rocket ) don’t, so this is not a reliable way to see if your caching plugin is working, but can be used to check if a server cache is applied. </p>



<p>In GT Metrix, to check the headers, click on the request to expand it and reveal the <em>Headers</em> tab.<br>Here we can see that this site is cached by Cloudflare:</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f28bd2&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f28bd2" class="aligncenter size-medium wp-lightbox-container"><img decoding="async" width="500" height="234" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/cached-by-cloudflare-500x234.jpeg" alt="" class="wp-image-6596" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/cached-by-cloudflare-500x234.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/cached-by-cloudflare-1024x480.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/cached-by-cloudflare-768x360.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/cached-by-cloudflare-1536x720.jpeg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/cached-by-cloudflare.jpeg 1800w" sizes="(max-width: 500px) 100vw, 500px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p>This site’s server has a server cache, but it wasn’t used on this response, as we can see by the <em>MISS</em> on the <em>x-proxy-cache</em> header. </p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f28fd4&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f28fd4" class="aligncenter size-medium wp-lightbox-container"><img decoding="async" width="500" height="251" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/server-cache-miss-500x251.jpeg" alt="" class="wp-image-6597" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/server-cache-miss-500x251.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/server-cache-miss-1024x515.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/server-cache-miss-768x386.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/server-cache-miss.jpeg 1368w" sizes="(max-width: 500px) 100vw, 500px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p>Almost all CDN/server caches have some sort of custom header to show this information &#8211; you can check their documentation for the specific details.</p>



<p>If it’s not cached you’ll typically see <code>MISS</code> or <code>BYPASSED</code>.</p>



<h2 class="wp-block-heading">How many files are loading?</h2>



<p>A lot of people think “I have a simple site, it shouldn’t be slow” but they don’t realize how bloated or chunky their page is. </p>



<p>While file count is not the be all and end all of performance, having a realistic look at what’s actually loading on the page can be eye-opening. Perhaps your “simple” page isn’t that simple after all.</p>



<p>In GTMetrix, the overall size is at the bottom of the waterfall: </p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f2948c&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f2948c" class="aligncenter size-medium wp-lightbox-container"><img decoding="async" width="497" height="500" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/request-number-1-497x500.jpeg" alt="" class="wp-image-6611" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/request-number-1-497x500.jpeg 497w, https://webtrainingwheels.com/wp-content/uploads/2026/05/request-number-1-1017x1024.jpeg 1017w, https://webtrainingwheels.com/wp-content/uploads/2026/05/request-number-1-100x100.jpeg 100w, https://webtrainingwheels.com/wp-content/uploads/2026/05/request-number-1-768x773.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/request-number-1.jpeg 1246w" sizes="(max-width: 497px) 100vw, 497px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p>Generally speaking, fewer files are better. Of course there are exceptions &#8211; one massive JavaScript file that runs complicated functions might tank your site more than 10 tiny images. But outside of exceptions, fewer files are better.</p>



<h2 class="wp-block-heading">Are critical files loaded early enough?</h2>



<p>Requests related to your Largest Contentful Paint element, such as the main image, or the font if your LCP is text, should show up in the waterfall at or near the top. </p>



<p>Here you can see the difference between a preloaded image and a non-preloaded image:</p>



<figure class="wp-block-gallery has-nested-images columns-default wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f298e5&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f298e5" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="982" height="306" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" data-id="6614" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/gtmetrix-preloaded-image.jpeg" alt="" class="wp-image-6614" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/gtmetrix-preloaded-image.jpeg 982w, https://webtrainingwheels.com/wp-content/uploads/2026/05/gtmetrix-preloaded-image-500x156.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/gtmetrix-preloaded-image-768x239.jpeg 768w" sizes="(max-width: 982px) 100vw, 982px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">LCP iimage is the 2nd request</figcaption></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f29c18&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f29c18" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="786" height="824" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" data-id="6613" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/image-not-preloaded.jpeg" alt="" class="wp-image-6613" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/image-not-preloaded.jpeg 786w, https://webtrainingwheels.com/wp-content/uploads/2026/05/image-not-preloaded-477x500.jpeg 477w, https://webtrainingwheels.com/wp-content/uploads/2026/05/image-not-preloaded-768x805.jpeg 768w" sizes="(max-width: 786px) 100vw, 786px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">LCP image is found near the bottom of the waterfall </figcaption></figure>
</figure>



<p>In the first screenshot, the LCP image is preloaded and is therefore the second request in the list. In the second screenshot, the LCP image is not preloaded and is found near the bottom of the waterfall. </p>



<p>If the LCP element isn&#8217;t loaded until late in the waterfall, this is likely to adversely affect the LCP metric. </p>



<p><a href="https://www.debugbear.com/test/website-speed/" target="_blank" rel="noopener" title="">DebugBear&#8217;s free website test tool</a> is very useful for checking this because it labels the LCP element, preloaded elements and requests with <code>fetchpriority=high</code>:</p>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><img decoding="async" width="500" height="246" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/debugbear-preload-500x246.jpeg" alt="" class="wp-image-6615" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/debugbear-preload-500x246.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/debugbear-preload-1024x504.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/debugbear-preload-768x378.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/debugbear-preload.jpeg 1110w" sizes="(max-width: 500px) 100vw, 500px" /></figure>
</div>


<h2 class="wp-block-heading">Is a file served from your CDN?</h2>



<p>There’s a couple of ways to check this depending on what kind of CDN you use.</p>



<p>If you use a pull CDN like Bunny CDN, the file will be loaded from their domain, or a custom domain you set up. In that case, it’s easy to check the domain column for that. In the below screenshot, <code>keyloop.b-cdn.net</code> is the CDN domain serving the assets:</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f2a3d8&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f2a3d8" class="aligncenter size-medium wp-lightbox-container"><img decoding="async" width="500" height="313" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/cdn-check-500x313.jpeg" alt="" class="wp-image-6603" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/cdn-check-500x313.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/cdn-check.jpeg 752w" sizes="(max-width: 500px) 100vw, 500px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p>However, if you are using a CDN like Cloudflare or similar where you’ve pointed your DNS to it and all the files use your own domain name, you can check by looking at the headers on a specific file. In this case, the CSS file is served from Cloudflare:</p>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><img decoding="async" width="500" height="277" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/file-cached-on-cloudflare-500x277.jpeg" alt="" class="wp-image-6626" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/file-cached-on-cloudflare-500x277.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/file-cached-on-cloudflare-1024x567.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/file-cached-on-cloudflare-768x426.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/file-cached-on-cloudflare.jpeg 1368w" sizes="(max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>The headers will also help you to see if the file has been cached at a specific CDN PoP (Point of Presence, the location of the server it was served from) as well.</p>



<p>Click on the file you’re interested in and check for a cache header and HIT. The server header shows exactly which PoP it came from. </p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f2ac52&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f2ac52" class="aligncenter size-medium wp-lightbox-container"><img decoding="async" width="500" height="416" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/cdn-cache-check-500x416.jpeg" alt="" class="wp-image-6604" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/cdn-cache-check-500x416.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/cdn-cache-check-1024x852.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/cdn-cache-check-768x639.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/cdn-cache-check.jpeg 1180w" sizes="(max-width: 500px) 100vw, 500px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<h2 class="wp-block-heading">Is browser caching applied?</h2>



<p>Click on a specific file and check the headers. <a href="https://webtrainingwheels.com/browser-caching-wordpress/" title="Browser Caching in WordPress">Browser caching can be applied in a couple of different ways</a>. Generally you should see a <code>cache-control</code> or <code>expires</code> header. You may see <code>etag</code> although that tends to be a bit less common.</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f2b34c&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f2b34c" class="aligncenter size-medium wp-lightbox-container"><img decoding="async" width="500" height="244" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/browser-caching-500x244.jpeg" alt="" class="wp-image-6605" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/browser-caching-500x244.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/browser-caching-1024x501.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/browser-caching-768x375.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/browser-caching.jpeg 1256w" sizes="(max-width: 500px) 100vw, 500px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p>The max-age number is in seconds. If the value is too small, less than a few months, most testing tools will flag it in the browser caching section of their recommendations. </p>



<h2 class="wp-block-heading">Is compression applied?</h2>



<p>Again check the headers of a specific file and look for <code>content-encoding</code>.</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f2baad&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f2baad" class="aligncenter size-medium wp-lightbox-container"><img decoding="async" width="500" height="331" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/CSS-compressed-with-brotli-500x331.jpeg" alt="" class="wp-image-6630" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/CSS-compressed-with-brotli-500x331.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/CSS-compressed-with-brotli-1024x679.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/CSS-compressed-with-brotli-768x509.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/CSS-compressed-with-brotli.jpeg 1086w" sizes="(max-width: 500px) 100vw, 500px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<p><br>You should see either br (for Brotli), gzip or, zstd. These are different forms of compression. As long as one of them is applied, you’re all set.</p>



<h2 class="wp-block-heading">Loading errors on files</h2>



<p>Check the status column for this. Files that are responding correctly, without an error or redirect will have a <code>200</code> response. </p>



<p>Other response codes will likely require further investigation. The most common error you might see in a waterfall is a 404. That means the file does not exist.<br><br>In some cases 404 errors might take a long time for the server to resolve, or could block other files coming later. </p>



<p>So addressing any errors will help overall speed as well as prevent a poor user experience due to missing content etc</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f2c35f&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f2c35f" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="206" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/errors-1024x206.jpeg" alt="" class="wp-image-6601" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/errors-1024x206.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/errors-500x101.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/errors-768x155.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/errors-1536x309.jpeg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/errors.jpeg 1630w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p></p>



<h2 class="wp-block-heading">3rd party content</h2>



<p>3rd party content refers to files that are hosted from another domain, that is not your own. Common examples are tracking scripts, Google tag manager, Facebook scripts, etc They are bad for a few reasons:</p>



<ul class="wp-block-list">
<li>Connecting to an external domain adds extra time</li>



<li>They often result in request chains &#8211; that is, the first file brings in another file and so on. This leads to a cascade of files being shoved into your site which take time and processing power to load.</li>



<li>If anything goes wrong with the external server it’s possible for that failure to load the file to block any file that should come after it and prevent your site from working correctly. </li>



<li>You don’t control the file so if the 3rd party does not add browser caching, compression etc, it will bring down your scores and you can’t usually fix it.</li>
</ul>



<p>Scanning the domain list will quickly show you where files are loading from. In the screenshot below you can see that there are numerous files related to <code>klaviyo</code> which are chained from the initial file <code>klaviyo.js</code> at the top of the screenshot:</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f2cbf5&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f2cbf5" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="508" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/3rd-party-request-chain-1024x508.jpeg" alt="" class="wp-image-6608" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/3rd-party-request-chain-1024x508.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/3rd-party-request-chain-500x248.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/3rd-party-request-chain-768x381.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/3rd-party-request-chain-1536x762.jpeg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/3rd-party-request-chain-2048x1016.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p></p>



<h2 class="wp-block-heading">Redirects</h2>



<p>Redirects are bad for performance because they add extra time to get to the final destination. If a browser requests a file and it gets redirected from one URL to another, it will take longer to retrieve and download that file.</p>



<p>Checking the waterfall will reveal such redirects.<br>Look for a <code>301 or 302</code> response in the status column. </p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f2d27f&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f2d27f" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="433" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/redirect-1024x433.jpeg" alt="" class="wp-image-6607" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/redirect-1024x433.jpeg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/redirect-500x211.jpeg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/redirect-768x324.jpeg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/redirect-1536x649.jpeg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/redirect-2048x865.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><br>In this example, <code>cat1.jpg</code> is redirecting to <code>cat.jpg</code>. The redirect takes one second, which is wasted time. It also pushes the real image to be loaded later on in the list. So, bad news all around. Avoid redirects unless absolutely necessary.</p>



<p>This list does not represent an exhaustive list of all that can be learned from a waterfall, but it covers the most common and useful cases. </p><div id="webtr-1764381568" class="webtr-content"><script>
var gform;gform||(document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),document.addEventListener("gform/theme/scripts_loaded",function(){gform.themeScriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,themeScriptsLoaded:!1,isFormEditor:()=>"function"==typeof InitializeEditor,callIfLoaded:function(o){return!(!gform.domLoaded||!gform.scriptsLoaded||!gform.themeScriptsLoaded&&!gform.isFormEditor()||(gform.isFormEditor()&&console.warn("The use of gform.initializeOnLoaded() is deprecated in the form editor context and will be removed in Gravity Forms 3.1."),o(),0))},initializeOnLoaded:function(o){gform.callIfLoaded(o)||(document.addEventListener("gform_main_scripts_loaded",()=>{gform.scriptsLoaded=!0,gform.callIfLoaded(o)}),document.addEventListener("gform/theme/scripts_loaded",()=>{gform.themeScriptsLoaded=!0,gform.callIfLoaded(o)}),window.addEventListener("DOMContentLoaded",()=>{gform.domLoaded=!0,gform.callIfLoaded(o)}))},hooks:{action:{},filter:{}},addAction:function(o,r,e,t){gform.addHook("action",o,r,e,t)},addFilter:function(o,r,e,t){gform.addHook("filter",o,r,e,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,r){gform.removeHook("action",o,r)},removeFilter:function(o,r,e){gform.removeHook("filter",o,r,e)},addHook:function(o,r,e,t,n){null==gform.hooks[o][r]&&(gform.hooks[o][r]=[]);var d=gform.hooks[o][r];null==n&&(n=r+"_"+d.length),gform.hooks[o][r].push({tag:n,callable:e,priority:t=null==t?10:t})},doHook:function(r,o,e){var t;if(e=Array.prototype.slice.call(e,1),null!=gform.hooks[r][o]&&((o=gform.hooks[r][o]).sort(function(o,r){return o.priority-r.priority}),o.forEach(function(o){"function"!=typeof(t=o.callable)&&(t=window[t]),"action"==r?t.apply(null,e):e[0]=t.apply(null,e)})),"filter"==r)return e[0]},removeHook:function(o,r,t,n){var e;null!=gform.hooks[o][r]&&(e=(e=gform.hooks[o][r]).filter(function(o,r,e){return!!(null!=n&&n!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][r]=e)}});
</script>

                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>Phone</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='axfE2jv0oaN/2E794jVmWnuEjsoLUUB4E30iQYWkKLveVzkr38XBmyES5/Vk5/F0q5eaAPwJXRvHeufF/7Z5o6b9cVZLL/yjic+HrE2Olk6Bg/0=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to fix LCP request discovery in WordPress</title>
		<link>https://webtrainingwheels.com/fix-lcp-request-discovery-wordpress/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Fri, 15 May 2026 22:24:28 +0000</pubDate>
				<category><![CDATA[Speed Optimization]]></category>
		<guid isPermaLink="false">https://webtrainingwheels.com/?p=6570</guid>

					<description><![CDATA[The LCP Request Discovery recommendation in PageSpeed helps you to improve the Largest Contentful Paint (LCP) metric on your page. The LCP element is the biggest piece of content above the fold on your page. It could be an image, a piece of text or a video. In PageSpeed, the request discovery audit is related ... <p class="read-more-container"><a title="How to fix LCP request discovery in WordPress" class="read-more button" href="https://webtrainingwheels.com/fix-lcp-request-discovery-wordpress/#more-6570" aria-label="Read more about How to fix LCP request discovery in WordPress">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="214" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/Pagespeed-LCP-request-discovery-1024x214.jpg" alt="" class="wp-image-6572" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/Pagespeed-LCP-request-discovery-1024x214.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Pagespeed-LCP-request-discovery-500x104.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Pagespeed-LCP-request-discovery-768x160.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Pagespeed-LCP-request-discovery-1536x321.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Pagespeed-LCP-request-discovery.jpg 1954w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>The <em>LCP Request Discovery</em> recommendation in PageSpeed helps you to improve the Largest Contentful Paint (LCP) metric on your page.</p>



<p>The LCP element is the biggest piece of content above the fold on your page. It could be an image, a piece of text or a video. In PageSpeed, the request discovery audit is related to images.</p>



<span id="more-6570"></span>



<p>When your LCP element is an image, PageSpeed has 3 criteria:</p>



<ol class="wp-block-list">
<li>The image should <em>not</em> be LazyLoaded</li>



<li><code>fetchpriority=high</code> should be applied to the image tag</li>



<li>The request for the image should be found directly in the HTML (not in a separate CSS file). </li>
</ol>



<p>Let&#8217;s examine these in more detail.</p>



<h3 class="wp-block-heading">The image should not be LazyLoaded</h3>



<p>This might feel counter-intuitive at first because we&#8217;re always told to use LazyLoading to improve the performance of our images. But LazyLoad essentially holds off on loading images until the user scrolls to that point in the page. Because the LCP image is above-the-fold and should be visible to the user right away, it needs to load immediately. So it should be excluded from LazyLoad.</p>



<p>If you’re using an optimization plugin, this might be done for you as part of a specific feature, like <a class="thirstylink" rel="nofollow" target="_blank" title="WP Rocket" href="https://webtrainingwheels.com/recommends/wp-rocket/" data-shortcode="true">WP Rocket’s</a> <a href="https://docs.wp-rocket.me/article/1816-optimize-critical-images" title="">Optimize Critical Images</a>.</p>



<p>Otherwise you should manually exclude your LCP image from being LazyLoaded.</p>



<p></p>



<h3 class="wp-block-heading">&#8220;fetchpriority=high&#8221; should be used</h3>



<p><code>fetchpriority=high</code> is a message to the browser, telling it that this file is important and should be downloaded ahead of other files that are less important and have a lower priority. </p>



<p>Applying this directive to the LCP image or its preload request will satisfy PageSpeed.</p>



<p>It looks like this when applied:</p>



<p><strong>Image code</strong></p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f3d216&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f3d216" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="82" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/fetchpriority-1024x82.jpg" alt="" class="wp-image-6573" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/fetchpriority-1024x82.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/fetchpriority-500x40.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/fetchpriority-768x62.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/fetchpriority.jpg 1520w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><strong>Preload code</strong></p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f3d7c0&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f3d7c0" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="150" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/preload-fetchpriority-1024x150.jpg" alt="" class="wp-image-6574" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/preload-fetchpriority-1024x150.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/preload-fetchpriority-500x73.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/preload-fetchpriority-768x113.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/preload-fetchpriority-1536x226.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/preload-fetchpriority.jpg 1620w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>WordPress already adds this to the <a href="https://make.wordpress.org/core/2023/07/13/image-performance-enhancements-in-wordpress-6-3/" title="">relevant images automatically, as of version 6.3</a>, so you likely don&#8217;t have to worry about this on your images.</p>



<p>But if you are manually adding preload requests to your code, you should make sure to include <code>fetchpriority="high"</code> .</p>



<p>If you&#8217;re using <a class="thirstylink" rel="nofollow" target="_blank" title="Perfmatters" href="https://webtrainingwheels.com/recommends/perfmatters/" data-shortcode="true">Perfmatters</a>, you can configure that in the <em>Preloading</em> settings:</p>


<div class="wp-block-image">
<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f3dd72&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f3dd72" class="aligncenter size-large wp-lightbox-container"><img decoding="async" width="1024" height="243" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/perfmatters-preload-fetchpriority-1024x243.jpg" alt="" class="wp-image-6580" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/perfmatters-preload-fetchpriority-1024x243.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/perfmatters-preload-fetchpriority-500x119.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/perfmatters-preload-fetchpriority-768x182.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/perfmatters-preload-fetchpriority-1536x365.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/perfmatters-preload-fetchpriority-2048x486.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>


<h3 class="wp-block-heading"><br>The image request should be discoverable in initial document</h3>



<p>The initial document means the HTML of your page, i.e what you see when you go to <em>View Source</em> in your browser.</p>



<p>The most common case for the image request not being in the HTML is because you&#8217;re using a background image on an element, where the background image URL is defined in a CSS file.</p>



<p>It&#8217;ll look something like this: </p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f3e399&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f3e399" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" width="1000" height="481" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/background-image-in-css.jpg" alt="" class="wp-image-6581" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/background-image-in-css.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2026/05/background-image-in-css-500x241.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/background-image-in-css-768x369.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>In the above case, the cat image is set as the background image for a specific block, and is specified in the <code>bgcss.css</code> file. This means the browser has to do some hunting to find this important image.</p>



<p>In this case the image must be preloaded to satisfy PageSpeed and ensure that the browser can quickly download the image. </p>



<p>Now, just because your image is found directly in the HTML, that doesn&#8217;t mean it&#8217;s fully optimized for LCP. </p>



<p><a href="https://webtrainingwheels.com/how-to-preload-key-requests-in-wordpress/" title="How to Preload Key Requests in WordPress">Preloading your LCP image</a> is one of the most impactful changes you can make, even if your image is already directly in the HTML.</p>



<p>The above methods will satisfy PageSpeed&#8217;s recommendation to fix the LCP request discovery, but your LCP optimization shouldn&#8217;t stop there. </p>



<p>Removing <a href="https://webtrainingwheels.com/reduce-unused-css-wordpress/" title="Reduce Unused CSS in WordPress">render-blocking CSS</a> and <a href="https://webtrainingwheels.com/remove-unused-javascript-in-wordpress/" title="Reduce unused JavaScript in WordPress">JavaScript</a>, as well as using a CDN and having a <a href="https://webtrainingwheels.com/how-to-improve-the-time-to-first-byte-ttfb-of-your-wordpress-site/" title="How to improve the Time To First Byte (TTFB) of your WordPress site">fast TTFB</a> will all contribute to a fast LCP.</p><div id="webtr-4074384799" class="webtr-content">
                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>URL</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='y1WnG4fgOsEr+NUn0Gnz5gcQl71hoC9h53EtnNZm1MJWxcROnYelF/X833UBqveHFtrlSxayKIW5JOD7SsrU5uYcoaULhlvVMJbOV3gJUfNl4fI=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>



<p></p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Fix &#8220;Autoloaded Options Could Affect Performance&#8221; Warning in Site Health</title>
		<link>https://webtrainingwheels.com/how-to-fix-autoloaded-options-could-affect-performance-warning-in-site-health/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Tue, 05 May 2026 19:29:15 +0000</pubDate>
				<category><![CDATA[Speed Optimization]]></category>
		<guid isPermaLink="false">https://webtrainingwheels.com/?p=6540</guid>

					<description><![CDATA[In the Site Health section of your WordPress site you might see the warning:Autoloaded options could affect performance This is related to the options that themes and plugins request on every page load of your site. If there are too many, it will slow down the load time of the page. The Site Health warning ... <p class="read-more-container"><a title="How to Fix &#8220;Autoloaded Options Could Affect Performance&#8221; Warning in Site Health" class="read-more button" href="https://webtrainingwheels.com/how-to-fix-autoloaded-options-could-affect-performance-warning-in-site-health/#more-6540" aria-label="Read more about How to Fix &#8220;Autoloaded Options Could Affect Performance&#8221; Warning in Site Health">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="620" height="250" src="https://webtrainingwheels.com/wp-content/uploads/2018/01/speed-testing-tools-620x250.jpg" alt="" class="wp-image-3225" srcset="https://webtrainingwheels.com/wp-content/uploads/2018/01/speed-testing-tools-620x250.jpg 620w, https://webtrainingwheels.com/wp-content/uploads/2018/01/speed-testing-tools-620x250-500x202.jpg 500w" sizes="(max-width: 620px) 100vw, 620px" /></figure>
</div>


<p>In the Site Health section of your WordPress site you might see the warning:<br><strong>Autoloaded options could affect performance</strong></p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f48727&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f48727" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="281" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/Site-Health-Autoloaded-Options-1024x281.jpg" alt="" class="wp-image-6541" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/Site-Health-Autoloaded-Options-1024x281.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Site-Health-Autoloaded-Options-500x137.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Site-Health-Autoloaded-Options-768x211.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Site-Health-Autoloaded-Options-1536x421.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Site-Health-Autoloaded-Options.jpg 1656w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>This is related to the options that themes and plugins request on every page load of your site. If there are too many, it will slow down the load time of the page. The Site Health warning triggers when the options are above 800kb.</p>



<span id="more-6540"></span>



<h2 class="wp-block-heading">What problem does too many autoloaded options cause?</h2>



<p>To simplify, the more options that are autoloaded, the bigger the database request becomes. The bigger the request, the slower your page will load. </p>



<p>This problem will primarily affect backend and uncached pages. When a page is cached there won’t be any database calls so this problem won’t be noticeable.</p>



<p>But on important pages that can’t be cached, like cart and checkout pages, if database queries are slow, it can affect the overall load time. If you have a high traffic site, the problem will compound. A slow server response time leads to other metrics like LCP being slower and this will affect your site’s Core Web Vitals.</p>



<p>It can also affect the backend performance and you&#8217;ll notice a sluggish experience. </p>



<p>Using object caching, like Redis, can help mitigate such issues, but it’s better to address the problem at the source.</p>



<h2 class="wp-block-heading">How to fix too many autoloaded options?</h2>



<p>To fix this recommendation you’ll need a database clean-up plugin. In this article we&#8217;ll look at two tools you can use: </p>



<ul class="wp-block-list">
<li>For beginners: <a href="https://wordpress.org/plugins/aaa-option-optimizer/">AAA Option Optimizer</a></li>



<li>For more advanced/power users: <a href="https://wordpress.org/plugins/advanced-database-cleaner/">Advanced Database Cleaner</a></li>
</ul>



<p><em>AAA Option Optimizer</em> is a bit more user-friendly compared to <em>Advanced Database Cleaner</em> which has a lot more features and a less intuitive interface.</p>



<p>I’ll show you how to use both.</p>



<h2 class="wp-block-heading">Guidelines before you get started</h2>



<p>It’s important to know that autoloading options isn’t inherently bad, and the goal isn’t to have zero autoloaded options.</p>



<p>The goal here is to restore balance, and have a sensible amount of autoloading, and only for those plugins/themes that are actually in use.</p>



<p>Felix Arntz has a great article about the ins and outs of it. If you want a deeper, more technical understanding of the topic, <a href="https://felix-arntz.me/blog/autoloading-wordpress-options-efficiently-and-responsibly/" title="">I recommend reading his guide</a>. </p>



<p><strong>So what <em>should</em> be autoloaded?</strong></p>



<p>Common wisdom is that the following can and should be autoloaded:</p>



<ul class="wp-block-list">
<li>Core WordPress options</li>



<li>Your active theme’s options</li>



<li>Active plugins’ options &#8211; which are used on most/all page loads</li>
</ul>



<p><strong>What should not be autoloaded?</strong></p>



<p>As you go through the process, you’ll probably find that a lot of options are being loaded which are associated with deactivated or deleted plugins and themes, and these are low-hanging fruit to clean up.</p>



<p>Since you&#8217;ll be working with the database, it&#8217;s best practice to make a backup first, just in case. </p>



<h2 class="wp-block-heading">AAA Option Optimizer</h2>



<p>The reason I like this plugin for beginners is that it is focused specifically on fixing autoloaded options, nothing else, and the interface is easier to manage than Advanced Database Cleaner. </p>



<p>After installing the plugin, its <a href="https://joost.blog/cleaning-up-wordpress-option-clutter/">author recommends</a> that you click around your site and load some pages, both frontend and backend pages. This allows the plugin to try and detect which options are being used and which aren&#8217;t.</p>



<p>After that, go to <em>Tools > Option Optimizer</em> to find the plugin settings. </p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f497a5&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f497a5" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="487" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/option-optimizer-settings-1024x487.jpg" alt="" class="wp-image-6544" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/option-optimizer-settings-1024x487.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/option-optimizer-settings-500x238.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/option-optimizer-settings-768x365.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/option-optimizer-settings-1536x731.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/option-optimizer-settings-2048x974.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>You’ll mostly be concerned with the <em>Unused, but autoloaded</em> tab.<br>Click on the size column to sort it with the largest entries first.</p>



<p>Now you have to review the options and try to confirm if they should be autoloaded or not. Since the plugin has determined they are unused, your job is to double-check that.</p>



<h3 class="wp-block-heading">How to check which theme or plugin an option belongs to</h3>



<p>The <em>Source</em> column will let you know where the option is coming from  &#8211; WordPress core, or from a theme or plugin. </p>



<p>However, you will likely see a lot of &#8220;unknown&#8221; which makes things a little trickier. </p>



<p>Sometimes the name of the option will obviously indicate its source, e.g. <code> rank-math-options-titles </code>is clearly from the Rank Math plugin.<br></p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f4a062&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f4a062" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="427" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/rank-math-option-1024x427.jpg" alt="" class="wp-image-6551" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/rank-math-option-1024x427.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/rank-math-option-500x208.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/rank-math-option-768x320.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/rank-math-option-1536x640.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/rank-math-option.jpg 1670w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>But others may be less obvious. In that case, there are a few things you can try:</p>



<h4 class="wp-block-heading">Click <em>show</em> to see the contents of the option</h4>



<p>Seeing what&#8217;s saved in the option will give you further clues. I checked <code>woo_template</code> which I wasn&#8217;t sure if it was related to WooCommerce. In the options I can see it&#8217;s coming from an ancient theme that I no longer have installed on the site: </p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f4a7f7&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f4a7f7" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="329" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/woo-template-1024x329.jpg" alt="" class="wp-image-6552" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/woo-template-1024x329.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/woo-template-500x160.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/woo-template-768x247.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/woo-template-1536x493.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/woo-template-2048x657.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><br>In this case I&#8217;d delete the data instead of just preventing the autoload. </p>



<h4 class="wp-block-heading">Google the option name</h4>



<p>A simple Google search will often let you know what the option name is related to. </p>



<h4 class="wp-block-heading">Use String Locator to search your site</h4>



<p>Use a plugin like <a href="https://wordpress.org/plugins/string-locator/" title="">String Locator</a> to search for the option name &#8211; you will likely find it in some plugin files.</p>



<p>In the screenshot below, I searched for an option I found called <code>ssa_settings_json</code> and found it within the Simply Schedule Appointments plugin: </p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f4b11b&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f4b11b" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="174" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/ssa_settings_json-1024x174.jpg" alt="" class="wp-image-6554" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/ssa_settings_json-1024x174.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/ssa_settings_json-500x85.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/ssa_settings_json-768x131.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/ssa_settings_json-1536x262.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/ssa_settings_json.jpg 1632w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>Based on whether or not that plugin is currently active on my site, I would either keep it autoloaded if it&#8217;s active, or unload it otherwise. </p>



<h2 class="wp-block-heading">Advanced DB Cleaner</h2>



<p>This plugin does more than let you manage autoloaded options, so the various settings might be overwhelming for a beginner. But it&#8217;s a great plugin for cleaning up various parts of your database.</p>



<p>To work on autoloaded options, click on <em>Options</em> from its menu.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="598" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/Advanced-DB-Cleaner-Autoload-Filter-1024x598.jpg" alt="" class="wp-image-6548" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/Advanced-DB-Cleaner-Autoload-Filter-1024x598.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Advanced-DB-Cleaner-Autoload-Filter-500x292.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Advanced-DB-Cleaner-Autoload-Filter-768x449.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/Advanced-DB-Cleaner-Autoload-Filter.jpg 1030w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><br>You’ll probably see the Autoload size warning here and you can click <em>Filter</em> to see the list sorted by the largest items.</p>



<p>Unfortunately in the free version it won’t detect which theme/plugins options are associated with. You would <a class="thirstylink" rel="nofollow" target="_blank" title="Advanced DB cleaner pro" href="https://webtrainingwheels.com/recommends/advanced-db-cleaner-pro/" data-shortcode="true">need the Pro version</a> for that. So you can use the steps provided above to determine which plugins/themes the options are associated with</p>



<p>To either delete the data or turn the autoload off, click the 3 dots at the right and make your selection.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f4bb75&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f4bb75" class="wp-block-image size-large wp-lightbox-container"><img decoding="async" width="1024" height="183" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/db-cleanup-1024x183.jpg" alt="" class="wp-image-6555" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/db-cleanup-1024x183.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2026/05/db-cleanup-500x89.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/db-cleanup-768x137.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2026/05/db-cleanup-1536x275.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2026/05/db-cleanup-2048x366.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>Advanced Database Cleaner will let you know when your autoloaded options are back at a sensible level: </p>



<figure class="wp-block-image size-medium"><img decoding="async" width="500" height="358" src="https://webtrainingwheels.com/wp-content/uploads/2026/05/advanced-db-cleaner-autoload-good-500x358.jpg" alt="" class="wp-image-6556" srcset="https://webtrainingwheels.com/wp-content/uploads/2026/05/advanced-db-cleaner-autoload-good-500x358.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2026/05/advanced-db-cleaner-autoload-good.jpg 632w" sizes="(max-width: 500px) 100vw, 500px" /></figure>



<p>If you don&#8217;t change your theme and plugins on your site, you shouldn&#8217;t have to go through this process too often. </p>



<p>But it could be useful to review it after installing/removing plugins or switching your theme, to avoid outdated data building up. </p><div id="webtr-2515959185" class="webtr-content">
                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>URL</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='NoImQtbtppvyaub3n5hkBbq7qnCYj7sviUbH6UQbfzziDdxt3dNg0Ge8W+bktMpeuDDSoLN4z+cGte+ZouzVnr1izA/5RFzwI81ZGNPzolJCV28=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Edit Homepage Content in a WordPress Block Theme</title>
		<link>https://webtrainingwheels.com/how-to-edit-homepage-content-in-a-wordpress-block-theme/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Sat, 05 Apr 2025 00:40:38 +0000</pubDate>
				<category><![CDATA[WordPress Tutorials - Basic]]></category>
		<category><![CDATA[block themes]]></category>
		<category><![CDATA[full site editing]]></category>
		<guid isPermaLink="false">https://webtrainingwheels.com/?p=6347</guid>

					<description><![CDATA[A common pain point amongst new users of Block Themes is managing homepage content &#8211; how and where to edit it and if that should be done in the template itself. The problem with some block themes is that they put their demo content directly into the template. This can override whatever content you set ... <p class="read-more-container"><a title="How to Edit Homepage Content in a WordPress Block Theme" class="read-more button" href="https://webtrainingwheels.com/how-to-edit-homepage-content-in-a-wordpress-block-theme/#more-6347" aria-label="Read more about How to Edit Homepage Content in a WordPress Block Theme">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="700" height="300" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/block-themes-homepage-700x300-1.jpg" alt="" class="wp-image-6471" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/block-themes-homepage-700x300-1.jpg 700w, https://webtrainingwheels.com/wp-content/uploads/2025/04/block-themes-homepage-700x300-1-500x214.jpg 500w" sizes="(max-width: 700px) 100vw, 700px" /></figure>
</div>


<p></p>



<p>A common pain point amongst new users of Block Themes is managing homepage content &#8211; how and where to edit it and if that should be done in the template itself.</p>



<p>The problem with some block themes is that they put their demo content directly into the template. This can override whatever content you set to show on your homepage. And if you don&#8217;t know better, you&#8217;ll start editing the template to add your own content.</p>



<span id="more-6347"></span>



<p><strong>Template Editing vs. Page Editing</strong></p>



<p>WordPress maintains a separation between content and design. </p>



<p>That means that content like your page-specific text/images etc needs to be placed in the page editor.</p>



<p>The layout and design of your site is managed from the site editor, using templates.</p>



<p>It&#8217;s important not to directly edit the template and add your content there. Otherwise it&#8217;ll cause you headaches and WordPress won&#8217;t act the way you expect.</p>



<p>Here are the 2 biggest problems I&#8217;ve encountered when trying to get started with block themes, and how to fix them. </p>



<p><strong>1. Your own homepage content is overridden by theme content.</strong></p>



<p>You have made some posts and pages already in WordPress. Your site currently uses a static page for the homepage with posts displayed on a dedicated blog page. </p>



<p>You decide to try out a block themes. You install one, let&#8217;s say <a href="https://wordpress.org/themes/beaumont/" target="_blank" rel="noopener" title="">Beaumont</a>.</p>



<p>You activate the theme and visit your homepage. You&#8217;re expecting to see the content you&#8217;ve already carefully crafted.</p>



<p>Instead you find the Beaumont blog layout! </p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/04/beaumont-reading-settings-1.jpg"><img decoding="async" width="1024" height="500" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/beaumont-reading-settings-1-1024x500.jpg" alt="" class="wp-image-6453" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/beaumont-reading-settings-1-1024x500.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/04/beaumont-reading-settings-1-500x244.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/04/beaumont-reading-settings-1-768x375.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/04/beaumont-reading-settings-1.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Likewise, if you have your homepage set to show posts, but install a theme like <a href="https://wordpress.org/themes/spectra-one/" title="">Spectra</a> or <a href="https://wordpress.org/themes/frost/" title="">Frost</a>, you will find that your posts are nowhere in sight, and you have the theme demo content instead.</p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/03/frost-homepage.jpg"><img decoding="async" width="1024" height="457" src="https://webtrainingwheels.com/wp-content/uploads/2025/03/frost-homepage-1024x457.jpg" alt="" class="wp-image-6447" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/03/frost-homepage-1024x457.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/03/frost-homepage-500x223.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/03/frost-homepage-768x343.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/03/frost-homepage.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p></p>



<p><strong>2. You don&#8217;t realize the demo content is in a template and you edit it directly</strong></p>



<p>You don&#8217;t find the usual <em>Edit Page</em> link in the toolbar. So you click <em>Edit Site</em>, which seems logical.</p>



<p>Then you get to work editing, without even realizing that you&#8217;re editing the template itself!</p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-edit-site-link.jpg"><img decoding="async" width="1024" height="401" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-edit-site-link-1024x401.jpg" alt="" class="wp-image-6479" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-edit-site-link-1024x401.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-edit-site-link-500x196.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-edit-site-link-768x301.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-edit-site-link.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>These scenarios demonstrate the commons issues you might face getting started with block themes. </p>



<h2 class="wp-block-heading">How to fix these scenarios</h2>



<p>First you have to understand the WordPress template hierarchy to understand <em>why</em> this is happening. </p>



<h3 class="wp-block-heading">The WordPress template hierarchy</h3>



<p>The template hierarchy is the system that determines which template WordPress will choose to display the content, when a page is requested. </p>



<p>Usually it&#8217;s quite straightforward &#8211; a single post will use the Single template. A standard page will use the Page template etc.</p>



<p>But the <a href="https://developer.wordpress.org/themes/basics/template-hierarchy/#home-page-display" title="">homepage is a bit unique and tricky.</a> There&#8217;s potentially 3 templates that could be used:</p>



<ul class="wp-block-list">
<li><strong>front-page</strong>: this will be used regardless of if you have set your homepage as blog posts or a static page. It has the highest precedence in the hierarchy.</li>



<li><strong>home</strong>: this will be used only if you&#8217;ve set your blog posts for the homepage. If you&#8217;ve set a static page, you&#8217;ll see your page content as expected.</li>



<li><strong>index</strong>: If neither a home nor a front-page template exists, then the index template will be used, so it should show whatever content you already have.</li>
</ul>



<p>So in the scenarios I outlined, this is what happened:</p>



<ul class="wp-block-list">
<li>Beaumont comes with a front-page.html template, so the content in it always showed up on the home whether it was set to display posts or a page.</li>



<li>On the other hand, Frost does not come with a front-page.html. Instead it has a home.html template. So the demo content inside that template showed up only when my Reading settings were set to display posts on the homepage. When I set my site to a static homepage, my own content showed up.</li>



<li>If your theme uses an index template instead of front-page or home, like the <a href="https://wordpress.org/themes/ollie/" title="">Ollie theme</a> does, it will display whatever content you&#8217;ve already created.</li>
</ul>



<p>It&#8217;s a lot to expect a new WordPress user, or even someone that&#8217;s used WordPress before, to understand intuitively what&#8217;s going on here. </p>



<h4 class="wp-block-heading">How do you know which template your theme is using? </h4>



<ul class="wp-block-list">
<li>Go to <em>Appearance → Editor → Templates</em></li>



<li>Click on your theme name to filter out other templates</li>



<li>Now see what you have:<br></li>
</ul>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-templates.jpg"><img decoding="async" width="1024" height="412" src="https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-templates-1024x412.jpg" alt="" class="wp-image-6413" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-templates-1024x412.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-templates-500x201.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-templates-768x309.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-templates.jpg 1500w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>So now you know why certain content is showing on your homepage, what do you do  if you want to change that?</p>



<p>You&#8217;ll either need to edit the template that&#8217;s currently being used and/or create a new one.</p>



<p>For example, in the Beaumont scenario, if I want to show my own static page on the homepage and use the Beaumont template for the Blog page, this is what I would do: </p>



<h4 class="wp-block-heading">Copy the Front Page Template to a Blog Home Template</h4>



<ol class="wp-block-list">
<li>Go to <em>Appearance → Editor → Templates</em></li>



<li>Click on the front page template to open the Site Editor.</li>



<li>Click on List view</li>



<li>Select all blocks (click the first block, hold down the SHIFT key, then click the last block and it should highlight all of them) in List View, and either right-click or CMD+ C on a Mac (CTRL+C on a PC) to copy them to your clipboard.</li>



<li>Click the WordPress logo at the top left to get back to the Templates page. </li>



<li>Click <em>Add New Template</em></li>



<li>Select Blog Home. In some cases you&#8217;ll see a modal with a pattern or two to choose from. This will vary according to your theme. If one of the patterns presented fits your needs, by all means choose it to get started. But it&#8217;s not strictly necessary and you can skip it. </li>



<li>After this step you&#8217;ll be in the Site Editor.</li>



<li>Right-click or CMD+V (CTRL + V on a PC) to paste all the blocks, then click Save at the top right.</li>
</ol>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/04/copy-all-template-blocks.jpg"><img decoding="async" width="1024" height="427" data-id="6460" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/copy-all-template-blocks-1024x427.jpg" alt="" class="wp-image-6460" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/copy-all-template-blocks-1024x427.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/04/copy-all-template-blocks-500x208.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/04/copy-all-template-blocks-768x320.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/04/copy-all-template-blocks.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Select all the blocks and copy</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/04/new-blog-home-template.jpg"><img decoding="async" width="1024" height="643" data-id="6459" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/new-blog-home-template-1024x643.jpg" alt="" class="wp-image-6459" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/new-blog-home-template-1024x643.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/04/new-blog-home-template-500x314.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/04/new-blog-home-template-768x483.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/04/new-blog-home-template.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Create new Blog Home template</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/04/template-starter-patterns-modal.jpg"><img decoding="async" width="1000" height="563" data-id="6458" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/template-starter-patterns-modal.jpg" alt="" class="wp-image-6458" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/template-starter-patterns-modal.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/04/template-starter-patterns-modal-500x282.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/04/template-starter-patterns-modal-768x432.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">starter pattern modal for templates</figcaption></figure>
</figure>



<p>Now your blog page has the Beaumont layout for posts, and we can re-purpose the front-page template to show our static page content.</p>



<h4 class="wp-block-heading">Edit the Front Page Template to Show Page Content</h4>



<ol class="wp-block-list">
<li>Go to the site editor and click on the front page template again.</li>



<li>Now you&#8217;re going to delete the blocks you don&#8217;t want. When you delete a block containing a Query Loop, you will see a warning message. But you can ignore it and proceed with deletion because in the next step we&#8217;re going to add a block that displays your content.</li>



<li>In the Block Inserter, scroll down until you see the <em>theme</em> section. Choose the Content block which will show your static page content.</li>
</ol>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/03/edit-front-page-template.jpg"><img decoding="async" width="1000" height="515" data-id="6436" src="https://webtrainingwheels.com/wp-content/uploads/2025/03/edit-front-page-template.jpg" alt="" class="wp-image-6436" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/03/edit-front-page-template.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/03/edit-front-page-template-500x258.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/03/edit-front-page-template-768x396.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/03/delete-query-loop-warning.jpg"><img decoding="async" width="1024" height="426" data-id="6434" src="https://webtrainingwheels.com/wp-content/uploads/2025/03/delete-query-loop-warning.jpg" alt="" class="wp-image-6434" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/03/delete-query-loop-warning.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/03/delete-query-loop-warning-500x208.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/03/delete-query-loop-warning-768x320.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-blocks-content.jpg"><img decoding="async" width="800" height="570" data-id="6435" src="https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-blocks-content.jpg" alt="" class="wp-image-6435" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-blocks-content.jpg 800w, https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-blocks-content-500x356.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/03/theme-blocks-content-768x547.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></figure>
</figure>



<p></p>



<p>If you&#8217;re like me, you might be concerned about editing the template directly and not being able to revert back to its former state. But, don&#8217;t worry, you can always revert back to the theme&#8217;s default content by using the <em>Reset</em> option:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/04/reset-template.jpg"><img decoding="async" width="900" height="781" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/reset-template.jpg" alt="" class="wp-image-6481" style="width:553px;height:auto" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/reset-template.jpg 900w, https://webtrainingwheels.com/wp-content/uploads/2025/04/reset-template-500x434.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/04/reset-template-768x666.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></a></figure>
</div>


<p></p>



<h4 class="wp-block-heading">How to use your theme&#8217;s demo content, in the right way</h4>



<p>In the case of a theme like Frost or Spectra, you might want to use their demo content as a starting point for your homepage, but you need to get that into the page editor instead of editing the template itself.</p>



<p>There are 2 ways to do this:</p>



<p>1. <strong>Copy template blocks to your page</strong></p>



<p>The premise of the full site editor is that blocks are usable across pages and templates, anywhere you&#8217;d edit your site basically. That means you can copy/paste blocks from a template to a page to duplicate the design.</p>



<ul class="wp-block-list">
<li>Open the Blog home page template in the site editor</li>



<li>Open the List View. Select and copy all the blocks.
<ul class="wp-block-list">
<li>Tip: don&#8217;t copy header and footer template blocks, just the content sections. </li>
</ul>
</li>



<li>Exit the site editor and go to <em>Pages  → New</em></li>



<li>In the editor, paste the blocks</li>
</ul>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/04/select-content-blocks.jpg"><img decoding="async" width="1024" height="414" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/select-content-blocks-1024x414.jpg" alt="" class="wp-image-6465" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/select-content-blocks-1024x414.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/04/select-content-blocks-500x202.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/04/select-content-blocks-768x310.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/04/select-content-blocks.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Copy content blocks from Template, for pasting into a page</figcaption></figure>



<p>2. <strong>Recreate the template using patterns</strong></p>



<p>The template design should be comprised of patterns, which would be available in the pattern inserter when editing a page. </p>



<ol class="wp-block-list">
<li>Create a new page</li>



<li>Click the Block Inserter and click on Patterns</li>



<li>Look for the patterns that match the sections you want to add from the demo
<ul class="wp-block-list">
<li>This works but can be a bit laborious because it&#8217;s not always easy to find each specific pattern.</li>



<li>Some themes, like Frost, do make it easier by making full page layouts available as patterns. You&#8217;ll see them by clicking on <em>Patterns → Page</em><br></li>
</ul>
</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-page-patterns.jpg"><img decoding="async" width="1306" height="1826" src="https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-page-patterns.jpg" alt="" class="wp-image-6467" style="width:438px;height:auto" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-page-patterns.jpg 1306w, https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-page-patterns-358x500.jpg 358w, https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-page-patterns-732x1024.jpg 732w, https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-page-patterns-768x1074.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/04/frost-page-patterns-1099x1536.jpg 1099w" sizes="(max-width: 1306px) 100vw, 1306px" /></a></figure>
</div>


<p></p>



<p>Hopefully WordPress improves the onboarding experience for block themes in the future, providing an easier path forward which doesn&#8217;t require so much insider knowledge!</p><div id="webtr-4151747350" class="webtr-content">
                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>Comments</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='mwkgrcxdjEiz52Vt0sGCWOPWqJGesORgsOpmxK1GUiql0t92DPtxUcU9+lYw0A8HFsJFhsJjcqjwfYeAw0r5AUwa5p3l6gxxf371qInogNt1JWA=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What is Full Site Editing in WordPress?</title>
		<link>https://webtrainingwheels.com/full-site-editing-in-wordpress/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Mon, 17 Feb 2025 01:26:47 +0000</pubDate>
				<category><![CDATA[WordPress Tutorials - Basic]]></category>
		<category><![CDATA[full site editing]]></category>
		<guid isPermaLink="false">http://webtrainingwheels.com/?p=6158</guid>

					<description><![CDATA[Full site editing is the new direction that WordPress is heading in, to provide a better editing and design experience for site owners. To get familiar with the new terminology that comes along with Full Site Editing, please read the glossary. You have likely already used the block editor, formerly known as Gutenberg. It&#8217;s been ... <p class="read-more-container"><a title="What is Full Site Editing in WordPress?" class="read-more button" href="https://webtrainingwheels.com/full-site-editing-in-wordpress/#more-6158" aria-label="Read more about What is Full Site Editing in WordPress?">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="740" height="400" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1.jpg" alt="" class="wp-image-6324" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1.jpg 740w, https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1-500x270.jpg 500w" sizes="(max-width: 740px) 100vw, 740px" /></figure>
</div>


<p>Full site editing is the new direction that WordPress is heading in, to provide a better editing and design experience for site owners.</p>



<p>To get familiar with the new terminology that comes along with <a href="https://webtrainingwheels.com/wordpress-full-site-editing-glossary/" title="WordPress Full Site Editing Glossary">Full Site Editing, please read the glossary.</a></p>



<p>You have likely already used the block editor, formerly known as Gutenberg. It&#8217;s been the default editor since WordPress 5.0.</p>



<span id="more-6158"></span>



<p>The block editor looks like this: </p>



<p></p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-editor.jpg"><img decoding="async" width="1000" height="513" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-editor.jpg" alt="" class="wp-image-6159" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-editor.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-editor-500x257.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-editor-768x394.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p>The previous editing experience, now known as &#8220;classic editor&#8221; looked like this: </p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-editor.jpg"><img decoding="async" width="1000" height="559" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-editor.jpg" alt="" class="wp-image-6160" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-editor.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-editor-500x280.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-editor-768x429.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p></p>



<p>With Full Site Editing, this block concept and interface is expanded beyond the page and post editor, to all parts of your site. This will allow site owners to more easily design and edit their site, using core WordPress features. </p>



<p>The Site Editor extends the block concept to other areas of your site:</p>



<ul class="wp-block-list">
<li>header</li>



<li>footer</li>



<li>navigation</li>



<li>template files</li>
</ul>



<p>For example, this is how you can now edit your navigation menu:</p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/navigation-block.jpg"><img decoding="async" width="1000" height="365" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/navigation-block.jpg" alt="" class="wp-image-6162" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/navigation-block.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/navigation-block-500x183.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/navigation-block-768x280.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p></p>



<h2 class="wp-block-heading">Why is full site editing a good thing for WordPress site owners?</h2>



<p>Previously, site owners were very dependent on the controls provided by the theme they selected.</p>



<p>For example, if you wanted to edit and customize the header section of your site, your theme had to provide options for that, otherwise you would need to get into the code.</p>



<p>One issue with this is that, not only were you dependent on your theme, but the experience of editing would also vary based on your theme. Some themes utilized the customizer, but some still had their own proprietary options panel.</p>



<p>With the Full Site Editing concept, the role of themes will be different, and editing your site will be a much more consistent experience no mater which theme you use.</p>



<h2 class="wp-block-heading">What&#8217;s the difference between full site editing and the block editor or Gutenberg?</h2>



<p>The block editor was the first dip of the toe into this concept. But it&#8217;s just a replacement for the editing experience of an individual post or page. Full site editing is an expansion of the block editing experience.</p>



<h2 class="wp-block-heading">How do I start using full site editing?</h2>



<p>To make use of full site editing, you must use what&#8217;s called a block theme which enables these controls. </p>



<p>A few examples of free block themes are:</p>



<ul class="wp-block-list">
<li><a href="https://wordpress.org/themes/twentytwentyfive/" target="_blank" rel="noopener" title="">TwentyTwenty Five</a></li>



<li><a href="https://wordpress.org/themes/frost/" target="_blank" rel="noopener" title="">Frost</a></li>



<li><a href="https://wordpress.org/themes/ollie/" target="_blank" rel="noopener" title="">Ollie</a> </li>
</ul>



<p></p>



<h2 class="wp-block-heading">How do I know if my site has full site editing?</h2>



<p>Look for these indications:</p>



<ol class="wp-block-list">
<li>In the Appearance menu, you will have the option <em>Editor</em></li>



<li>When viewing your site, while logged in, you will have the <em>Edit site</em> option</li>
</ol>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/edit-site.jpg"><img decoding="async" width="726" height="90" data-id="6167" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/edit-site.jpg" alt="" class="wp-image-6167" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/edit-site.jpg 726w, https://webtrainingwheels.com/wp-content/uploads/2025/01/edit-site-500x62.jpg 500w" sizes="(max-width: 726px) 100vw, 726px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/appearance-editor-1.jpg"><img decoding="async" width="680" height="304" data-id="6166" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/appearance-editor-1.jpg" alt="" class="wp-image-6166" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/appearance-editor-1.jpg 680w, https://webtrainingwheels.com/wp-content/uploads/2025/01/appearance-editor-1-500x224.jpg 500w" sizes="(max-width: 680px) 100vw, 680px" /></a></figure>
</figure>



<h2 class="wp-block-heading">Can I enable full site editing on a regular theme?</h2>



<p>Sort of, but to a limited extent.</p>



<p>If you are a developer you can technically add many components of FSE to a classic theme. But not all components will be available, so what you would end up with would be hybrid between a classic and an FSE, or block, theme.</p>



<p>But this is a highly technical process and may or may not be worth the effort.</p>



<p>Read more about that process at the excellent <a href="https://fullsiteediting.com/lessons/adding-full-site-editing-features-to-classic-themes/" target="_blank" rel="noopener" title="">FullSiteEditing.com</a></p>



<p>If you are not a developer, it would be better to either keep using your current theme, or switch to a different, already FSE-enabled theme.</p>



<p>There is no requirement to do this, however. Your theme will keep working, so there&#8217;s no specific need to start using FSE on your current site.</p>



<p><strong>Keep reading: <a href="https://webtrainingwheels.com/difference-between-wordpress-fse-themes-classic-themes/" title="The Difference Between WordPress FSE Themes and Classic Themes">What&#8217;s the difference between a full site editing theme and a classic theme?</a></strong></p><div id="webtr-291477389" class="webtr-content">
                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>Company</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='rcWyqifTLUKEQNvcR6wOS479o3CBvvFBuVuccIpvVYPejOWkrp5EXJaRZwsRzrODmM5skcD8RNFcjnC+gLkLTZAheh7GZI2fYwIzwST4Gv64//o=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>



<p></p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WordPress Full Site Editing Glossary</title>
		<link>https://webtrainingwheels.com/wordpress-full-site-editing-glossary/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Mon, 17 Feb 2025 01:26:36 +0000</pubDate>
				<category><![CDATA[WordPress Tutorials - Basic]]></category>
		<category><![CDATA[full site editing]]></category>
		<guid isPermaLink="false">https://webtrainingwheels.com/?p=6256</guid>

					<description><![CDATA[The changes to WordPress are not only in the user experience and interface, but in the terminology as well. This glossary should help with the learning curve when navigating the new editor, as well help you to make sense of tutorials and be able to search for help more effectively. Site Editor Instead of the ... <p class="read-more-container"><a title="WordPress Full Site Editing Glossary" class="read-more button" href="https://webtrainingwheels.com/wordpress-full-site-editing-glossary/#more-6256" aria-label="Read more about WordPress Full Site Editing Glossary">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-full"><img decoding="async" width="740" height="400" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1.jpg" alt="" class="wp-image-6324" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1.jpg 740w, https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1-500x270.jpg 500w" sizes="(max-width: 740px) 100vw, 740px" /></figure>



<p></p>



<p>The changes to WordPress are not only in the user experience and interface, but in the terminology as well. This glossary should help with the learning curve when navigating the new editor,  as well help you to make sense of tutorials and be able to search for help more effectively.</p>



<span id="more-6256"></span>



<h2 class="wp-block-heading">Site Editor</h2>



<p>Instead of the Customizer, or a proprietary theme options panel, all your controls will be in the site editor. This is found under Appearance.</p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor.jpg"><img decoding="async" width="1000" height="501" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor.jpg" alt="" class="wp-image-6188" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor-500x251.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor-768x385.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p></p>



<h2 class="wp-block-heading">Styles AKA Global Styles</h2>



<p>This is where you can control typography, fonts, layout widths, block styles and other design elements, which apply across your whole site.</p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes.jpg"><img decoding="async" width="1000" height="518" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes.jpg" alt="" class="wp-image-6238" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes-500x259.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes-768x398.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p></p>



<h2 class="wp-block-heading">Templates</h2>



<p>This is the same concept as in classic themes. Templates are the design layouts for types of pages on your site, such as the homepage, the blog homepage, a single post, a category page etc</p>



<p>Now you can use the block editor to more easily manage these layouts and customize your site.</p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates.jpg"><img decoding="async" width="1024" height="448" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-1024x448.jpg" alt="" class="wp-image-6229" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-1024x448.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-500x219.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-768x336.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading"><br>Template parts</h2>



<p>These are smaller, reusable parts within a template, which may be used across the site.</p>



<p>For example, the Header is a template part, as is the footer. It&#8217;s not a full page template, but a part of a page that you can now control in the site Editor.</p>



<p>Template Parts are a sub-section of Patterns. They are a bit different from standard patterns because template parts have an area property. That means they are assigned for use within a specific place on the site.</p>



<h2 class="wp-block-heading">Theme blocks</h2>



<p>These are core blocks which are designed for use with full site editing. Some examples are: Navigation, Query Loop, Site Logo</p>



<h2 class="wp-block-heading">Block Theme</h2>



<p>A block theme is one that is designed to take full advantage of full site editing. You&#8217;ll use the site editor instead of the customizer to manage your site.</p>



<p>A few examples of block themes are: <a href="https://wordpress.org/themes/twentytwentyfive/" title="">TwentyTwenty Five</a>, <a href="https://wordpress.org/themes/ollie/" title="">Ollie</a>, <a href="https://wordpress.org/themes/frost/" title="">Frost</a>. </p>



<h2 class="wp-block-heading">Block editor</h2>



<p>This is the name for the content editing interface in WordPress. It replaces the old &#8220;classic editor&#8221; for your posts and pages. It was previously known as Gutenberg.</p>



<h2 class="wp-block-heading">Patterns</h2>



<p>Patterns are pre-configured groups of blocks that form a particular layout or feature. You can add them to your page and then edit the content of them. They are an easy and convenient way to make your site look professionally designed.</p>



<p><a href="https://webtrainingwheels.com/wordpress-block-patterns/" title="WordPress Block Patterns Explained">Patterns can be synced, unsynced or partially synced.</a></p>



<h2 class="wp-block-heading">Block grammar / block markup</h2>



<p>Block grammar, also known as block markup is a WordPress-specific type of HTML comment which is used in block theme template files and in the block editor.</p>



<p>It looks like this :</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-comment">&lt;!-- wp:template-part {"slug":"header"} /--&gt;</span>

<span class="hljs-comment">&lt;!-- wp:group {"tagName":"main","style":{"spacing":{"margin":{"top":"var:preset|spacing|60"}}},"layout":{"type":"constrained"}} --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">main</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"wp-block-group"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"margin-top:var(--wp--preset--spacing--60)"</span>&gt;</span>
	<span class="hljs-comment">&lt;!-- wp:pattern {"slug":"twentytwentyfive/hidden-blog-heading"} /--&gt;</span>
	<span class="hljs-comment">&lt;!-- wp:pattern {"slug":"twentytwentyfive/template-query-loop"} /--&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">main</span>&gt;</span>
<span class="hljs-comment">&lt;!-- /wp:group --&gt;</span>

<span class="hljs-comment">&lt;!-- wp:template-part {"slug":"footer"} /--&gt;</span>
</code></span></pre>


<p></p>



<h2 class="wp-block-heading">List View</h2>



<p>This is a feature of the block editor which makes it much easier to view the block structure of your page or template. </p>



<p>The List View panel on the left shows you all the blocks on the page, with a hierarchical structure. You can click on any element in the List and jump to it in the editor, making navigating the page much easier.</p>



<p>When there are grouped and nested elements, it can be hard to select the part you want in the main editing window. using the List View you can be much more precised with your selections.</p>



<p>You can also drag drop elements in the List View to move them around the page. </p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/block-editor-list-view.jpg"><img decoding="async" width="1000" height="530" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/block-editor-list-view.jpg" alt="" class="wp-image-6260" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/block-editor-list-view.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/02/block-editor-list-view-500x265.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/block-editor-list-view-768x407.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<h2 class="wp-block-heading">Theme.json</h2>



<p>This file is the engine of block themes. It contains all the settings and configuration information.</p><div id="webtr-3869953129" class="webtr-content">
                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>Company</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='ktfZAEYTpkXdzyluVoDEh3/vR7EoapvKqXA9jT8Ur5lAIuRyN6DzL9qCiADEiPKnX/JRzRLPNnMeS7P/8A1ygUwyyetc//9ktT1zMwjS3EnzgKw=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>



<p></p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Difference Between WordPress FSE Themes and Classic Themes</title>
		<link>https://webtrainingwheels.com/difference-between-wordpress-fse-themes-classic-themes/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Mon, 17 Feb 2025 01:26:24 +0000</pubDate>
				<category><![CDATA[WordPress Tutorials - Basic]]></category>
		<category><![CDATA[full site editing]]></category>
		<guid isPermaLink="false">http://webtrainingwheels.com/?p=6171</guid>

					<description><![CDATA[A block theme, or block-based theme, is the same as a full site editing (FSE) theme. A classic theme is one that doesn&#8217;t work with full site editing. Terminology Whether you are a site owner or a developer, there&#8217;s new lingo to learn. Get started with our Full Site Editing glossary. Differences in User Experience ... <p class="read-more-container"><a title="The Difference Between WordPress FSE Themes and Classic Themes" class="read-more button" href="https://webtrainingwheels.com/difference-between-wordpress-fse-themes-classic-themes/#more-6171" aria-label="Read more about The Difference Between WordPress FSE Themes and Classic Themes">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="740" height="400" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1.jpg" alt="" class="wp-image-6324" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1.jpg 740w, https://webtrainingwheels.com/wp-content/uploads/2025/02/full-site-editing-feat-740x400-1-500x270.jpg 500w" sizes="(max-width: 740px) 100vw, 740px" /></figure>
</div>


<p>A block theme, or block-based theme, is the same as a full site editing (FSE) theme.</p>



<p>A classic theme is one that doesn&#8217;t work with full site editing.</p>



<h2 class="wp-block-heading">Terminology</h2>



<p>Whether you are a site owner or a developer, there&#8217;s new lingo to learn. Get started with our <a href="https://webtrainingwheels.com/wordpress-full-site-editing-glossary/" title="WordPress Full Site Editing Glossary">Full Site Editing glossary.</a></p>



<h2 class="wp-block-heading">Differences in User Experience</h2>



<p>If you use a classic theme, you will still be using the block-based editor for your posts and pages, but you&#8217;ll be dependent on your theme to provide editing capabilities for other parts of your site, like the header, footer etc.</p>



<p>Classic themes  utilize either their own custom options panel, or the WordPress customizer to provide design and other controls.</p>



<span id="more-6171"></span>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-customizer.jpg"><img decoding="async" width="1000" height="597" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-customizer.jpg" alt="" class="wp-image-6184" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-customizer.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-customizer-500x299.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-customizer-768x458.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p>They utilize &#8220;widgets&#8221; as a way to allow users to add pieces of content to sidebars and other parts of the site the theme has designated as widget-enabled. </p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-widgets.jpg"><img decoding="async" width="1000" height="596" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-widgets.jpg" alt="" class="wp-image-6185" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-widgets.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-widgets-500x298.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-themes-widgets-768x458.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p>Block themes do everything through the new Site Editor.  You&#8217;ll be able to edit more parts of your site using a native WordPress interface. This will provide a more consistent experience no matter which theme you are using. </p>



<p>You will need to get used to the new user interface, and find where the different options are, but after that initial &#8220;culture shock&#8221; it should be a better experience.</p>



<h3 class="wp-block-heading">The Site Editor</h3>



<p>This interface allows you access to edit parts of your site using blocks much more easily. </p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor.jpg"><img decoding="async" width="1000" height="501" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor.jpg" alt="" class="wp-image-6188" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor-500x251.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-site-editor-768x385.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<h4 class="wp-block-heading">Navigation </h4>



<p>Navigation menus now have their own block, and are managed from within the Site Editor: </p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-navigation-menu.jpg"><img decoding="async" width="1000" height="351" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-navigation-menu.jpg" alt="" class="wp-image-6225" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-navigation-menu.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-navigation-menu-500x176.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-navigation-menu-768x270.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p></p>



<h4 class="wp-block-heading">Templates</h4>



<p>Templates control the design of specific types of pages on your site. For example, your category archives have a template, your blog homepage has a template, single posts have a template etc.</p>



<p>You can also create various layouts that you can choose to apply to any page, for example, a layout with a sidebar, one without a sidebar etc.  </p>



<p>In classic themes, unless your theme gave you control, you had to use PHP to do custom layouts templates. </p>



<p>Now templates are available for editing in the Site Editor, using block tools and preset patterns.</p>



<p>As a user, block themes will give you a lot more control over your site, without needing to tinker with code.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-template-editor.jpg"><img decoding="async" width="1024" height="519" data-id="6228" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-template-editor-1024x519.jpg" alt="" class="wp-image-6228" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-template-editor-1024x519.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-template-editor-500x253.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-template-editor-768x389.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-template-editor.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Edit a template design in the site editor</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-woocommerce.jpg"><img decoding="async" width="1024" height="448" data-id="6230" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-woocommerce-1024x448.jpg" alt="" class="wp-image-6230" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-woocommerce-1024x448.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-woocommerce-500x219.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-woocommerce-768x336.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-woocommerce.jpg 1500w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">WooCommerce templates</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates.jpg"><img decoding="async" width="1024" height="448" data-id="6229" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-1024x448.jpg" alt="" class="wp-image-6229" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-1024x448.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-500x219.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates-768x336.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-templates.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Theme templates</figcaption></figure>
</figure>



<h4 class="wp-block-heading">Global Styles</h4>



<p>These are preset color palettes and typography styles provided by your theme,  that you can select and edit to style your site. This will allow you to create an aesthetically pleasing site even if you aren&#8217;t a designer. In addition to color palettes and typography, you can also set global styles for specific blocks, set layout widths and more. </p>



<figure class="wp-block-gallery has-nested-images columns-3 is-cropped wp-block-gallery-6 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles.jpg"><img decoding="async" width="325" height="800" data-id="6237" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles.jpg" alt="" class="wp-image-6237" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles.jpg 325w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-203x500.jpg 203w" sizes="(max-width: 325px) 100vw, 325px" /></a><figcaption class="wp-element-caption">Global styles</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-typography.jpg"><img decoding="async" width="364" height="800" data-id="6235" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-typography.jpg" alt="" class="wp-image-6235" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-typography.jpg 364w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-typography-228x500.jpg 228w" sizes="(max-width: 364px) 100vw, 364px" /></a><figcaption class="wp-element-caption">Typography styles</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/site-editor-block-styles.jpg"><img decoding="async" width="354" height="800" data-id="6236" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/site-editor-block-styles.jpg" alt="" class="wp-image-6236" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/site-editor-block-styles.jpg 354w, https://webtrainingwheels.com/wp-content/uploads/2025/01/site-editor-block-styles-221x500.jpg 221w" sizes="(max-width: 354px) 100vw, 354px" /></a><figcaption class="wp-element-caption">Block styles</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes.jpg"><img decoding="async" width="1000" height="518" data-id="6238" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes.jpg" alt="" class="wp-image-6238" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes-500x259.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-styles-color-palettes-768x398.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">color palette styles in the template editor</figcaption></figure>
</figure>



<h4 class="wp-block-heading">Patterns</h4>



<p>These are pre-styled  and pre-configured groups of blocks that you can use to make your pages look professionally designed. Patterns are shortcuts to getting a particular look or feature on your page.</p>



<p>They can save you time and make your site look better than if you did everything yourself (assuming you are not a professional designer).</p>



<p>Patterns can be provided by both plugins and your theme. </p>



<p>For example, the Ollie theme provides many patterns for elements such as Calls to Action, and even full page layouts. </p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-7 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie-pages.jpg"><img decoding="async" width="1000" height="607" data-id="6241" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie-pages.jpg" alt="" class="wp-image-6241" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie-pages.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie-pages-500x304.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie-pages-768x466.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">Create page layouts with patterns</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie.jpg"><img decoding="async" width="1000" height="562" data-id="6242" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie.jpg" alt="" class="wp-image-6242" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie-500x281.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-patterns-ollie-768x432.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">Call to Action patterns</figcaption></figure>
</figure>



<p>Once added to a page you can then edit the content as normal.</p>



<h4 class="wp-block-heading">Font library</h4>



<p>The font library feature is by default only available in block themes. It allows you to manage fonts from the WordPress site editor, making it easier for users to control the typography of their site. Themes can install fonts as part of their design. And users can  upload their own, or install them from Google Fonts, and serve them from your own domain.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-8 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img decoding="async" width="1000" height="673" data-id="6251" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/block-themes-font-library.jpg" alt="" class="wp-image-6251" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/block-themes-font-library.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/02/block-themes-font-library-500x337.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/block-themes-font-library-768x517.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /><figcaption class="wp-element-caption">Font library</figcaption></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="1000" height="531" data-id="6249" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/block-themes-font-library-upload.jpg" alt="" class="wp-image-6249" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/block-themes-font-library-upload.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/02/block-themes-font-library-upload-500x266.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/block-themes-font-library-upload-768x408.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /><figcaption class="wp-element-caption">Upload your own fonts</figcaption></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="1000" height="620" data-id="6250" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/font-library-install.jpg" alt="" class="wp-image-6250" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/font-library-install.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/02/font-library-install-500x310.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/font-library-install-768x476.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /><figcaption class="wp-element-caption">Install Google Fonts and host them on your domain</figcaption></figure>
</figure>



<p>With some code, the font library can be added to classic themes.</p>



<h4 class="wp-block-heading">Consistency</h4>



<p>Although some classic themes give you the same amount of control, the methods and interface will vary form theme to theme. So if you change theme you have to re-learn how  to control it. </p>



<p>With these controls built into a native WordPress system, the experience will be more unified so you won&#8217;t have a learning curve for every theme.</p>



<h2 class="wp-block-heading">Technical differences</h2>



<p>Under the hood a block theme and a classic theme are quite different.</p>



<p>As a developer, the transition might be more difficult because the underlying technology is different and you&#8217;ll have to re-learn how to make a theme. </p>



<p>Classic themes mostly utilize PHP, whereas block themes rely more on HTML, and WordPress&#8217; new block markup. </p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-9 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-theme-files.jpg"><img decoding="async" width="542" height="978" data-id="6244" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-theme-files.jpg" alt="" class="wp-image-6244" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-theme-files.jpg 542w, https://webtrainingwheels.com/wp-content/uploads/2025/01/classic-theme-files-277x500.jpg 277w" sizes="(max-width: 542px) 100vw, 542px" /></a><figcaption class="wp-element-caption">Classic theme files</figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-theme-files.jpg"><img decoding="async" width="382" height="800" data-id="6245" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-theme-files.jpg" alt="" class="wp-image-6245" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-theme-files.jpg 382w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-theme-files-239x500.jpg 239w" sizes="(max-width: 382px) 100vw, 382px" /></a><figcaption class="wp-element-caption">Block theme files</figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-wordpress-html.jpg"><img decoding="async" width="1000" height="415" data-id="6246" src="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-wordpress-html.jpg" alt="" class="wp-image-6246" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-wordpress-html.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-wordpress-html-500x208.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/01/block-themes-wordpress-html-768x319.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">WordPress block HTML</figcaption></figure>
</figure>



<p>Whereas functions.php was previously the powerhouse of your theme, themes.json is now doing the heavy lifting.</p>



<p>In some ways this could make theme development a bit more accessible. </p>



<p>On the other hand, creating custom blocks is more complicated and requires JavaScript knowledge. You can create a theme without custom blocks, of course, but taking that next step will be a hurdle. </p>



<p>There are some ways in which the classic theme methodologies are still supported in block themes. For example, if the block theme does not have the relevant template html part, it can fallback to a php file. But that PHP file has to be written in a specific way.</p>



<p><strong>Easier theme switching</strong></p>



<p>Some classic themes relied on elaborate shortcodes to create layouts. That meant if you changed themes, you were left with unrendered shortcodes in your pages. </p>



<p>With everything in blocks, even things like patterns which may have come with your theme, will still render to some extent. They may lose some styling, but your content will still be there in a native WordPress way.</p>



<h2 class="wp-block-heading">What are hybrid themes?</h2>



<p>Hybrid themes are classic themes which have some elements of block themes added to them. They provide a bridge between the two kinds of technologies, in theory giving you the best of both worlds if you&#8217;re not ready to make the jump to block themes. </p>



<h2 class="wp-block-heading">Examples of block themes</h2>



<p>If you are looking to experiment with full site editing and block theme, I recommend you set up a test site using Local WP or a similar tool, and get started. Here&#8217;s a few free themes you can install to play with: </p>



<ul class="wp-block-list">
<li><a href="https://wordpress.org/themes/twentytwentyfive/" target="_blank" rel="noopener" title="">Twenty Twenty Five</a></li>



<li><a href="https://wordpress.org/themes/ollie/" target="_blank" rel="noopener" title="">Ollie</a></li>



<li><a href="https://wordpress.org/themes/spectra-one/" target="_blank" rel="noopener" title="">Spectra One</a></li>



<li><a href="https://wordpress.org/themes/frost/" target="_blank" rel="noopener" title="">Frost</a></li>
</ul>



<p>Check out <a href="https://fullsiteediting.com/themes/" target="_blank" rel="noopener" title="">https://fullsiteediting.com/themes/</a> for a more comprehensive list. </p><div id="webtr-3426955138" class="webtr-content">
                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>Email</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='WNjdyoluMXVJm3bAfasWfHQ3H88gfViKa7mxILc5jg8DNxRrgyj0CllFqB70m/tMf1QKscUz5/ikZWKkNrozlclPPJSJH4lBawlIIdcE+opGXGc=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WordPress Block Patterns Explained</title>
		<link>https://webtrainingwheels.com/wordpress-block-patterns/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Mon, 17 Feb 2025 01:26:09 +0000</pubDate>
				<category><![CDATA[WordPress Tutorials - Basic]]></category>
		<category><![CDATA[full site editing]]></category>
		<guid isPermaLink="false">https://webtrainingwheels.com/?p=6266</guid>

					<description><![CDATA[WordPress block patterns are mini-templates. They are pre-configured groups of blocks that give you shortcuts to creating certain features on your site, like a call to action, a nice-looking hero image with text, or even a whole page layout. They are available to insert on any page, and then the content can be edited. Below ... <p class="read-more-container"><a title="WordPress Block Patterns Explained" class="read-more button" href="https://webtrainingwheels.com/wordpress-block-patterns/#more-6266" aria-label="Read more about WordPress Block Patterns Explained">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="620" height="250" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/patterns-feat-620x250-2.jpg" alt="" class="wp-image-6312" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/patterns-feat-620x250-2.jpg 620w, https://webtrainingwheels.com/wp-content/uploads/2025/02/patterns-feat-620x250-2-500x202.jpg 500w" sizes="(max-width: 620px) 100vw, 620px" /></figure>
</div>


<p></p>



<p>WordPress block patterns are mini-templates. They are pre-configured groups of blocks that give you shortcuts to creating certain features on your site, like a call to action, a nice-looking hero image with text, or even a whole page layout.</p>



<p>They are available to insert on any page, and then the content can be edited.</p>



<span id="more-6266"></span>



<p>Below is the Testimonial Card pattern from the Ollie theme. Once added to your page you can see it is composed of a group of blocks, designed and configured for you. You can edit them just like normal blocks.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a20ac8f80033&quot;}" data-wp-interactive="core/image" data-wp-key="6a20ac8f80033" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" width="1000" height="295" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-is-a-group-of-blocks.jpg" alt="" class="wp-image-6277" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-is-a-group-of-blocks.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-is-a-group-of-blocks-500x148.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-is-a-group-of-blocks-768x227.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><br>The confusing part is that there are 3 kinds of Patterns:</p>



<ul class="wp-block-list">
<li>Unsynced</li>



<li>Synced</li>



<li>Partially synced</li>
</ul>



<p>I&#8217;ll explain the differences and how to utilize them in your content.</p>



<h2 class="wp-block-heading">Unsynced patterns</h2>



<p>Once an unsynced pattern has been added to a page, it functions like any other block and is independent of other instances of the same pattern. </p>



<p>So if you have added the same pattern on several pages, making a change to one of those changes only the once you edited. The same pattern on other pages will remain unchanged. </p>



<p>You can either add an existing pattern from the pattern library, or create one from scratch.</p>



<p><strong>To add an existing pattern</strong>:</p>



<ul class="wp-block-list">
<li>In your post or page click the Block Inserter&nbsp; button and then click <em>Patterns</em>.</li>



<li>Choose your pattern</li>
</ul>



<figure class="wp-block-image size-medium"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/insert-pattern.jpg"><img decoding="async" width="500" height="470" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/insert-pattern-500x470.jpg" alt="" class="wp-image-6270" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/insert-pattern-500x470.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/insert-pattern-768x722.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/02/insert-pattern.jpg 1000w" sizes="(max-width: 500px) 100vw, 500px" /></a></figure>



<p>Once it&#8217;s in your page, you can make changes to it, and it only changes it on that specific page.</p>



<p>If you want to customize it and save your own version of it, make your changes, then</p>



<ul class="wp-block-list">
<li>Select the pattern in the <em>List View</em>, then click the 3 dots and choose <em>Create Pattern</em></li>



<li>Give it a name and choose the category</li>



<li>At the bottom you have the toggle to choose whether it&#8217;s synced or not. The default is set to synced. Click it to toggle off.</li>
</ul>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-10 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern.jpg"><img decoding="async" width="1000" height="692" data-id="6279" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern.jpg" alt="" class="wp-image-6279" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern-500x346.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern-768x531.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/add-new-pattern-unsynced.jpg"><img decoding="async" width="728" height="798" data-id="6282" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/add-new-pattern-unsynced.jpg" alt="" class="wp-image-6282" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/add-new-pattern-unsynced.jpg 728w, https://webtrainingwheels.com/wp-content/uploads/2025/02/add-new-pattern-unsynced-456x500.jpg 456w" sizes="(max-width: 728px) 100vw, 728px" /></a></figure>
</figure>



<p>You can also get to that from the toolbar:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="570" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern-toolbar.jpg" alt="" class="wp-image-6281" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern-toolbar.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern-toolbar-500x285.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/create-pattern-toolbar-768x438.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<p>Now you have a custom pattern you can add to any post/page. It&#8217;s specific to each place you insert it and if you make changes to it, it is only changed on that specific place.</p>



<p><strong>Make your own pattern from scratch</strong></p>



<ul class="wp-block-list">
<li>After creating an element or layout you like in your page, select the block or blocks that you want to make into a pattern. </li>



<li>Click the 3 buttons, then choose create pattern.</li>
</ul>



<p>Then it will be available to add to any page easily from the Pattern library.</p>



<h2 class="wp-block-heading">Synced patterns</h2>



<p>In previous versions of WordPress, synced patterns were known as reusable blocks.</p>



<p>When a pattern is synced it means that you can make a change to it in one place and that change will update all instances of the pattern across your site.</p>



<p>So this is good for more dynamic content that you may want to update periodically. It allows you to make one update that affects each place you&#8217;ve added the pattern across your whole site.</p>



<p><strong>To create a synced pattern:</strong></p>



<p>Make a new pattern as described above, but toggle on the synced option when saving it.</p>



<figure class="wp-block-image size-medium is-resized"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/create-new-synced-pattern.jpg"><img decoding="async" width="476" height="500" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/create-new-synced-pattern-476x500.jpg" alt="" class="wp-image-6285" style="width:308px;height:auto" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/create-new-synced-pattern-476x500.jpg 476w, https://webtrainingwheels.com/wp-content/uploads/2025/02/create-new-synced-pattern.jpg 600w" sizes="(max-width: 476px) 100vw, 476px" /></a></figure>



<p>To differentiate unsynced patterns from synced (or partially synced) patterns, synced have a purple icon when viewing them in the pattern library or in the list view:</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-11 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/purple-icon-list.jpg"><img decoding="async" width="600" height="508" data-id="6292" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/purple-icon-list.jpg" alt="" class="wp-image-6292" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/purple-icon-list.jpg 600w, https://webtrainingwheels.com/wp-content/uploads/2025/02/purple-icon-list-500x423.jpg 500w" sizes="(max-width: 600px) 100vw, 600px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-library-icon.jpg"><img decoding="async" width="800" height="610" data-id="6293" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-library-icon.jpg" alt="" class="wp-image-6293" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-library-icon.jpg 800w, https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-library-icon-500x381.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/pattern-library-icon-768x586.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></figure>
</figure>



<p></p>



<p><strong>Edit a Synced Pattern</strong></p>



<p>If you are in a post or page where the synced pattern has been added, you will see the <em>Edit Original </em>option.</p>



<figure class="wp-block-image size-full"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-edit.jpg"><img decoding="async" width="1000" height="474" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-edit.jpg" alt="" class="wp-image-6296" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-edit.jpg 1000w, https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-edit-500x237.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-edit-768x364.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>



<p>When you click this, you are taken into a pattern editing screen:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="417" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-editing-1024x417.jpg" alt="" class="wp-image-6300" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-editing-1024x417.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-editing-500x204.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-editing-768x313.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/02/synced-pattern-editing.jpg 1300w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>After making and saving your edits, the pattern will be updated in every place you used it on your site.</p>



<h4 class="wp-block-heading"><strong>When to use Synced vs Unsynced patterns</strong></h4>



<p>Is it content that you&#8217;re going to have in multiple places on your site?</p>



<p>And will it be the same in all those places and may need to be updated at some point?</p>



<p>Then it should be synced.</p>



<p>Examples:</p>



<p><strong>Business hours</strong><br>Your business hours may be displayed in multiple places across your site, and the information will be the same in all those cases.  </p>



<p>But you might want to update it for holidays, for example. So in that case a synced pattern will be perfect &#8211; you make the update once and you&#8217;re done.</p>



<p><strong>Team directory</strong></p>



<p>Imagine you show a list of company members in multiple places. </p>



<p>But what if you hire someone new or a team member leaves? You&#8217;ll need to update the list and a synced pattern will let you update that once, and have it be updated across your site. </p>



<p></p>



<h2 class="wp-block-heading">Partially synced patterns / overrides</h2>



<p>Partially synced patterns are a hybrid, where only some specific elements within the pattern are synced.</p>



<p>These are also known as Overrides.</p>



<p>This gives you a potentially very flexible pattern.</p>



<h4 class="wp-block-heading">How to create a partially synced pattern</h4>



<ul class="wp-block-list">
<li>When editing your pattern, select a specific block. In the example below, of a Call to Action pattern, I&#8217;ve selected the button.</li>



<li>Make sure you&#8217;re in the Block settings in the right panel, and expand the Advanced panel.</li>



<li>There you will see the <em>Enable overrides</em> button. Clicking that allows syncing for that specific element.</li>



<li>You will then see a popup where you name that specific synced element</li>
</ul>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-12 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides.jpg"><img decoding="async" width="1024" height="582" data-id="6302" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides-1024x582.jpg" alt="" class="wp-image-6302" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides-1024x582.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides-500x284.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides-768x436.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides-modal.jpg"><img decoding="async" width="600" height="589" data-id="6303" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides-modal.jpg" alt="" class="wp-image-6303" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides-modal.jpg 600w, https://webtrainingwheels.com/wp-content/uploads/2025/02/enable-overrides-modal-500x491.jpg 500w" sizes="(max-width: 600px) 100vw, 600px" /></a></figure>
</figure>



<p>Now when this pattern is added to your content you will notice a couple of things:</p>



<ul class="wp-block-list">
<li>In List view, the partially synced element/block is visible, because it&#8217;s editable</li>



<li>I can change the text of the button for this specific instance</li>



<li>So now I can have multiple versions of this pattern, where I can have some custom elements specific to each instance and some elements that will be updated in all cases.</li>
</ul>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/partially-synced-list-view.jpg"><img decoding="async" width="1024" height="399" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/partially-synced-list-view-1024x399.jpg" alt="" class="wp-image-6304" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/partially-synced-list-view-1024x399.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/02/partially-synced-list-view-500x195.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/partially-synced-list-view-768x300.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/02/partially-synced-list-view.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The only drawback here is that at the time of writing, only certain blocks are eligible for partial syncing. I expect more and more blocks will be supported over time. But if you don&#8217;t see the Enable overrides button on your synced pattern, this is likely why.</p>



<p>The <em>Reset</em> button will remove any edits you made to the partially synced block and reset it to its original state.</p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/partial-sync-reset.jpg"><img decoding="async" width="1024" height="463" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/partial-sync-reset-1024x463.jpg" alt="" class="wp-image-6305" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/partial-sync-reset-1024x463.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/02/partial-sync-reset-500x226.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/partial-sync-reset-768x347.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/02/partial-sync-reset.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading">How to delete a pattern entirely</h3>



<p><strong>Use the site editor</strong></p>



<ul class="wp-block-list">
<li>Click on <em>Patterns</em></li>



<li>Find your pattern and click the 3 dots</li>



<li>Click <em>Delete</em></li>
</ul>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/delete-pattern.jpg"><img decoding="async" width="1024" height="567" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/delete-pattern-1024x567.jpg" alt="" class="wp-image-6308" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/delete-pattern-1024x567.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/02/delete-pattern-500x277.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/delete-pattern-768x425.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/02/delete-pattern.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><strong>From the post/page edit screen</strong></p><div id="webtr-2510205503" class="webtr-content">
                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>X/Twitter</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='ja7yFVJSJlgll2jkKi+j9udFQz5SL6dL4ZadDwBJeiGoOuq6gWygs7JaHkU3Km5n9rAGYlP0ZkO47qiGGKSlux6xZUJ6yXIHCEwEGE1Cd8RsUYk=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>



<ul class="wp-block-list">
<li>Click <em>Edit Original</em></li>



<li>Click the 3 dots on the right</li>



<li>Click <em>Delete</em></li>
</ul>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2025/02/edit-original-delete.jpg"><img decoding="async" width="1024" height="480" src="https://webtrainingwheels.com/wp-content/uploads/2025/02/edit-original-delete-1024x480.jpg" alt="" class="wp-image-6309" srcset="https://webtrainingwheels.com/wp-content/uploads/2025/02/edit-original-delete-1024x480.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2025/02/edit-original-delete-500x234.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2025/02/edit-original-delete-768x360.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2025/02/edit-original-delete.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Preconnect to Required Origins in WordPress</title>
		<link>https://webtrainingwheels.com/preconnect-to-required-origins-in-wordpress/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Thu, 04 Jan 2024 23:22:22 +0000</pubDate>
				<category><![CDATA[Speed Optimization]]></category>
		<guid isPermaLink="false">https://webtrainingwheels.com/?p=6113</guid>

					<description><![CDATA[Preconnect to required origins is a PageSpeed recommendation that you may see if your site loads files from external domains. It can be satisfied by adding either preconnect or dns-prefetch directives to your page. preconnect and dns-prefetch are types of &#8220;resource hints&#8221; which are used to try and speed up the loading of files hosted ... <p class="read-more-container"><a title="Preconnect to Required Origins in WordPress" class="read-more button" href="https://webtrainingwheels.com/preconnect-to-required-origins-in-wordpress/#more-6113" aria-label="Read more about Preconnect to Required Origins in WordPress">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="620" height="250" src="https://webtrainingwheels.com/wp-content/uploads/2024/01/preconnect-to-required-origins-620x250-1.jpg" alt="" class="wp-image-6144" srcset="https://webtrainingwheels.com/wp-content/uploads/2024/01/preconnect-to-required-origins-620x250-1.jpg 620w, https://webtrainingwheels.com/wp-content/uploads/2024/01/preconnect-to-required-origins-620x250-1-500x202.jpg 500w" sizes="(max-width: 620px) 100vw, 620px" /></figure>
</div>


<p><a href="https://webtrainingwheels.com/google-pagespeed-insights-guide-wordpress/" data-type="post" data-id="3444">Preconnect to required origins is a PageSpeed recommendation</a> that you may see if your site loads files from external domains. It can  be satisfied by adding either <code>preconnect</code> or <code>dns-prefetch</code> directives to your page.</p>



<p><code>preconnect</code> and <code>dns-prefetch</code> are types of &#8220;resource hints&#8221; which are used to try and speed up the loading of files hosted on 3rd party domains.</p>



<p>Resource hints are small pieces of HTML that are added to the page, to communicate to the browser to start specific tasks as soon as possible.</p>



<p>This is what resource hints look like in the HTML of a page:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">'dns-prefetch'</span> <span class="hljs-attr">href</span>=<span class="hljs-string">'//fonts.googleapis.com'</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">'https://fonts.gstatic.com'</span> <span class="hljs-attr">crossorigin</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">'preconnect'</span> /&gt;</span></code></span></pre>


<p>Don&#8217;t get this confused with <a href="https://webtrainingwheels.com/how-to-preload-key-requests-in-wordpress/" data-type="post" data-id="4276"><code>preload</code>, another type of resource hint, which is used for specific files</a>.</p>



<p>In this article I&#8217;ll explain the difference between preconnect and prefetch, which you should use, and how to add these to your site.</p>



<span id="more-6113"></span>






<h2 class="wp-block-heading">Benefits of preconnect and prefetch</h2>



<p>There is a performance cost when you use content hosted on a domain outside of your main domain.</p>



<p>The browser has to go through a multi-step process to connect to that external domain, which takes time. If you use assets from several other domains, the impact is amplified further.</p>



<p>Per Google&#8217;s documentation:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Establishing connections often involves significant time in slow networks, particularly when it comes to secure connections, as it may involve DNS lookups, redirects, and several round trips to the final server that handles the user&#8217;s request.</p>
<cite>https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect</cite></blockquote>



<p>Using <code>preconnect</code> or <code>prefetch</code> gets that process started earlier, so that downloading the actual file will be quicker when it&#8217;s time to do that. It&#8217;s like unlocking the door of your house so your visitor can walk right in when they arrive. </p>



<p>Examples of content commonly fetched from 3rd parties include social media widgets, ad scripts from networks like Google Adsense and Mediavine, streaming videos etc</p>



<p>I would classify preconnecting and prefetching as micro-optimizations. </p>



<p>That is, it&#8217;s a best practice to use these hints, but you won&#8217;t notice a huge difference in performance or loading time. This change alone will not really impact the overall PageSpeed score.</p>



<p>For that reason, resource hints are not the first step to take when optimizing your page (<a href="https://webtrainingwheels.com/remove-unused-javascript-in-wordpress/" data-type="post" data-id="4925">managing your JavaScript</a> and <a href="https://webtrainingwheels.com/reduce-unused-css-wordpress/" data-type="post" data-id="5968">reducing unused CSS</a> are better places to start). But, they are pretty easy to implement, so you may as well utilize them.</p>



<h2 class="wp-block-heading">What&#8217;s the difference between preconnect and prefetch?</h2>



<p>DNS prefetch performs the DNS lookup only, whereas preconnect also performs the next couple of steps in the process. </p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2023/12/preconnect-vs-dns-prefetch.jpg"><img decoding="async" src="https://webtrainingwheels.com/wp-content/uploads/2023/12/preconnect-vs-dns-prefetch-1024x134.jpg" alt="" class="wp-image-6115"/></a></figure>



<p>This makes preconnect a bit more expensive to use and should be used sparingly.</p>



<p>DNS prefetch can be used more liberally.</p>



<h2 class="wp-block-heading">Which domains should you preconnect to?</h2>



<p>Running a Lighthouse or PageSpeed report will inform you about domains you could consider preconnecting to.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://webtrainingwheels.com/wp-content/uploads/2023/12/lighthouse-preconnect-to-required-origins2-1024x403.jpg" alt="" class="wp-image-6116"/></figure>



<p>You could also run a GT Metrix report, go the Waterfall tab, check the Domain column and look for domains listed there which are not yours.</p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2023/12/gtmetrix-domains.jpg"><img decoding="async" src="https://webtrainingwheels.com/wp-content/uploads/2023/12/gtmetrix-domains-1024x658.jpg" alt="" class="wp-image-6117"/></a></figure>



<p>Even if the recommendation is not showing up in PageSpeed, it&#8217;s worth scrolling to the &#8220;Passed&#8221; section to make sure you aren&#8217;t using it incorrectly. There it will show warnings for unnecessary preconnects:</p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2023/12/pagespeed-preconnect-warnings.jpg"><img decoding="async" src="https://webtrainingwheels.com/wp-content/uploads/2023/12/pagespeed-preconnect-warnings-1024x531.jpg" alt="" class="wp-image-6118"/></a></figure>



<p>There are 2 guidelines to keep in mind, according to PageSpeed: </p>



<ul class="wp-block-list">
<li>Don&#8217;t preconnect to more than 2 domains.</li>



<li>Preconnects should only be for resources definitely used within 10 seconds, otherwise the connection is closed and it was essentially a waste.</li>
</ul>



<p>So your strategy should be: </p>



<p><strong>Use preconnect for the 2 most important external resources and prefetch for the rest.</strong></p>



<ul class="wp-block-list">
<li>&#8220;Most important&#8221; is defined as what&#8217;s more critical to the display of your webpage. If you have a social widget or externally hosted streaming video above the fold, you&#8217;d want to preconnect that. </li>



<li>If you are unsure, DNS prefetch is the safer choice.</li>
</ul>



<p></p>



<h2 class="wp-block-heading">How to add Preconnect and DNS Prefetch on your site</h2>



<p>It&#8217;s possible some browser hints are being automatically added to your site by WordPress itself, or by themes and plugins:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>By default, wp_resource_hints() prints hints for s.w.org (the WordPress.org CDN) and for all scripts and styles which are enqueued from external hosts.</p>
<cite>https://make.wordpress.org/core/2016/07/06/resource-hints-in-4-6/</cite></blockquote>



<p>So it would be a good idea to check the HTML of your site to see if that&#8217;s the case. </p>



<ol class="wp-block-list">
<li>Go to <em>View Page Source</em> in your browser</li>



<li>Search for <code>preconnect</code> and then <code>dns-prefetch</code></li>
</ol>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2024/01/page-source.jpg"><img decoding="async" width="1024" height="170" src="https://webtrainingwheels.com/wp-content/uploads/2024/01/page-source-1024x170.jpg" alt="" class="wp-image-6128" srcset="https://webtrainingwheels.com/wp-content/uploads/2024/01/page-source-1024x170.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2024/01/page-source-500x83.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2024/01/page-source-768x128.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2024/01/page-source-1536x255.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2024/01/page-source-2048x340.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Besides that, several optimization plugins allow you to add these browser hints, or you can manually add them yourself.</p>



<h3 class="wp-block-heading">Should you use &#8220;crossorigin&#8221;?</h3>



<p>You will see in some cases the ability to add <code>crossorigin</code> to the <code>preconnect</code> directive. Whether to use it or no can be a bit confusing. If the resource that will be used requires CORS, which webfonts do, then <code>crossorigin</code> should be used. </p>



<p>For more info, please read: &#8220;<a href="https://crenshaw.dev/preconnect-resource-hint-crossorigin-attribute/" data-type="link" data-id="https://crenshaw.dev/preconnect-resource-hint-crossorigin-attribute/">preconnect resource hint and the crossorigin attribute</a>&#8220;</p>



<h3 class="wp-block-heading">WP Rocket</h3>



<p><a class="thirstylink" rel="nofollow" target="_blank" title="WP Rocket" href="https://webtrainingwheels.com/recommends/wp-rocket/" data-shortcode="true">WP Rocket</a> is a premium-only caching and optimization plugin. It automatically added browser hints in some cases:</p>



<ul class="wp-block-list">
<li>If you have enabled the CDN function, a <code>preconnect</code> (with <code>prefetch</code> fallback) is automatically added for your CDN domain.</li>



<li><code>Preconnect</code> for Google Fonts is handled automatically</li>
</ul>



<p>You can manually add <code>dns-prefetch</code> hints:</p>



<ol class="wp-block-list">
<li>Go to the <em>Preload</em> tab and scroll down to <em>Prefetch DNS Requests</em></li>



<li>Enter the domain without the protocol, like this: <br><code>//example.com</code></li>



<li>Save the settings</li>
</ol>



<figure class="wp-block-image size-medium"><img decoding="async" width="500" height="308" src="https://webtrainingwheels.com/wp-content/uploads/2023/12/WP-Rocket-DNS-Prefetch-500x308.jpg" alt="" class="wp-image-6123" srcset="https://webtrainingwheels.com/wp-content/uploads/2023/12/WP-Rocket-DNS-Prefetch-500x308.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2023/12/WP-Rocket-DNS-Prefetch-1024x630.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2023/12/WP-Rocket-DNS-Prefetch-768x473.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2023/12/WP-Rocket-DNS-Prefetch.jpg 1144w" sizes="(max-width: 500px) 100vw, 500px" /></figure>



<h3 class="wp-block-heading">Perfmatters</h3>



<p><a href="https://perfmatters.io">Perfmatters</a> is a premium-only optimization plugin (no caching) which offers options for both <code>prefetch</code> and <code>preconnect</code>.</p>



<ol class="wp-block-list">
<li>Go to <em>Settings → Perfmatters → Preloading</em></li>



<li>There are fields for both Preconnect and DNS Prefetch</li>



<li>For Preconnect enter the domain name including the protocol. For DNS Prefetch enter only the domain preceded by <code>//</code>:</li>
</ol>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="380" src="https://webtrainingwheels.com/wp-content/uploads/2023/12/perfmatters-prefetch-preconnect-1024x380.jpg" alt="" class="wp-image-6124" srcset="https://webtrainingwheels.com/wp-content/uploads/2023/12/perfmatters-prefetch-preconnect-1024x380.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2023/12/perfmatters-prefetch-preconnect-500x186.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2023/12/perfmatters-prefetch-preconnect-768x285.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2023/12/perfmatters-prefetch-preconnect-1536x570.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2023/12/perfmatters-prefetch-preconnect.jpg 1670w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Pre* Party Resource Hints plugin</h3>



<p><a href="https://wordpress.org/plugins/pre-party-browser-hints/" data-type="link" data-id="https://wordpress.org/plugins/pre-party-browser-hints/">Pre Party Resource Hints is a free plugin</a> available on WordPress.org.  This could be useful if you&#8217;re not already using another optimization plugin. </p>



<p>You can use it to add other resource hints like <code>preload</code> and <code>prerender</code> in addition to <code>prefetch</code> and <code>preconnect</code>.</p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2024/01/pre-party-settings.jpg"><img decoding="async" width="1024" height="546" src="https://webtrainingwheels.com/wp-content/uploads/2024/01/pre-party-settings-1024x546.jpg" alt="" class="wp-image-6136" srcset="https://webtrainingwheels.com/wp-content/uploads/2024/01/pre-party-settings-1024x546.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2024/01/pre-party-settings-500x266.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2024/01/pre-party-settings-768x409.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2024/01/pre-party-settings-1536x819.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2024/01/pre-party-settings-2048x1091.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>It also has a very useful feature to automatically preconnect external resources it detects: </p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2024/01/auto-preconnect.jpg"><img decoding="async" width="1024" height="170" src="https://webtrainingwheels.com/wp-content/uploads/2024/01/auto-preconnect-1024x170.jpg" alt="" class="wp-image-6133" srcset="https://webtrainingwheels.com/wp-content/uploads/2024/01/auto-preconnect-1024x170.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2024/01/auto-preconnect-500x83.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2024/01/auto-preconnect-768x128.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2024/01/auto-preconnect-1536x255.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2024/01/auto-preconnect-2048x340.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><br>Due to the slightly more advanced settings, I&#8217;d only recommend this plugin for intermediate/advanced site owners. </p>



<h3 class="wp-block-heading">Add prefetch and preconnect manually</h3>



<p>If you want to add the code yourself, you can install a plugin like <a href="https://wordpress.org/plugins/wp-headers-and-footers/">WP Headers and Footers</a> and use the <em>Scripts in Header</em> field to add it. </p>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><a href="https://webtrainingwheels.com/wp-content/uploads/2024/01/wp-headers-and-footers.jpg"><img decoding="async" width="500" height="296" src="https://webtrainingwheels.com/wp-content/uploads/2024/01/wp-headers-and-footers-500x296.jpg" alt="" class="wp-image-6157" srcset="https://webtrainingwheels.com/wp-content/uploads/2024/01/wp-headers-and-footers-500x296.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2024/01/wp-headers-and-footers-1024x606.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2024/01/wp-headers-and-footers-768x455.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2024/01/wp-headers-and-footers-1536x909.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2024/01/wp-headers-and-footers.jpg 1730w" sizes="(max-width: 500px) 100vw, 500px" /></a></figure>
</div>


<p>Here are the elements you have to include:</p>



<ol class="wp-block-list">
<li>Open the tag with &lt;link</li>



<li>Specify the type of hint with <code>rel=</code> and then either <code>dns-prefetch</code> or <code>preconnect</code>, e,g,: <code>rel='dns-prefetch'</code></li>



<li>Use <code>href=</code> to specify the domain. Use the full domain including http or https for preconnect. For prefetch remove http and use the format: <code>//domain.com</code> <br>For example: <code>href='//fonts.googleapis.com'</code></li>



<li>Close the tag with <code>/&gt;</code></li>
</ol>



<p>Here&#8217;s an example of a DNS Prefetch:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">'dns-prefetch'</span> <span class="hljs-attr">href</span>=<span class="hljs-string">'//fonts.googleapis.com'</span> /&gt;</span></code></span></pre>


<p>And an example of a <code>preconnect</code>:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"preconnect"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://fonts.gstatic.com"</span> <span class="hljs-attr">crossorigin</span>&gt;</span></code></span></pre>


<p>Notes: </p>



<ul class="wp-block-list">
<li>You will see either double quotes or single quotes used in examples across the web. Either way is fine. </li>



<li>The <code>rel</code> can appear at the start or end of the tag, it doesn&#8217;t matter. Both the following are valid: </li>
</ul>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">'preconnect'</span> <span class="hljs-attr">href</span>=<span class="hljs-string">'https://wikipedia.org'</span> &gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://google.com"</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"preconnect"</span>&gt;</span></code></span></pre>


<h3 class="wp-block-heading">How to check if your hints are working</h3>



<p>In Safari, the Console outputs messages to let you know if the hints are successful: </p>



<figure class="wp-block-image size-medium"><img decoding="async" width="500" height="315" src="https://webtrainingwheels.com/wp-content/uploads/2024/01/safari-console-500x315.jpg" alt="" class="wp-image-6137" srcset="https://webtrainingwheels.com/wp-content/uploads/2024/01/safari-console-500x315.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2024/01/safari-console-768x484.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2024/01/safari-console.jpg 920w" sizes="(max-width: 500px) 100vw, 500px" /></figure>



<p>You can also use a tool like WebPageTest.org which shows you a Connection view. Here you should be able to see the download of the hinted asset occurring in 2 parts. </p>



<ol class="wp-block-list">
<li>The preconnect/prefetch phase which should happen early</li>



<li>The downloading phase a little later, when the file is actually used.</li>
</ol>



<p>Look at line 6 below. The first part of the connection and SSL negotiation happens early in the process, then there is a gap until the file is actually needed and downloaded. </p>



<figure class="wp-block-image size-large"><a href="https://webtrainingwheels.com/wp-content/uploads/2024/01/webpagetest-connnectionview.jpg"><img decoding="async" width="1024" height="361" src="https://webtrainingwheels.com/wp-content/uploads/2024/01/webpagetest-connnectionview-1024x361.jpg" alt="" class="wp-image-6141" srcset="https://webtrainingwheels.com/wp-content/uploads/2024/01/webpagetest-connnectionview-1024x361.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2024/01/webpagetest-connnectionview-500x176.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2024/01/webpagetest-connnectionview-768x271.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2024/01/webpagetest-connnectionview-1536x542.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2024/01/webpagetest-connnectionview-2048x723.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>If you are just getting started with optimzing your page, I&#8217;d recommend handling these higher priority recommendations first: <a href="https://webtrainingwheels.com/reduce-unused-css-wordpress/" data-type="post" data-id="5968">Reduce Unused CSS in WordPress</a>, <a href="https://webtrainingwheels.com/remove-unused-javascript-in-wordpress/" data-type="post" data-id="4925">Reduce unused JavaScript in WordPress</a>, <a href="https://webtrainingwheels.com/how-to-avoid-enormous-network-payloads-in-wordpress/" data-type="post" data-id="4786">How to avoid enormous network payloads in WordPress</a>.</p><div id="webtr-1978718062" class="webtr-content">
                <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper gform-theme--no-framework' data-form-theme='legacy' data-form-index='0' id='gform_wrapper_32' >
                        <div class='gform_heading'>
                            <h3 class="gform_title">Weekly WordPress Tips To Your Inbox</h3>
                        </div><form method='post' enctype='multipart/form-data'  id='gform_32'  action='/feed/' data-formid='32' novalidate> 
 <input type='hidden' class='gforms-pum' value='{"closepopup":false,"closedelay":0,"openpopup":false,"openpopup_id":0}' />
                        <div class='gform-body gform_body'><ul id='gform_fields_32' class='gform_fields top_label form_sublabel_below description_below validation_below'><li id="field_32_3" class="gfield gfield--type-honeypot gform_validation_container field_sublabel_below gfield--has-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label' for='input_32_3'>LinkedIn</label><div class='ginput_container'><input name='input_3' id='input_32_3' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_32_3'>This field is for validation purposes and should be left unchanged.</div></li><li id="field_32_1" class="gfield gfield--type-email gfield_contains_required field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><label class='gfield_label gform-field-label screen-reader-text' for='input_32_1'>Enter Your Email, It&#039;s Free!<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'>
                            <input name='input_1' id='input_32_1' type='email' value='' class='large'   placeholder='Enter Your Email, It&#039;s Free!' aria-required="true" aria-invalid="false"  />
                        </div></li><li id="field_32_2" class="gfield gfield--type-hidden gform_hidden field_sublabel_below gfield--no-description field_description_below field_validation_below gfield_visibility_visible"  ><div class='ginput_container ginput_container_text'><input name='input_2' id='input_32_2' type='hidden' class='gform_hidden'  aria-invalid="false" value='http://webtrainingwheels.com/feed/' /></div></li></ul></div>
        <div class='gform-footer gform_footer top_label'> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="gf-turnstile-container"> <div id="cf-turnstile-gf-32" class="cf-turnstile" data-callback="turnstileGravityCallback" data-sitekey="0x4AAAAAAA7A0N4QhHj7cf1O" data-theme="light" data-language="auto" data-size="normal" data-retry="auto" data-retry-interval="1000" data-refresh-expired="auto" data-action="gravity-form-32" data-appearance="always"></div> <style>.gform_button { pointer-events: none; opacity: 0.5; }</style> <script>document.addEventListener("DOMContentLoaded", function() { setTimeout(function(){ var e=document.getElementById("cf-turnstile-gf-32"); e&&!e.innerHTML.trim()&&(turnstile.remove("#cf-turnstile-gf-32"), turnstile.render("#cf-turnstile-gf-32", {sitekey:"0x4AAAAAAA7A0N4QhHj7cf1O"})); }, 100); });</script> <br class="cf-turnstile-br cf-turnstile-br-gf-32"> <style>#cf-turnstile-gf-32 { margin-left: -15px; }</style> </div> <style> .gf-turnstile-container { width: 100%; } .gform_footer.top_label { display: flex; flex-wrap: wrap; } </style> <script>document.addEventListener("DOMContentLoaded", function() {document.addEventListener('gform/post_render', function handlePostRender(event) {if (event.detail.formId !== 32) {return;}gform.utils.addAsyncFilter('gform/submission/pre_submission', async function handlePreSubmission(data) {document.addEventListener('gform/post_render', function rerenderTurnstile(event) {if (event.detail.formId !== 32) {return;}const turnstileElement = document.getElementById('cf-turnstile-gf-32');if (turnstileElement) {turnstile.remove('#cf-turnstile-gf-32');turnstile.render('#cf-turnstile-gf-32');}document.removeEventListener('gform/post_render', rerenderTurnstile);});gform.utils.removeFilter('gform/submission/pre_submission', handlePreSubmission);return data;});document.removeEventListener('gform/post_render', handlePostRender);});});</script><input type="submit" id="gform_submit_button_32" class="gform_button button" onclick="__gaTracker('send', 'event', { eventCategory: 'Forms', eventAction: 'Subscribe', eventLabel: 'PostFooter'});gform.submission.handleButtonClick(this);" data-submission-type="submit" value="Sign Up"></body></html>
 
            <input type='hidden' class='gform_hidden' name='gform_submission_method' data-js='gform_submission_method_32' value='postback' />
            <input type='hidden' class='gform_hidden' name='gform_theme' data-js='gform_theme_32' id='gform_theme_32' value='legacy' />
            <input type='hidden' class='gform_hidden' name='gform_style_settings' data-js='gform_style_settings_32' id='gform_style_settings_32' value='[]' />
            <input type='hidden' class='gform_hidden' name='is_submit_32' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='32' />
            
            <input type='hidden' class='gform_hidden' name='gform_currency' data-currency='USD' value='Nqs0M+6Sm8Pzwjm2gSS+Jw796+5j0gtY5ImkljCuD4zEKDTqa96E0YgFSFOsmaTmAul0dX6rchEHIamN0AgqcrX3JBwvH4gnHrhF+MPfKRDXFlE=' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' />
            <input type='hidden' class='gform_hidden' name='state_32' value='WyJbXSIsIjNhZjRhZTc2ODU5NzRiOTg2YjVjODkwMzk3M2ZhNTE5Il0=' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_target_page_number_32' id='gform_target_page_number_32' value='0' />
            <input type='hidden' autocomplete='off' class='gform_hidden' name='gform_source_page_number_32' id='gform_source_page_number_32' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                        </form>
                        </div><script>
gform.initializeOnLoaded( function() {gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_32').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_32');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_32').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_32').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_32').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_32').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_32').val();gformInitSpinner( 32, 'http://webtrainingwheels.com/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [32, current_page]);window['gf_submitting_32'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_32').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [32]);window['gf_submitting_32'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_32').text());}else{jQuery('#gform_32').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "32", currentPage: "current_page", abort: function() { this.preventDefault(); } }]);        if (event && event.defaultPrevented) {                return;        }        const gformWrapperDiv = document.getElementById( "gform_wrapper_32" );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( "span" );            visibilitySpan.id = "gform_visibility_test_32";            gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan );        }        const visibilityTestDiv = document.getElementById( "gform_visibility_test_32" );        let postRenderFired = false;        function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            gform.core.triggerPostRenderEvents( 32, current_page );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate && !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) => {                mutations.forEach( ( mutation ) => {                    if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );
</script>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Browser Caching in WordPress</title>
		<link>https://webtrainingwheels.com/browser-caching-wordpress/</link>
		
		<dc:creator><![CDATA[Lucy]]></dc:creator>
		<pubDate>Tue, 21 Nov 2023 20:32:48 +0000</pubDate>
				<category><![CDATA[Speed Optimization]]></category>
		<guid isPermaLink="false">https://webtrainingwheels.com/?p=6054</guid>

					<description><![CDATA[Implementing browser caching on your WordPress website improves performance for visitors who visit multiple pages or visit your website multiple times. It allows their computer to store commonly used files in their browser which means pages can be displayed faster on those repeat visits. Browser caching vs page caching You may have heard about page ... <p class="read-more-container"><a title="Browser Caching in WordPress" class="read-more button" href="https://webtrainingwheels.com/browser-caching-wordpress/#more-6054" aria-label="Read more about Browser Caching in WordPress">Read more</a></p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="620" height="250" src="https://webtrainingwheels.com/wp-content/uploads/2023/11/efficient-cache-policy-620x250-1.jpg" alt="" class="wp-image-6087" srcset="https://webtrainingwheels.com/wp-content/uploads/2023/11/efficient-cache-policy-620x250-1.jpg 620w, https://webtrainingwheels.com/wp-content/uploads/2023/11/efficient-cache-policy-620x250-1-500x202.jpg 500w" sizes="(max-width: 620px) 100vw, 620px" /></figure>
</div>


<p><strong>Implementing browser caching on your WordPress website improves performance for visitors who visit multiple pages or visit your website multiple times. </strong></p>



<p>It allows their computer to store commonly used files in their browser which means pages can be displayed faster on those repeat visits.</p>



<span id="more-6054"></span>






<h2 class="wp-block-heading">Browser caching vs page caching</h2>



<p>You may have heard about page caching already. This is related to, but not the same as, browser caching. </p>



<p>Caching is the process of “remembering” information for fast retrieval.</p>



<p>Both page caching and browser caching are methods for remembering information, but they store the information in different places.</p>



<p>Page caching happens on your server, while browser caching happens, yes, in the browser. Specifically, in the browser of each visitor and on each device that they access your site from. </p>



<p>And just to clarify, by browser I mean the program or app you use to look at webpages, e.g. Safari, Chrome, Internet Explorer, Firefox etc</p>



<h2 class="wp-block-heading">Let’s Cook Up A Webpage!</h2>



<p>We can imagine browser caching in terms of making a meal. In this case, the “meal” is the webpage that you want to look at, and all the files used on that page are the “ingredients”. </p>



<p>Before you can make a meal, you have to check that you have all the right ingredients, and that they are fresh. You then combine all those ingredients in a specific way to create the meal.</p>



<p>If this is the first time you’re making this particular meal, you probably don’t have all the ingredients on-hand in your kitchen. So you’ll have to go to the store and buy them – this will of course take some extra time.</p>



<p>Now let’s say you want to have that same meal again tomorrow. This time, because you already have most or all of the ingredients in your kitchen, you can prepare the meal much faster.</p>


<hr /><p><em>Browser caching makes &#039;cooking up&#039; a webpage faster on repeat visits</em><br /><a href='https://twitter.com/intent/tweet?url=https%3A%2F%2Fwebtrainingwheels.com%2Fbrowser-caching-wordpress%2F&#038;text=Browser%20caching%20makes%20%27cooking%20up%27%20a%20webpage%20faster%20on%20repeat%20visits&#038;related' target='_blank' rel="noopener noreferrer" >Share on X</a><br /><hr />


<p> In our analogy, you use your browser to request a certain webpage – a specific meal. </p>



<p>The browser contacts the server where that webpage lives, it asks for the recipe for that page, and gets sent the list of ingredients. These ingredients are basically, HTML, CSS, JavaScript and image files. </p>



<p>If it’s the first time you’ve gone to this webpage, your browser won’t have any of the ingredients on hand so it has to “go shopping” and retrieve them all fresh from the server.</p>



<p>But when you visit that same webpage again, your browser doesn’t have to reassemble everything from scratch, it can use the ingredients it’s already stored, and only ask the server for the new things it doesn’t have.</p>



<p>So that’s why, the first time you visit a webpage it takes longer than the following visits.</p>



<p>You may have noticed this phenomenon when you do repeated speed tests, or when you use the “repeat view” on webpagetest.org. The repeat view is always faster because many of the components have already been downloaded and don’t have to be fetched fresh.</p>



<p>The&nbsp; point of browser caching is to make repeat views of a webpage more efficient.</p>



<h3 class="wp-block-heading"><strong>Ingredients in your kitchen go stale though, don’t they?</strong></h3>



<p>They sure do, and so do the ingredients of your webpage. In terms of a webpage, “stale” means that you’ve updated something, making the cached version out-of-date. </p>



<p>Just like food, webpage ingredients must also have an expiration date so the browser knows whether to use them, or whether to get a fresh version, when cooking up the webpage.</p>



<p>When the browser gets the list of ingredients from the server, each file has a “header”. This is just some information about that file, including how long it can be considered fresh for. </p>



<p>This can be communicated either by a <code>cache-control</code> header set in seconds, or an <code>expires</code> header using a specific length of time. You can see both, as they appear in the browser, below:</p>



<figure class="wp-block-image size-medium"><img decoding="async" width="500" height="249" src="https://webtrainingwheels.com/wp-content/uploads/2023/11/cache-control-vs-expires-500x249.jpg" alt="" class="wp-image-6035" srcset="https://webtrainingwheels.com/wp-content/uploads/2023/11/cache-control-vs-expires-500x249.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2023/11/cache-control-vs-expires-768x382.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2023/11/cache-control-vs-expires.jpg 980w" sizes="(max-width: 500px) 100vw, 500px" /></figure>



<p>This is like checking the “sell by” or “expiration” date on your ingredients. That expiration will vary according to the type of file. The goal is to keep ingredients fresh as long as possible, to avoid those time-expensive shopping trips.</p>



<p>So the browser checks the expiration for the ingredients list, and then checks it’s kitchen (browser cache) to see if what’s there is stale or not. If the expiration date has not passed, the browser doesn’t need to download that ingredient, it just uses the one it already has, which is much faster.</p>


<hr /><p><em>Browser caching adds &#039;sell by&#039; dates to website files for efficiency &amp; freshness</em><br /><a href='https://twitter.com/intent/tweet?url=https%3A%2F%2Fwebtrainingwheels.com%2Fbrowser-caching-wordpress%2F&#038;text=Browser%20caching%20adds%20%27sell%20by%27%20dates%20to%20website%20files%20for%20efficiency%20%26%20freshness&#038;related' target='_blank' rel="noopener noreferrer" >Share on X</a><br /><hr />


<p>Sometimes in Google PageSpeed or other tools, you get this recommendation:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>“</strong>Serve static assets with an efficient cache policy<strong>”</strong></p>
</blockquote>



<p>What this is saying is that, these ingredients had a short shelf-life, they go stale quickly so you’ll have to shop for them frequently and that’s inefficient.</p>



<p>So generally, it’s a good idea to have a far expiration date so that your browser doesn’t have to do the equivalent of run out to the store all the time for a new version of that file.</p>



<p class="callout">Read our guide on <a href="https://webtrainingwheels.com/serve-static-assets-efficient-cache-policy-wordpress" data-type="link" data-id="https://webtrainingwheels.com/serve-static-assets-efficient-cache-policy-wordpress">how to enable browser caching in WordPress</a>.</p>



<p><strong>What if I change a file and the browser cache rule hasn&#8217;t expired yet?</strong></p>



<p>Very valid question! There is a mechanism for this process of letting the browser know &#8220;hey, you may have cached this file but I need you to fetch it again.&#8221; This is called &#8220;busting&#8221; the browser cache. </p>



<p>The browser can&#8217;t check the contents of the file to see if it&#8217;s different than the contents of the file it already has in its cache. But if it detects a different filename, it will assume the file is new and download it again. </p>



<p>On the website side, we can use query strings for this. You have probably seen file URLs like this: </p>



<p><code>https://example.com/wp-content/themes/astra-child/style.css?ver=4.0.3</code></p>



<p>The part at the end, after the <code>?</code>, is called the query string. </p>



<p>By changing the query string, the browser will understand that this <code>style.css</code> file has been changed, and will therefore download the new version of it, even if the value of the browser cache rule hasn&#8217;t yet been met. </p>



<p>In this way, you can make sure that all new code changes are pushed out to all visitors and won&#8217;t depend upon visitors clearing their own browser cache.</p>



<h2 class="wp-block-heading">How to disable browser caching in WordPress</h2>



<p><strong>Themes and plugins</strong></p>



<p>You shouldn&#8217;t need to disable any browser caching in WordPress if the plugins you&#8217;re using are following best practices, or if you as a developer are doing so. </p>



<p>The issue people can have is that they make a change to, let&#8217;s say a CSS file, but they don&#8217;t see it reflected on the site because the old version is cached in their browser. </p>



<p>This will only happen if you haven&#8217;t correctly versioned your files. That means appending a query string which changes when you update the file. </p>



<p>For example, you change <code>style.css?ver=1</code> to <code>style.css?ver=2</code></p>



<p>It actually doesn&#8217;t matter what comes after the ?<br>The query string can be anything, as long as it&#8217;s different than before.</p>



<p>By doing that you are &#8220;busting the browser cache.&#8221; That means that the browser will recognize this is a new file and download again, letting you see your changes. If you continue to use the exact same file name the browser will not understand that there is new content, so it won&#8217;t download it again.</p>



<p>WordPress themes and plugins have this in place and most often the query strings are the version number which updates when the theme/plugin updates. </p>



<p>If you are creating your own custom theme make sure you edit the theme version number in your <code>style.css</code> when you make an update:</p>



<figure class="wp-block-image size-medium"><img decoding="async" width="500" height="257" src="https://webtrainingwheels.com/wp-content/uploads/2023/11/child-theme-version-500x257.jpg" alt="" class="wp-image-6076" srcset="https://webtrainingwheels.com/wp-content/uploads/2023/11/child-theme-version-500x257.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2023/11/child-theme-version.jpg 746w" sizes="(max-width: 500px) 100vw, 500px" /></figure>



<p>This will change the query string on the files, and all your changes will be available. </p>



<p>If for some reason you can&#8217;t get that to work, you could try the <a href="https://wordpress.org/plugins/cachebuster/">Cachebuster plugin</a>. This is a very simple plugin that adds the file modification time as a query string to CSS and JS files. When the file is updated the query string will change, updating the cache of all site visitors.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="936" height="72" src="https://webtrainingwheels.com/wp-content/uploads/2023/11/cachebuster-plugin.jpg" alt="" class="wp-image-6096" srcset="https://webtrainingwheels.com/wp-content/uploads/2023/11/cachebuster-plugin.jpg 936w, https://webtrainingwheels.com/wp-content/uploads/2023/11/cachebuster-plugin-500x38.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2023/11/cachebuster-plugin-768x59.jpg 768w" sizes="(max-width: 936px) 100vw, 936px" /></figure>



<p><strong>Media files</strong></p>



<p>Other files which could be browser cached are media files like images and pdfs. This can be trickier because they don&#8217;t have any query strings to version them, by default, and there isn&#8217;t a simple WordPress way to add and change them automatically.</p>



<p>In most cases you don&#8217;t update these kinds of files often. But if you need to update a file and don&#8217;t change the filename, you will run into a problem.</p>



<p>There is no great way to handle this in WordPress, to be honest. </p>



<p>Some people want to disable browser caching entirely for these file types by adding something like the following to their htaccess file: </p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">FilesMatch</span> "\<span class="hljs-attr">.</span>(<span class="hljs-attr">gif</span>|<span class="hljs-attr">jpe</span>?<span class="hljs-attr">g</span>|<span class="hljs-attr">png</span>|<span class="hljs-attr">webp</span>)$"&gt;</span> 
<span class="hljs-tag">&lt;<span class="hljs-name">IfModule</span> <span class="hljs-attr">mod_headers.c</span>&gt;</span> 
Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0" 
<span class="hljs-tag">&lt;/<span class="hljs-name">IfModule</span>&gt;</span> 
<span class="hljs-tag">&lt;/<span class="hljs-name">FilesMatch</span>&gt;</span></code></span></pre>


<p>However, that&#8217;s disabling browser caching for all those filetypes which is overkill in my opinion.</p>



<p>You could use a more specific rule to target a specific file, like this:</p>


<pre class="wp-block-code"><span><code class="hljs language-php">&lt;IfModule mod_headers.c&gt;
&lt;FilesMatch <span class="hljs-string">"image.jpg"</span>&gt;
FileETag None
Header <span class="hljs-keyword">unset</span> ETag
Header set Cache-Control <span class="hljs-string">"max-age=0, no-cache, no-store, must-revalidate"</span>
Header set Pragma <span class="hljs-string">"no-cache"</span>
Header set Expires <span class="hljs-string">"Wed, 11 Jan 1984 05:00:00 GMT"</span>
&lt;/FilesMatch&gt;
&lt;/IfModule&gt;</code></span></pre>


<p>In the second line replace <code>image.jpg</code> with the filename you want to keep updated.</p>



<p>That&#8217;s still not ideal because there will be no browser caching for that file. </p>



<p>The best workaround would be to modify the filename. </p>



<p>In that case you would have to make sure you also update any links that point to it, to avoid a broken link. You can use the <a href="https://wordpress.org/plugins/enable-media-replace/" data-type="link" data-id="https://wordpress.org/plugins/enable-media-replace/">Enable Media Replace</a> plugin to help with that. </p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="661" src="https://webtrainingwheels.com/wp-content/uploads/2023/11/enable-media-replace-1024x661.jpg" alt="" class="wp-image-6097" srcset="https://webtrainingwheels.com/wp-content/uploads/2023/11/enable-media-replace-1024x661.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2023/11/enable-media-replace-500x323.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2023/11/enable-media-replace-768x496.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2023/11/enable-media-replace.jpg 1190w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>If you are linking to a PDF you can add a query string to the file manually. To do that in the block editor, go to <em>edit visually</em> and manually edit the URL to add the query string:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="183" src="https://webtrainingwheels.com/wp-content/uploads/2023/11/pdf-query-string-1024x183.jpg" alt="" class="wp-image-6098" srcset="https://webtrainingwheels.com/wp-content/uploads/2023/11/pdf-query-string-1024x183.jpg 1024w, https://webtrainingwheels.com/wp-content/uploads/2023/11/pdf-query-string-500x89.jpg 500w, https://webtrainingwheels.com/wp-content/uploads/2023/11/pdf-query-string-768x137.jpg 768w, https://webtrainingwheels.com/wp-content/uploads/2023/11/pdf-query-string-1536x274.jpg 1536w, https://webtrainingwheels.com/wp-content/uploads/2023/11/pdf-query-string.jpg 1614w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">How to clear your browser cache in WordPress</h2>



<p>If you&#8217;ve followed along with the article so far, you&#8217;ll now realize that this question is a bit incorrect. As we&#8217;ve learned, the browser cache is not specific to WordPress. </p>



<p>The browser cache lives on each person&#8217;s device, so you can&#8217;t clear it from WordPress. </p>



<p>Each person has to clear their own browser cache on their own device. <a href="https://www.lifewire.com/how-to-clear-cache-2617980">Here&#8217;s how to do it in the major browsers</a>. </p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
