<?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>WP Engine®</title>
	<atom:link href="https://wpengine.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://wpengine.com/</link>
	<description>Managed Hosting for WordPress</description>
	<lastBuildDate>Thu, 23 Jul 2026 20:40:35 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://wpengine.com/wp-content/uploads/2025/08/WPEngineCogMark_512x512-150x150.png</url>
	<title>WP Engine®</title>
	<link>https://wpengine.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Solve These Common WordPress JavaScript Security Issues</title>
		<link>https://wpengine.com/blog/javascript-security/</link>
		
		<dc:creator><![CDATA[WP Engine]]></dc:creator>
		<pubDate>Wed, 22 Jul 2026 20:32:00 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/blog/javascript-security/</guid>

					<description><![CDATA[<p>JavaScript is the undisputed programming language engine of the modern web. It transforms static pages into highly interactive web applications, yielding faster response times and exceptional user experiences. But because JavaScript runs directly inside your users’ browsers, it also happens to be the primary vector for client-side attacks against WordPress sites. If you are a [&#8230;]</p>
<p>The post <a href="https://wpengine.com/blog/javascript-security/">Solve These Common WordPress JavaScript Security Issues</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes">JavaScript is the undisputed programming language engine of the modern web. It transforms static pages into highly interactive web applications, yielding faster response times and exceptional user experiences. But because JavaScript runs directly inside your users’ browsers, it also happens to be the primary vector for client-side attacks against WordPress sites.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If you are a WordPress developer, an agency engineer, or a security-conscious site owner building and maintaining JavaScript-heavy WordPress sites, understanding this cybersecurity landscape is non-negotiable. If your code gets it wrong, attackers can seamlessly hijack user sessions, scrape sensitive data, or execute various hacks to seize control of your site entirely.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The scale of this threat isn’t theoretical. In March 2025, security researchers reported that <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.channele2e.com/brief/wordpress-sites-compromised-by-javascript-backdoors">more than 1,000 WordPress sites were loading malicious third-party JavaScript</a> that established four separate backdoors, giving attackers multiple ways to maintain access to compromised sites.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Secure JavaScript development comes down to managing three critical risk pillars: how you handle user input, which scripts you choose to trust, and what data you expose to the browser.</p>



<h2 id="toc-what-is-javascript-security" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>What Is JavaScript security?</strong></h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">At its core, JavaScript security is the practice of writing, loading, and configuring JavaScript to reduce the risk of unauthorized code execution, data exposure, account compromise, and abusive browser behavior.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">JavaScript running on a page can access the Document Object Model (DOM), Web Storage API, data exposed to the page, and cookies that have not been marked HttpOnly. Cookies configured with HttpOnly cannot be read through JavaScript APIs such as document.cookie, although the browser may still include them automatically with applicable requests. If malicious JavaScript executes on the page, it may be able to modify visible content, access browser storage, capture data entered by users, redirect visitors, or perform authenticated actions using the victim’s active session.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The security equation gets uniquely complicated in the WordPress content management system ecosystem. A standard WordPress site often concurrently executes JavaScript bundled into WordPress core, active themes, numerous active plugins, and a web of third-party external tracking scripts. Every single one of these scripts functions as an independent, potential entry point to your user’s browser.</p>



<h2 id="toc-common-javascript-security-risks-in-wordpress" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Common JavaScript security risks in WordPress</strong></h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">While the web is full of diverse digital threats, the vast majority of client-side vulnerabilities in WordPress boil down to a handful of recurring categories.</p>



<h3 id="toc-cross-site-scripting-xss" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Cross-site scripting (XSS)</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Cross-site scripting (XSS) is the single most prevalent browser-side vulnerability in modern web development. An XSS vulnerability occurs when an attacker successfully injects a malicious payload into a legitimate, trusted website, using the application as a delivery vehicle to execute rogue scripts on an unsuspecting user. XSS primarily manifests in three distinct flavors:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Stored XSS:</strong> The malicious payload is permanently saved into the site’s database (e.g., via a compromised comment section or user profile field) and executed every time a user views the infected page.</li>



<li><strong>Reflected XSS:</strong> The malicious script is embedded directly into a volatile request, such as unsanitized URL query parameters, requiring the target to click a rigged link.</li>



<li><strong>DOM-based XSS:</strong> The vulnerability exists entirely within the client-side code itself, where your JavaScript unsafely processes and executes data from the local environment without ever involving a server-side cycle.<br></li>
</ul>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In WordPress, XSS commonly sneaks in through unsanitized input fields within contact forms, comment sections, custom plugin settings panels, or poorly managed URL variables.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">WordPress output-escaping functions such as esc_html(), esc_attr(), esc_url() remain essential for server-rendered content. However, escaping must match the output context and should be performed as late as possible, immediately before rendering. When JavaScript dynamically modifies the DOM, prefer APIs such as textContent, .createElement(), and .append(), which treat strings as text rather than HTML. If dynamic HTML is genuinely required, sanitize it before inserting it into the page.</p>



<h3 id="toc-malicious-or-compromised-third-party-scripts" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Malicious or compromised third-party scripts</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Modern websites are assembled like puzzles, often relying on external Content Delivery Networks (CDNs), ad platforms, analytics frameworks, custom web fonts, and various dynamic scripts. However, loading scripts from third-party ecosystems exposes you to supply chain risks.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If a trusted external network or plugin repository is breached at the source, attackers can quietly alter those scripts to inject malicious payloads directly across your entire site layout. This threat compounds when sites rely on complex JavaScript-loader chains, where one script dynamically pulls down several others. In WordPress, every script dependency you add expands your attack surface; if you don’t actively vet your plugins and connections, you are implicitly trusting every developer down that supply chain.</p>



<h3 id="toc-insecure-javascript-functions" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Insecure JavaScript functions</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Many client-side vulnerabilities are accidentally self-inflicted through the use of risky legacy functions. Here are the key culprits to actively scrub from your codebase:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>eval()<strong>:</strong> This function parses any plain string passed to it and executes it directly as active JavaScript code. If attacker-controlled input reaches eval(), the attacker may gain arbitrary JavaScript execution within the security context of the affected page. That code may be able to read or modify page content, access browser storage available to the origin, and perform authenticated requests with the user’s browser session. You should drop it entirely in favor of secure alternatives like JSON.parse() for incoming JSON strings.</li>



<li>document.write()<strong>:</strong> This legacy method directly injects markup into the page loading cycle and is notoriously trivial to exploit for DOM-based XSS.</li>



<li>innerHTML<strong> and jQuery’s </strong>.html()<strong>:</strong> These methods interpret strings as HTML and are dangerous when those strings contain untrusted data. Although &lt;script&gt; elements inserted through innerHTML generally do not execute, attackers can still execute JavaScript through event-handler attributes, malicious URLs, SVG content, and other forms of active markup. Prefer textContent and programmatic DOM construction when HTML interpretation is not required.&nbsp;</li>



<li>setTimeout()<strong> and </strong>setInterval()<strong> with string parameters:</strong> Passing a raw string to these timing functions forces the engine to evaluate it exactly like an eval() call. Always pass direct function references instead.</li>
</ul>



<h3 id="toc-insecure-cookie-handling" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Insecure cookie handling</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Session and authentication cookies act as your passport on the web. If a session cookie is accessible to JavaScript, a successful XSS attack may be able to read and exfiltrate it, potentially enabling session hijacking. Marking the cookie HttpOnly prevents direct JavaScript access to its value. However, HttpOnly does not prevent malicious JavaScript already executing on the trusted origin from making authenticated requests, because the browser may still attach the cookie automatically.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">CSRF is a separate attack in which another site tricks an authenticated user’s browser into making an unwanted request. SameSite cookies and WordPress nonces can help mitigate CSRF, but an active XSS vulnerability can often bypass normal CSRF defenses because the malicious code is executing within the trusted site.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To safeguard cookies from JavaScript interception, you must enforce proper attributes:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>HttpOnly<strong>:</strong> This server-side flag ensures that the cookie is completely invisible to client-side scripts, neutralizing cookie theft via XSS. While WordPress core correctly secures its authentication cookies with this flag out of the box, any custom cookies generated by your plugins or themes require explicit configuration.</li>



<li>Secure<strong>:</strong> This forces the browser to transmit the cookie exclusively over encrypted HTTPS connections.</li>



<li>SameSite<strong>:</strong> This controls when a browser includes a cookie with cross-site requests. SameSite=Strict provides the strongest restriction but may interfere with legitimate navigation and authentication workflows. SameSite=Lax permits cookies in certain top-level navigation scenarios while blocking many other cross-site uses. Because SameSite is only a partial CSRF defense, sensitive operations should still use appropriate request-verification controls.</li>
</ul>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">For sensitive session and authentication identifiers, always configure them server-side using HTTP headers so you can apply the HttpOnly flag and the secure __Host- prefix:</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><code>Set-Cookie:__Host-session=&lt;opaque-session-id&gt;; Path=/; Secure; HttpOnly; SameSite=Lax</code></p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When handling genuinely non-sensitive client preferences directly within JavaScript (such as saving a user’s theme selection), enforce encryption and scope restrictions without using session-related naming:</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><code>document.cookie = "theme=dark; Path=/; Secure; SameSite=Lax";</code></p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Additionally, remember to never store sensitive authentication tokens or user PII in local structures like localStorage that remain exposed to client-side script queries.</p>



<h3 id="toc-exposed-javascript-apis" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Exposed JavaScript APIs</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Modern frontend scripts communicate constantly with backend services using the WordPress REST API or various external API endpoints. A major risk occurs when developers accidentally hardcode sensitive credentials, private API keys, or access tokens directly into their public, client-side files where anyone inspecting the code can copy them.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Furthermore, client-side validation alone is never a true security barrier. Use an authentication method appropriate to the client making the REST API request. For requests made from a logged-in WordPress interface using WordPress authentication cookies, include a REST API nonce to help protect against CSRF. A nonce does not authenticate a user or determine what that user is authorized to do.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Every protected custom REST route should define a <code>permission_callback</code> and perform server-side capability checks, commonly with current_user_can(). External and headless clients should use an appropriate authentication mechanism, such as WordPress Application Passwords over HTTPS or another carefully reviewed authentication system.</p>



<h3 id="toc-plugin-and-theme-vulnerabilities" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Plugin and theme vulnerabilities</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The vast open-source nature of WordPress is its greatest strength, but it’s also a major source of security friction. Because anyone can publish a plugin or theme, the quality of JavaScript safety varies widely based on the creator’s security expertise.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Unpatched vulnerabilities in old or abandoned extensions are a primary target for automated web exploits. Mitigating this risk requires disciplined extension management. Before installing a plugin or theme, review its maintenance history, supported WordPress and PHP versions, recent releases, known vulnerability history, security-reporting process, developer responsiveness, and whether the extension is still necessary. Active installation counts and user reviews may provide useful context, but they should not be treated as evidence that an extension is secure.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Remove plugins and themes that are no longer required, maintain an inventory of installed components, monitor for published vulnerabilities, and apply security updates promptly after appropriate testing.</p>



<h2 id="toc-javascript-security-best-practices-for-wordpress" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>JavaScript security best practices for WordPress</strong></h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Building a secure WordPress environment requires a layered defense strategy. Relying on a single security measure is never enough. True resilience in website security comes from combining clean coding habits with robust platform-level configurations. The following best practices are prioritized by their overall security impact.<br></p>



<h3 id="toc-1-avoid-direct-html-insertion-in-javascript" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>1. Avoid direct HTML insertion in JavaScript</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The single most effective defense against cross-site scripting is to completely avoid inserting raw HTML strings directly into the browser’s DOM. Methods such as innerHTML and jQuery’s .html() are HTML injection sinks. Passing untrusted strings to them can create DOM-based XSS vulnerabilities through event handlers, dangerous URL schemes, SVG markup, and other executable HTML constructs.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Instead, construct your user interface elements programmatically using safe, native DOM generation methods like createElement, createTextNode, appendChild, or append. These native tools treat content strictly as data text rather than executable markup.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If you are working within modern component frameworks like React, avoid utilizing attributes like dangerouslySetInnerHTML unless it is absolutely necessary. If you encounter an edge case where dynamic HTML rendering cannot be avoided, you must pass the string through a specialized client-side sanitization script first.</p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>// BAD PATTERN: Vulnerable to XSS if the API response is manipulated
const userSnippet = response.userData; 
jQuery('#user-profile').html("&lt;p&gt;" + userSnippet + "&lt;/p&gt;");

// GOOD PATTERN: Safe DOM construction that treats input strictly as data
const profileContainer = document.getElementById('user-profile');
const paragraphElement = document.createElement('p');
paragraphElement.textContent = response.userData; 
profileContainer.appendChild(paragraphElement);
</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<h3 id="toc-2-sanitize-user-input-on-both-sides" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>2. Sanitize user input on both sides</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Comprehensive application security requires input validation and sanitization at both ends of the data pipeline. On the server side, validate incoming data against the expected format whenever possible. If strict validation is not possible, sanitize the input before processing or storage using the appropriate WordPress function, such as sanitize_text_field() for plain text or wp_kses() when a controlled subset of HTML is allowed.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">However, server-side scrubbing alone does not secure data that is manipulated dynamically on the client side. When handling raw data within JavaScript, protect your execution context by utilizing an industry-standard client-side library like <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://github.com/cure53/dompurify">DOMPurify</a> to strip out malicious payloads before rendering any dynamic elements.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Validation checks whether data matches the expected format. Sanitization cleans data when strict validation is not possible. Escaping makes data safe for a specific output context at rendering time. These controls serve different purposes and should not be treated as interchangeable</p>



<h3 id="toc-3-implement-a-content-security-policy" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>3. Implement a content security policy</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A content security policy (CSP) is an HTTP header configured on your web server that establishes a strict set of rules telling the user’s browser exactly which sources of scripts, styles, layouts, and external resources are allowed to load and execute.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A well-configured CSP serves as an excellent security layer. Even if an attacker uncovers an open XSS vulnerability on your site and injects a malicious payload, the browser will consult your policy, recognize the script origin as unauthorized, and block it from executing.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">You can inject a CSP header through your <code>wp-config.php</code> file, your theme’s functions.php file, or directly within your hosting server configuration files (such as <code>.htaccess</code> for Apache or <code>nginx.conf </code>for Nginx). A standard baseline policy looks similar to this:</p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.google.com 'nonce-2726x';
</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">This specific rule dictates that by default, resources must originate strictly from the site’s own domain, while explicitly granting JavaScript execution rights only to the site itself and Google’s trusted API endpoint.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Be aware that an overly aggressive CSP can break existing plugins or tracking systems that rely on inline scripts. When deploying a new policy, always run it in <code>Content-Security-Policy-Report-Only</code> mode first to catch and log errors without disrupting the frontend user experience.</p>



<h3 id="toc-4-consider-trusted-types-for-additional-dom-xss-protection" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>4. Consider Trusted Types for additional DOM XSS protection</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://developer.mozilla.org/en-US/docs/Web/API/Trusted_Types_API">Trusted Types</a> provide an additional browser-enforced defense against DOM-based XSS. When enabled through Content Security Policy, Trusted Types can prevent application code from passing ordinary strings directly to dangerous DOM injection sinks such as innerHTML.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Instead, code must create approved values through a Trusted Types policy. For HTML content, the policy can use a sanitizer such as DOMPurify on GitHub before producing a TrustedHTML value.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A simplified policy example here:<br></p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>&lt;/&gt;http

Content-Security-Policy:
  require-trusted-types-for 'script';
  trusted-types app-html;
</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>const htmlPolicy = trustedTypes.createPolicy('app-html', {
  createHTML: (input) =&gt; DOMPurify.sanitize(input),
});

element.innerHTML = htmlPolicy.createHTML(untrustedHTML);
</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<h3 id="toc-5-use-subresource-integrity-for-external-scripts" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>5. Use subresource integrity for external scripts</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To protect your site from supply chain attacks, you should implement subresource integrity (SRI) whenever you link to scripts hosted on external third-party servers or CDNs. SRI allows you to attach a specific, cryptographic hash value directly onto your script tags.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When the user’s browser fetches the script from the external source, it hashes the downloaded file and compares it to your defined string. If a bad actor compromises that external network and inserts a malicious backdoor into the file, the hashes will fail to match, and the browser will refuse to load the script.</p>



<pre class="wp-block-preformatted" data-analytics-track-visibility="yes">&lt;script src="https://cdn.example.com/library-v1.js"&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8mC"&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crossorigin="anonymous"&gt;&lt;/script&gt;</pre>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Keep in mind that SRI is intended exclusively for static, version-controlled scripts. It cannot be used on dynamic scripts or endpoints whose underlying code changes frequently.</p>



<h3 id="toc-6-secure-cookies-properly" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>6. Secure cookies properly</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To neutralize session hijacking and unauthorized Cross-Site Request Forgery (CSRF) attempts, you must explicitly isolate your cookies from unauthorized browser contexts.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Ensure your server-side scripts assign the <code>HttpOnly</code> attribute to all critical authentication and session identifiers. While WordPress core applies this setting natively to standard user logins, custom plugin cookies require explicit assignment.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Additionally, always attach the <code>Secure </code>flag to ensure cookies are transmitted exclusively over encrypted HTTPS networks, and set the <code>SameSite</code> attribute to <code>Strict</code> or <code>Lax</code> to prevent cookies from being passed to external or cross-origin requests. Avoid placing highly sensitive data, access keys, or user credentials inside accessible cookies or browser localStorage where client-side JavaScript can freely query them.</p>



<h3 id="toc-7-audit-third-party-scripts-and-dependencies" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>7. Audit third-party scripts and dependencies</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Every plugin, theme, or tracking pixel you load introduces code from an external developer into your environment, expanding your site’s attack surface. Mitigate supply chain risks by performing routine, scheduled audits of all internal and external dependencies.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Utilize automated security infrastructure tools such as <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://wpscan.com/">WPScan</a> or <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.wordfence.com/">Wordfence</a> to track core file changes, perform malware scanning, and scan for known plugin vulnerabilities. If your WordPress platform uses a headless design or relies on compilation tools, run <code>npm audit</code> to catch vulnerable dependencies inside your <code>package.json</code> files.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When managing extensions, remember that simply deactivating a plugin does not secure your site. You must completely delete the files to remove them from your server. Consider leveraging automated updating solutions like WP Engine’s <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/smart-plugin-manager/">Smart Plugin Manager</a> to safely test and apply patches the moment security fixes are released.</p>



<h3 id="toc-8-use-https-everywhere" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>8. Use HTTPS everywhere</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Enforcing HTTPS across your entire application is a baseline security requirement. HTTPS uses Transport Layer Security (TLS) instead of the now outdated SSL to encrypt data traveling between the user’s browser and the web server, helping protect the connection against eavesdropping and modification. Serve the main document and all scripts, styles, images, API calls, and other subresources over HTTPS to avoid insecure mixed content.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Without complete HTTPS coverage, your site is highly vulnerable to man-in-the-middle (MITM) attacks, where interceptors can inject malicious JavaScript directly into an unencrypted session. Managed hosting environments often eliminate this barrier by supplying automated, free SSL certificates.</p>



<h3 id="toc-9-limit-javascript-api-surface" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>9. Limit JavaScript API surface</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Do not reveal more data or infrastructure entry points to the browser than your application absolutely needs to function. Protect custom WordPress REST API routes with a properly implemented <code>permission_callback</code>, server-side capability checks, input validation, and the authentication mechanism appropriate to the client. Use a REST nonce when the request relies on WordPress cookie authentication, but do not treat the nonce as a replacement for authentication or authorization.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Most importantly, never expose permanent private API keys, client secrets, or sensitive cloud credentials within public, client-facing scripts. If a browser application requires access to a secured external API, route the approved operations through a server-side endpoint so that private credentials are never included in the client bundle. The endpoint must authenticate and authorize the requesting user, validate all input, restrict requests to approved destinations and operations, apply appropriate rate limits, avoid returning unnecessary upstream data, and log suspicious activity.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Do not create a general-purpose proxy that accepts an arbitrary destination URL. Without strict destination allowlists and request controls, a proxy can introduce server-side request forgery and credential-abuse risks.</p>



<h3 id="toc-10-enable-a-web-application-firewall-waf" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>10. Enable a web application firewall (WAF)</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A WAF provides an essential protective perimeter around your site by evaluating incoming traffic patterns before they ever reach your web application layer. A WAF can detect and block many known malicious HTTP request patterns, including some common XSS payloads, automated abuse, brute force attacks, and other application-layer attacks. It provides a valuable defense-in-depth layer but does not repair vulnerable application code and cannot reliably identify every new or obfuscated payload.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">For optimal performance, implement a WAF at the network edge rather than relying on heavy application-level WordPress security plugins. Edge-level sorting blocks malicious actors and DDoS attempts immediately, saving your server’s database resources and processing power for legitimate visitors. WP Engine offers <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/global-edge-security/">Global Edge Security</a>, which features a managed WAF built specifically to handle WordPress vulnerabilities.</p>



<h3 id="toc-11-monitor-and-audit" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>11. Monitor and audit</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Proactive real-time monitoring helps you catch and neutralize threats before they cause widespread damage. Deploy automated file integrity monitoring solutions to alert your team the moment unexpected edits or additions occur within your site’s directory tree.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Routinely review your web server logs for suspicious requests, repeated API errors, or unauthorized script-loading behavior. Utilizing centralized security dashboards provided by your hosting provider allows you to quickly pinpoint abnormalities and track potential indicators of compromise across your entire file layer.</p>



<h2 id="toc-javascript-security-scanners-and-tools" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>JavaScript Security Scanners and Tools</strong></h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Automated testing tools help you inspect your application from an external point of view to find vulnerabilities before hackers and attackers do. While automated scanners are highly effective at identifying known errors, they should complement a broader defense-in-depth security approach.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Consider integrating these security scanners into your workflow:</p>



<figure class="wp-block-table" data-analytics-track-visibility="yes"><table class="has-fixed-layout"><tbody><tr><td><strong>Tool Name</strong></td><td><strong>Tool Type</strong></td><td><strong>Primary Use Case</strong></td></tr><tr><td><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://wpscan.com/"><strong>WPScan</strong></a></td><td>Ecosystem scanner</td><td>Scans WordPress core, active themes, and plugins for known security flaws.</td></tr><tr><td><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.wordfence.com/"><strong>Wordfence</strong></a></td><td>Security extension</td><td>Features built-in file scanning capable of detecting obfuscated client-side scripts and malware.</td></tr><tr><td><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://sitecheck.sucuri.net/"><strong>Sucuri SiteCheck</strong></a></td><td>Remote scanner</td><td>A free, remote scanning utility that checks for external indicators of malware, blacklisting, and defacement.</td></tr><tr><td><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.zaproxy.org/"><strong>ZAP</strong></a></td><td>Application scanner</td><td>An open-source web app security tool designed to identify complex injection flaws like XSS and CSRF.</td></tr><tr><td><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://security.snyk.io/package/npm/npm-audit-report"><strong>npm audit / Snyk</strong></a></td><td>Developer workflow</td><td>Automatically audits local developer setups to identify vulnerable JavaScript packages inside package.json files.</td></tr><tr><td><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://developer.mozilla.org/en-US/observatory"><strong>Mozilla Observatory</strong></a></td><td>Header audit</td><td>Analyzes web server configurations to confirm the presence of security headers like CSP and HSTS.</td></tr></tbody></table></figure>



<h2 id="toc-the-managed-hosting-advantage-for-javascript-security" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>The managed hosting advantage for JavaScript security</strong></h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Implementing every layer of JavaScript security manually can require significant development time and operational upkeep. A managed WordPress hosting architecture streamlines this process by embedding enterprise-grade security controls directly into the server infrastructure layer.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When you partner with a premium managed platform like WP Engine, you gain access to an infrastructure built around client-side safety:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Edge-level protection:</strong> A managed WAF can block many known malicious request patterns before they reach WordPress, reducing exposure to common automated attacks. A WAF cannot prevent every XSS vulnerability, particularly DOM-based XSS that occurs entirely within browser-side JavaScript or attacks involving already trusted third-party scripts.</li>



<li><strong>Automated patch management:</strong> Systems like Smart Plugin Manager automatically track, test, and apply critical plugin patches to keep your site updated without breaking functionality.</li>



<li><strong>Proactive Continuous auditing:</strong> Dedicated security operations teams monitor platform traffic logs, track ecosystem developments, and apply server-level protection rules against zero-day vulnerabilities.</li>



<li><strong>Strict curated infrastructure:</strong> Curated disallowed-plugin filters block extensions with known vulnerabilities, keeping high-risk code out of your ecosystem.</li>



<li><strong>Secure defaults:</strong> Features like automated SSL certificate generation, secure default cookie attributes, and easy security header configuration give you a highly protected environment out of the box.</li>
</ul>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">By delegating server management and edge security to a managed host, your development team can focus on writing clean application features rather than managing baseline infrastructure security. Client-side safety requires a unified approach: combine secure code habits with a protected server platform to keep your site resilient against modern web threats.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Ready to learn more? Explore <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/plans/">WP Engine’s hosting plans</a> to see how we protect your application.</p>



<h2 id="toc-faqs-about-javascript-security-for-wordpress" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>FAQs about JavaScript security for WordPress</strong></h2>



<h3 id="toc-what-is-the-biggest-javascript-security-risk-for-wordpress" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>What Is the biggest JavaScript security risk for WordPress sites?</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Cross-Site Scripting (XSS) is the most prominent threat. It enables attackers to inject malicious code into pages seen by other users, letting them hijack active browser sessions, compromise sensitive user data, or deface layouts. These scripts often infiltrate through unsecured plugin inputs or unvalidated URL parameters.</p>



<h3 id="toc-how-do-i-prevent-xss-attacks-in-wordpress-javascript" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>How do I prevent XSS attacks in WordPress JavaScript?</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Avoid direct HTML string insertions like <code>.innerHTML</code> or <code>.html()</code> entirely. Instead, construct elements using safe native DOM manipulation methods like <code>.createElement()</code> and <code>.textContent</code>. For scenarios requiring dynamic HTML input from external sources, sanitize the data thoroughly using an industry-standard library like DOMPurify first.</p>



<h3 id="toc-what-is-a-content-security-policy-and-why-does" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>What is a content security policy and why does it matter?</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A content security policy (CSP) is an HTTP header restricting which script, style, and media sources the browser is authorized to execute. It serves as a powerful safety net; even if an attacker successfully injects a malicious script payload into your page, the browser will block it from running.</p>



<h3 id="toc-are-wordpress-plugins-a-security-risk" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Are WordPress plugins a security risk?</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">They can be if they use outdated or insecure JavaScript logic. Because plugin development quality varies, unpatched software introduces cross-site scripting risks and supply chain backdoors. Protect your site by only installing highly-rated, actively updated plugins, and completely deleting any extensions you do not use.</p>



<h3 id="toc-how-often-should-i-audit-my-wordpress-javascript-dependencies" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>How often should I audit my WordPress JavaScript dependencies?</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Audits should be performed regularly as part of a routine maintenance schedule or integrated into your active development deployments. Utilize automated security utilities to immediately identify known script vulnerabilities, and keep your software environment continuously updated using automated update managers.</p>



<h3 id="toc-does-managed-hosting-protect-against-javascript-attacks" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Does managed hosting protect against JavaScript attacks?</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The right managed host helps by adding several layers of infrastructure-level defense. Managed platforms may provide a managed WAF that blocks many known injection attempts before they reach WordPress. This reduces risk. You must also include best practices around secure coding, dependency management, output escaping, CSP, or browser-side protections.</p><p>The post <a href="https://wpengine.com/blog/javascript-security/">Solve These Common WordPress JavaScript Security Issues</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WordPress Cookies</title>
		<link>https://wpengine.com/blog/wordpress-cookies/</link>
		
		<dc:creator><![CDATA[Erin Myers]]></dc:creator>
		<pubDate>Tue, 21 Jul 2026 17:38:00 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/blog/wordpress-cookies/</guid>

					<description><![CDATA[<p>You’ve probably noticed that a lot of the websites you visit “remember” things about you. The information they store can be anything from your login credentials to items you’ve browsed, articles you’ve liked, and more. To do that, websites use what are called “cookies.” Cookies on the web enable sites to store key information safely [&#8230;]</p>
<p>The post <a href="https://wpengine.com/blog/wordpress-cookies/">WordPress Cookies</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes">You’ve probably noticed that a lot of the websites you visit “remember” things about you. The information they store can be anything from your login credentials to items you’ve browsed, articles you’ve liked, and more.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To do that, websites use what are called “cookies.” Cookies on the web enable sites to store key information safely within visitors’ browsers. That way, they can provide a more personalized experience without putting user data at risk.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In this article, we’ll break down how cookies work and the ways WordPress in particular uses them. Then we’ll teach you how to set up custom cookies in WordPress. Let’s get to work!</p>



<h2 id="toc-what-are-cookies-in-wordpress" class="wp-block-heading" data-analytics-track-visibility="yes">What are cookies in WordPress?</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Simply put, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cookies">cookies are files</a> that your website stores in visitors’ browsers, which contain information about them. Here are some common examples of cookie use throughout the web:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>Storing session information that has been authenticated using login credentials, so users don’t have to re-enter them each time they visit your site.</li>



<li>Remembering specific pages that visitors have been looking at lately (i.e., “Recent products” on <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/best-practices-ecommerce-sites/">eCommerce sites</a>).</li>



<li>Noting specific user behavior, such as when they last visited your site.</li>
</ul>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Cookies are everywhere on the web, to the extent that there’s even <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.cookielaw.org/the-cookie-law/">specific legislation</a> that governs how you can use them in some parts of the world.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Overall, browsing the web would be a slower and less personal experience without cookies. Websites wouldn’t be able to remember any of the information that makes your life easier. That’s why WordPress is set up to use cookies out of the box.</p>



<h2 id="toc-how-wordpress-uses-cookies" class="wp-block-heading" data-analytics-track-visibility="yes">How WordPress uses cookies</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">By default, WordPress generates two types of cookies unless you tell it to do otherwise. Those include:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Session cookies:</strong> These are the ones that tell your browser: “Hey, we just logged into this site a little while ago, let’s reuse that session.” That saves you from logging in over and over on the same sites.</li>



<li><strong>Comments cookies:</strong> Whenever you comment on a WordPress website, it will save some of your details so you don’t have to re-enter them later on. That can include your username, email address, and more.</li>
</ul>



<h2 id="toc-how-wordpress-plugins-use-cookies" class="wp-block-heading" data-analytics-track-visibility="yes">How WordPress plugins use cookies</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">As you might imagine, WordPress plugins and other third-party tools also make extensive use of cookies. For example, if you use a <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/disallowed-plugins/#toc-related-posts-plugins">related posts plugin</a>, it probably takes advantage of cookies to store information about which pages users have viewed.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Likewise, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/wordpress-analytics-and-stats-plugins/">analytics plugins</a> tend to use cookies to store user behavior data. In most cases, these cookies are harmless. However, these days you might need to <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.cookiebot.com/en/gdpr-cookies/">display a cookie notice</a> on your website, depending on where you do business.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">You’ve probably seen these cookie notices all around the web, and it’s no coincidence. People are more interested than ever in online privacy, so it only makes sense that many websites try to be as transparent as possible.</p>



<h2 id="toc-how-to-set-cookies-in-wordpress" class="wp-block-heading" data-analytics-track-visibility="yes">How to set cookies in WordPress</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">You’ll need to use PHP to create and set up cookies in WordPress. Where you add the necessary code depends on whether you want to use your theme or a custom plugin. Let’s take a look at how the first method works.</p>



<h3 id="toc-step-1-open-your-themes-functions-php-file" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Step 1: Open your theme’s functions.php file</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In most cases, the theme approach is the easiest route to take. To set a new cookie, you’ll want to edit your active theme’s <em>functions.php </em>file.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">We should note that any changes you make to your theme should likely be done in a <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/create-child-theme-wordpress/">child theme</a>. This ensures they won’t be wiped out when the parent theme is updated.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Open your active theme’s folder, and look for the <em>functions.php</em><em> </em>file inside. To add a custom cookie, you’ll need to include some additional code within this file. Before that, however, you need to understand what parameters you can use:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>The name of the cookie</li>



<li>Its value</li>



<li>How long until it expires (it can’t last forever!)</li>



<li>Which pages the cookie will act on</li>



<li>Your domain and/or subdomains</li>



<li>Whether it should transfer over <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/resources/what-are-ssl-certificates/">HTTP or HTTPS</a></li>
</ul>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">We’re going to use these parameters within the next section, so don’t worry if you don’t fully understand what each of them does just yet.</p>



<h3 id="toc-step-2-add-your-new-cookies-code" class="wp-block-heading" data-analytics-track-visibility="yes"><strong>Step 2: Add your new cookie’s code</strong></h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Once you open the <em>functions.php </em>file, you’ll be able to add custom code to it. Here’s an example of the code you’d use to add a new cookie:e’s an example of the code you’d use to add a new cookie:<br></p>



<pre class="wp-block-preformatted" data-analytics-track-visibility="yes">/**<br> * Shared cookie settings.<br> * Keeping these in one place helps ensure create/delete use the same path/domain/etc.<br> */<br>function wpdocs_visit_cookie_options() {<br>    return array(<br>        // If WordPress defines a cookie path, use it; otherwise fall back to root.<br>        'path'     =&gt; ( defined( 'COOKIEPATH' ) &amp;&amp; COOKIEPATH ) ? COOKIEPATH : '/',<br>        // Empty domain means "current host" behavior in most cases.<br>        'domain'   =&gt; defined( 'COOKIE_DOMAIN' ) ? COOKIE_DOMAIN : '',<br>        // Only send cookie over HTTPS when site is on SSL.<br>        'secure'   =&gt; is_ssl(),<br>        // Prevent JavaScript from reading this cookie (mitigates some XSS impact).<br>        'httponly' =&gt; true,<br>        // Good default for normal site navigation and basic CSRF protection.<br>        'samesite' =&gt; 'Lax',<br>    );<br>}<br><br>/**<br> * CREATE: set visit_time once, storing a Unix timestamp.<br> */<br>function wpdocs_set_visit_time_cookie() {<br>    // Cookies are sent in headers; bail if headers already went out.<br>    if ( headers_sent() ) {<br>        return;<br>    }<br><br>    // Only set on first visit (or until cookie expires).<br>    if ( isset( $_COOKIE['visit_time'] ) ) {<br>        return;<br>    }<br><br>    // Store Unix timestamp as a string.<br>    $value   = (string) time();<br>    // Expire in 24 hours.<br>    $expires = time() + DAY_IN_SECONDS;<br>    $opts    = wpdocs_visit_cookie_options();<br><br>    setcookie(<br>        'visit_time',<br>        $value,<br>        array(<br>            'expires'  =&gt; $expires,<br>            'path'     =&gt; $opts['path'],<br>            'domain'   =&gt; $opts['domain'],<br>            'secure'   =&gt; $opts['secure'],<br>            'httponly' =&gt; $opts['httponly'],<br>            'samesite' =&gt; $opts['samesite'],<br>        )<br>    );<br><br>    // Keep current request state in sync (browser receives cookie on next request).<br>    $_COOKIE['visit_time'] = $value;<br>}<br>// Run early so cookie headers are set before output.<br>add_action( 'init', 'wpdocs_set_visit_time_cookie', 1 );<br></pre>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">That code includes the parameters we laid out in the last section. There’s the cookie name (<em>cookies_timestamp</em>), its value (<em>visit_time</em>), and how long until it expires. For additional information on configuring your cookie, see the <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.php.net/manual/en/function.setcookie.php">PHP docs</a> on setcookie.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">This cookie generates a timestamp of the last time someone visited your site. You might then use the cookie to display a message such as, “Your last visit was on January 25th, 2019.” This lets users know if someone else has accessed their account.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">As for the expiration time, you’ll notice it’s in seconds. We set the value for a day, which is pretty short by cookie standards. The rest of the parameters don’t matter as much, because the default options work well enough in almost every case.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When you’re done configuring your cookie, save the changes to <em>functions.php</em><em>.</em> Once you deploy this code to your site using your regular methods, your cookie will start working right away!</p>



<h2 id="toc-how-to-get-a-cookie-and-use-it-in" class="wp-block-heading" data-analytics-track-visibility="yes">How to get a cookie and use it in WordPress</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In the last section, we talked about how you can use cookies in web development to store relevant user-specific data. There’s a specific function you can use to “get” cookies, so to speak.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To use it, you’ll need to edit your theme’s <em>functions.php</em><em> </em>file once more. Here’s a quick example:</p>



<pre class="wp-block-preformatted" data-analytics-track-visibility="yes">/**<br> * READ: return a formatted label from the visit_time timestamp.<br> * Returns empty string when cookie is missing/invalid. <br> */<br>function wpdocs_get_visit_time_label() {<br>    // No cookie yet means first visit. <br>    if ( empty( $_COOKIE['visit_time'] ) ) {<br>        return '';<br>    }<br><br>    // Unslash + cast to safe positive integer.<br>    $timestamp = absint( wp_unslash( $_COOKIE['visit_time'] ) );<br>    if ( ! $timestamp ) {<br>        return '';<br>    }<br><br>    // Format using WordPress date handling (timezone-aware).<br>    return wp_date( 'F j, Y g:i a', $timestamp );<br>}<br><br>/**<br>* Use the formatted date in your php as needed in a template file, theme action hook, shortcode, or block render callback.<br>*/<br>$last_visit = wpdocs_get_visit_time_label();<br>if ( $last_visit ) {<br>    echo '&lt;p class="visit-time"&gt;&lt;strong&gt;Welcome back!&lt;/strong&gt; Your last visit was on: ' . esc_html( $last_visit ) . '&lt;/p&gt;';<br>}<br></pre>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In a nutshell, this creates a second function that checks to see if the <em>visit_time </em>cookie we created during the last section is there. If it is, then the code will return a formatted date for use in our theme.</p>



<h2 id="toc-deleting-a-cookie-in-wordpress" class="wp-block-heading" data-analytics-track-visibility="yes">Deleting a Cookie in WordPress</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To delete a cookie, you can’t just clear it with PHP memory functions. You have to tell the visitor’s browser that the cookie has expired. You can achieve this by setting its expiration date to a time in the past.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To delete a cookie safely in WordPress, add the following code to your theme’s <em>functions.php</em><em> </em>file:&nbsp;</p>



<pre class="wp-block-preformatted" data-analytics-track-visibility="yes">/**<br> * DELETE: expire in the past using matching attributes.<br> */<br>function wpdocs_delete_visit_time_cookie() {<br>    // Need headers + existing cookie to attempt deletion.<br>    if ( headers_sent() || ! isset( $_COOKIE['visit_time'] ) ) {<br>        return;<br>    }<br><br>    $opts = wpdocs_visit_cookie_options();<br><br>    setcookie(<br>        'visit_time',<br>        '',<br>        array(<br>            // Past timestamp tells browser to remove cookie.<br>            'expires'  =&gt; time() - HOUR_IN_SECONDS,<br>            'path'     =&gt; $opts['path'],<br>            'domain'   =&gt; $opts['domain'],<br>            'secure'   =&gt; $opts['secure'],<br>            'httponly' =&gt; $opts['httponly'],<br>            'samesite' =&gt; $opts['samesite'],<br>        )<br>    );<br><br>    unset( $_COOKIE['visit_time'] );<br>}<br><br><br>// Example hook:<br>// add_action( 'wp_logout', 'wpdocs_delete_visit_time_cookie' );</pre>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">AAs always, remember that we’re using placeholders in our example. You’ll want to modify that code depending on your specific cookie’s name. Once the browser processes this script, the cookie will be permanently removed from the user’s system.</p>



<h2 id="toc-conclusion" class="wp-block-heading" data-analytics-track-visibility="yes">Conclusion</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Cookies are one of the many ways modern websites can provide their users with a better experience. Using WordPress, you can configure cookies to personalize your site for each visitor.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If you want to learn about other techniques for improving the user experience, check out <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/resources/">our developer resources</a>, where you can find dozens of guides and tutorials. While you’re at it, improve your experience with a <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/wordpress-hosting/">host specifically optimized for WordPress</a>. <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/plans/">Take a look at our plans</a>—chances are you’ll find a great fit!</p><p>The post <a href="https://wpengine.com/blog/wordpress-cookies/">WordPress Cookies</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Guide to Local Development for WordPress®</title>
		<link>https://wpengine.com/blog/local-development/</link>
					<comments>https://wpengine.com/blog/local-development/#comments</comments>
		
		<dc:creator><![CDATA[Michael Bertram]]></dc:creator>
		<pubDate>Wed, 15 Jul 2026 13:57:42 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/?p=7866</guid>

					<description><![CDATA[<p>Build, test, and deploy powerful sites faster with this essential guide to local WordPress® development in the WP Engine ecosystem.</p>
<p>The post <a href="https://wpengine.com/blog/local-development/">The Guide to Local Development for WordPress®</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Modern WordPress®<sup data-fn="c6f81e5c-531f-44eb-aca1-0fd1622c095e" class="fn"><a href="#c6f81e5c-531f-44eb-aca1-0fd1622c095e" id="c6f81e5c-531f-44eb-aca1-0fd1622c095e-link">1</a></sup> development requires speed and reliability. Whether you’re an agency pro or a freelancer, you need to build, test, and experiment safely without touching a live production site.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://localwp.com/" target="_blank" rel="noreferrer noopener">Local</a> solves this by turning your machine into a powerful offline server environment.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Developing locally grants total freedom. You can test plugins, tweak themes, and refactor code with zero risk to your live site. Paired with <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/managed-hosting-platform/" target="_blank" rel="noreferrer noopener">WP Engine hosting</a>, Local transforms your laptop into a secure, lightning-fast, and high-performance sandbox.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">This guide shows you how to master that ecosystem. You’ll learn everything from spinning up your first site to scaling your workflow with <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://localwp.com/help-docs/local-features/how-to-use-blueprints/" target="_blank" rel="noreferrer noopener">Blueprints</a> and advanced CI/CD pipelines.</p>



<h2 id="toc-getting-started" class="wp-block-heading" data-analytics-track-visibility="yes">Getting started</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Before diving into the code, you need to understand exactly what Local is and get comfortable navigating its interface.</p>



<h3 id="toc-what-is-local-development" class="wp-block-heading" data-analytics-track-visibility="yes">What is Local Development?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Before installing the software, it helps to understand what Local actually does.</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Providing a sandbox environment</strong>: Normally, a WordPress website lives on a live web hosting server. Local transforms your own machine into an offline server, allowing you to build and test your site completely in private.</li>



<li><strong>No internet required</strong>: Because the server is running directly on a laptop, it’s possible to build, break, and experiment with a WordPress site offline, meaning WordPress development can be performed anywhere.</li>



<li><strong>Experiment with (and break) sites safely: </strong>If you install a plugin that crashes the site or triggers a critical PHP error, your live website remains completely untouched and safe. This makes it a great tool for testing and experimentation.</li>
</ul>



<h2 id="toc-installation-system-preparation" class="wp-block-heading" data-analytics-track-visibility="yes">Installation &amp; system preparation</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Getting Local up and running is straightforward, but there are two things beginners should know before hitting download:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Admin privileges</strong>: During installation, your operating system (Mac or Windows) will likely ask for your administrator password. This is normal and safe; Local needs permission to tweak your system’s hosts file so that custom web addresses (like <code>mysite.local</code>) work correctly in your browser.</li>



<li><strong>Disk space check</strong>: While the Local application itself is lightweight, every WordPress site you create includes its own <em>database, core files, </em>and<em> media</em>. Keep an eye on your hard drive space if you plan to clone large production sites later.</li>
</ul>



<h2 id="toc-spinning-up-a-new-site" class="wp-block-heading" data-analytics-track-visibility="yes">Spinning up a new site</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To understand how professional teams collaborate without overwriting each other’s code, you need a clean baseline site to practice on. In this quick setup, we’re going to spin up a fresh local site and install a standard theme and plugin to mimic a real client project.</p>



<h3 id="toc-prerequisites" class="wp-block-heading" data-analytics-track-visibility="yes">Prerequisites</h3>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>Ensure Local is downloaded and installed on your machine.</li>



<li>Have your command line terminal handy (though we won’t need it just yet).</li>
</ul>



<h3 id="toc-getting-started-1" class="wp-block-heading" data-analytics-track-visibility="yes">Getting started</h3>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Create the site:</strong>
<ul class="wp-block-list">
<li>Open Local, click the “+” icon (Create a New Site), and give it a name. At this point there are some advanced options, but these can be left as the default for now.</li>



<li>Choose the preferred standard environment, to use the default most up to date versions of PHP and MySQL.</li>



<li>Finally add a WordPress <em>username</em> and <em>password</em></li>
</ul>
</li>
</ol>



<ol start="2" class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Launch the Admin Panel</strong>: Once the site is live, click the Admin button on your Local dashboard to jump straight to your WordPress login screen and log in with the details you set up previously.</li>



<li><strong>Install the Baseline Theme</strong>: Go to <em>Appearance – Themes – Add New</em>, then search for, install, and activate the <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://frostwp.com/" target="_blank" rel="noreferrer noopener">Frost theme</a> (a clean block theme perfect for development testing) or a theme of your choice.</li>



<li><strong>Install a Test Plugin</strong>: Go to <em>Plugins – Add New</em>, then search for, install, and activate any standard plugin of your choice.</li>
</ol>



<h2 id="toc-cloning-a-live-site" class="wp-block-heading" data-analytics-track-visibility="yes">Cloning a live site</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Spinning up a blank website in Local is great for practice, but what happens when a client hands you an existing, live website with hundreds of blog posts and thousands of images?</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Thanks to a tight integration between Local and the free <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://wordpress.org/plugins/wp-migrate-db/" target="_blank" rel="noreferrer noopener">WP Migrate Lite</a> plugin, you can package up a live website into a single .zip file and clone it onto your computer in just a few clicks with no complex API keys or server pipelines required.</p>



<h3 id="toc-prerequisites-1" class="wp-block-heading" data-analytics-track-visibility="yes">Prerequisites</h3>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>Install the free WP Migrate Lite plugin on the live website you want to clone.</li>



<li>Ensure your Local desktop application is open on your computer.</li>
</ul>



<h3 id="toc-getting-started-2" class="wp-block-heading" data-analytics-track-visibility="yes">Getting started</h3>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Export the live site</strong>: On your live WordPress dashboard, navigate to <em>Tools – WP Migrate</em>. Select the Full Site Export option to bundle your database, media library, themes, and plugins into a single package, and download the resulting <code>.zip</code> file.</li>



<li><strong>Drag, drop, and clone</strong>: Take that downloaded <code>.zip</code> file and drag it directly anywhere onto the open Local desktop app window.</li>



<li><strong>Automatic translation</strong>: Local will automatically read the zip package, unpack the files, and spin up a local copy.</li>



<li><strong>The magic behind the scenes</strong>: During the import, Local uses WP Migrate to run an automatic Find and Replace on your database. It safely updates all your live URLs (like mywebsite.com) to local URLs (like mywebsite.local) and fixes any broken serialized data automatically.</li>
</ol>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Want to see the full walkthrough of this migration process or learn more about how WP Migrate handles complex database serialization?</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Check out the full breakdown:<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://localwp.com/help-docs/getting-started/how-to-import-a-wordpress-site-into-local/" data-type="link" data-id="https://localwp.com/help-docs/getting-started/how-to-import-a-wordpress-site-into-local/" target="_blank" rel="noreferrer noopener"> Importing a Live Site with WP Migrate and Local</a>.</p>



<h2 id="toc-the-local-dashboard" class="wp-block-heading" data-analytics-track-visibility="yes">The Local dashboard</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When your new site finishes installing, you will be greeted by the Local dashboard. It can look intimidating with all its technical jargon, but you only need to know four main areas:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>The site control bar</strong>: This features the <strong>Start/Stop Site toggle</strong>. Local doesn’t need to drain your battery when you aren’t working; turn it on when you develop, and stop it when you’re done. You’ll also find the Admin button (takes you to the WordPress login) and the Open Site button (takes you to the website frontend).</li>



<li><strong>The overview tab</strong>: This shows your site’s vitals. Here, you can change your PHP Version on the fly to test compatibility. You can also toggle on One-Click Admin, a massive quality-of-life feature that automatically logs you into WordPress without making you type your password every time.</li>



<li><strong>The database tab</strong>: WordPress stores all your posts, pages, and settings in a database. Clicking <em>Open Admin</em> gives you a direct look into those database tables. You won’t need this often, but it’s a lifesaver if you ever need to manually fix a broken setting or edit data.</li>



<li><strong>The tools tab</strong>: This is where Local hides some of its best features, like Mailpit (an internal inbox that intercepts emails your site tries to send so you can test contact forms safely) and Live Links (which lets you generate a temporary, public URL to show your work to a client or test it on your phone).</li>
</ul>



<h2 id="toc-site-anatomy-where-do-your-files-actually-live" class="wp-block-heading" data-analytics-track-visibility="yes">Site anatomy: where do your files actually live?</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The biggest hurdle for beginners is losing track of where their website files are on their computer. If you don’t know where your files live, you won’t be able to write code or manage version control later.</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>In the Local dashboard, right under your site’s name, look for the “Site Folder” link. Clicking this opens your computer’s file finder (Finder on Mac, File Explorer on Windows) directly to your project directory.</li>



<li>Once inside that folder, navigate to: <em>app – public – wp-content</em></li>



<li>Inside wp-content, you will see your themes and plugins folders. Bookmark this location; it’s where you will be writing custom code, adding local Git repositories, and doing your real development work.</li>
</ul>



<h2 id="toc-optimizing-daily-workflow" class="wp-block-heading" data-analytics-track-visibility="yes">Optimizing daily workflow</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Once you have your baseline site running, you don’t need to jump straight into complex code. Local comes packed with built-in utilities designed to save you time, optimize your site’s performance, and make collaboration seamless.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Here are the three essential power features you can start using immediately:</p>



<h3 id="toc-1-live-links-share-your-progress-instantly" class="wp-block-heading" data-analytics-track-visibility="yes">1. Live links: share your progress instantly</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Live Links securely tunnels into your local machine to generate a temporary public URL. This allows you to show your work to a client or test your site on a mobile device without deploying it to a live staging server.</p>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li>Navigate to the bottom bar of your site’s dashboard in Local and click Enable next to Live Links.</li>



<li>Click the small dropdown arrow to view your temporary credentials (username and password).</li>



<li>Copy the URL and open it on your phone or text it to a client.</li>
</ol>



<section class="attention-block attention-block--tip" role="note" data-analytics-track-visibility="yes">
	<div class="attention-block__inner">
				<div class="attention-block__icon">
			<span class="screen-reader-text">Tip</span>
			<span aria-hidden="true"><svg viewBox="0 2 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7 19C7 20.1046 7.89543 21 9 21H15C16.1046 21 17 20.1046 17 19V16.9917C18.6164 15.6159 20 13.5197 20 11C20 6.58172 16.4183 3 12 3C7.58172 3 4 6.58172 4 11C4 13.5197 5.38359 15.6159 7 16.9917V19ZM18 11C18 13.087 16.6167 14.9251 15 16V19H9V16C7.3833 14.9251 6 13.087 6 11C6 7.68629 8.68629 5 12 5C15.3137 5 18 7.68629 18 11Z" fill="currentColor" />
<path d="M8.49984 23C8.2237 23 8 23.2239 8 23.5C8 24.2229 8.56274 24.6057 8.84654 24.7476C9.19291 24.9207 9.60207 25 10 25H14C14.3979 25 14.8071 24.9207 15.1535 24.7476C15.4373 24.6057 16 24.2229 16 23.5C16 23.2239 15.7763 23 15.5002 23H8.49984Z" fill="currentColor" />
</svg>
</span>
		</div>
				<div class="attention-block__content">
			<div class="attention-block__message">

<p class="wp-block-paragraph">Local automatically enables a secure HTTPS connection and privacy mode, ensuring search engine bots can’t find or index an unfinished local site.</p>

</div>
		</div>
	</div>
</section>



<h3 id="toc-2-image-optimizer-boost-site-speed-locally" class="wp-block-heading" data-analytics-track-visibility="yes">2. Image Optimizer: boost site speed locally</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Large images are a top cause of slow WordPress websites. Instead of waiting until your site is live to install heavy compression plugins, you can optimize your entire media library directly on your computer.</p>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li>Go to the tools tab in the top menu of your specific local site.</li>



<li>Select image optimizer (install the free add-on if prompted).</li>



<li>Click scan for images to let Local locate your JPEGs.</li>



<li>Optional: Check <em>Strip my Metadata</em> to safely remove hidden camera details and reduce file sizes even further.</li>



<li>Click <em>Optimize Images</em>. You can pause and resume this process at any time without losing your progress.</li>
</ol>



<h3 id="toc-3-cloud-backups-never-lose-your-work" class="wp-block-heading" data-analytics-track-visibility="yes">3. Cloud backups: never lose your work</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Local development is safe, but hard drives can still fail. The Cloud Backups add-on connects Local directly to your personal cloud storage, so you can save snapshots of your projects with a single click.</p>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li>Log into your free Local account within the app.</li>



<li>Go to the Add-ons menu and enable Cloud Backups.</li>



<li>Connect your preferred provider (like Google Drive or Dropbox).</li>



<li>Go back to your site provider, access the Backups tab, and click <em>Backup Now</em>. Your entire environment, database and files are safely stored and can be restored on any computer running Local.</li>
</ol>



<section class="attention-block attention-block--tip" role="note" data-analytics-track-visibility="yes">
	<div class="attention-block__inner">
				<div class="attention-block__icon">
			<span class="screen-reader-text">Tip</span>
			<span aria-hidden="true"><svg viewBox="0 2 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7 19C7 20.1046 7.89543 21 9 21H15C16.1046 21 17 20.1046 17 19V16.9917C18.6164 15.6159 20 13.5197 20 11C20 6.58172 16.4183 3 12 3C7.58172 3 4 6.58172 4 11C4 13.5197 5.38359 15.6159 7 16.9917V19ZM18 11C18 13.087 16.6167 14.9251 15 16V19H9V16C7.3833 14.9251 6 13.087 6 11C6 7.68629 8.68629 5 12 5C15.3137 5 18 7.68629 18 11Z" fill="currentColor" />
<path d="M8.49984 23C8.2237 23 8 23.2239 8 23.5C8 24.2229 8.56274 24.6057 8.84654 24.7476C9.19291 24.9207 9.60207 25 10 25H14C14.3979 25 14.8071 24.9207 15.1535 24.7476C15.4373 24.6057 16 24.2229 16 23.5C16 23.2239 15.7763 23 15.5002 23H8.49984Z" fill="currentColor" />
</svg>
</span>
		</div>
				<div class="attention-block__content">
			<div class="attention-block__message">

<p class="wp-block-paragraph">Local also includes powerful synchronization and templating tools called Local Connect and Blueprints. We will cover how to use these for advanced deployment and scaling in the upcoming sections.&nbsp;</p>

</div>
		</div>
	</div>
</section>



<h2 id="toc-blueprints-for-design-development" class="wp-block-heading" data-analytics-track-visibility="yes">Blueprints for design &amp; development</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When you first spin up a brand new site in Local, it arrives in a completely blank “Hello World” state with no custom styles, no active plugins, and standard settings. If your agency builds dozens of sites a year, repeating the exact same setup process (installing your favorite page builder, SEO plugin, and security tools) is a time sink.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">With Local’s Blueprints feature, you can configure your perfect “starter site” once, freeze it as a template, and clone it instantly for all your future projects.</p>



<h3 id="toc-getting-started-3" class="wp-block-heading" data-analytics-track-visibility="yes">Getting started</h3>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Build your baseline</strong>: Spin up a standard site in Local and install your required toolkit (plugins, themes, etc.). Configure your default permalinks and settings exactly how you like them.</li>



<li><strong>Save the blueprint</strong>: Right-click your site’s name in the left-hand sidebar menu (or click the three-dot icon next to the title and select <em>Save As Blueprint</em>.</li>



<li><strong>Name &amp; exclude</strong>: Give your template a clear name. You can optionally use the file exclusion filter to keep the file size light. Click save blueprint.</li>



<li><strong>Launch from the sidebar</strong>: Local pulls your templates into a dedicated blueprints tab right on the main navigation bar. The next time you click the “+” icon to build a site, simply choose create from blueprint to instantly drop your entire development team into a perfectly pre-configured environment.</li>
</ol>



<h2 id="toc-headless-wordpress-blueprints" class="wp-block-heading" data-analytics-track-visibility="yes">Headless WordPress blueprints</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If you or your clients are looking to step into the future of web architecture, standard monolithic WordPress isn’t your only choice. Local also includes built-in Headless WordPress Blueprints.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">This advanced framework separates your content management from your display layer, pairing a powerful WordPress backend with an ultra-fast Node.js frontend (using Faust.js, or WPGraphQL).</p>



<h3 id="toc-getting-started-4" class="wp-block-heading" data-analytics-track-visibility="yes">Getting started</h3>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li>Navigate to the puzzle piece icon on the left sidebar to open the Add-on Library.</li>



<li>Find the WP Engine Headless WordPress add-on, click enable, and allow Local to restart.</li>



<li>Open your Blueprints tab and scroll down to unlock three pre-built headless sandboxes</li>



<li>Select a template and click continue. Local will automatically deploy a local <code>Node.js</code> environment alongside your database and link them together automatically.</li>
</ol>



<h2 id="toc-advanced-architectures" class="wp-block-heading" data-analytics-track-visibility="yes">Advanced architectures</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Once you’ve mastered single-site setups and templates, it’s time to scale up. Local isn’t just for basic blogging environments; it’s powerful enough to run massive network sites and future-proof your code against upcoming core updates.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In this phase, we’ll explore how to set up a WordPress Multisite network, perfect for agencies managing multi-language variants or developers hosting a library of theme demos, as well as how to build a dedicated testing sandbox for upcoming WordPress core releases.</p>



<h3 id="toc-checklist" class="wp-block-heading" data-analytics-track-visibility="yes">Checklist</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Before scaling up your architecture, keep these two critical Local behaviors in mind:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Router mode</strong>: For Multisite to function, Local’s Router Mode must be set to “Site Domains” (e.g., <code>mysite.local</code>). If it’s set to <code>localhost</code>, sub-domains and sub-directories will break.</li>



<li><strong>Local connect limitation</strong>: Local Connect does not currently support syncing Multisite installations to live hosting. You will need to use a plugin like WP Migrate for remote deployment.</li>
</ul>



<h3 id="toc-1-scaling-up-with-wordpress-multisite" class="wp-block-heading" data-analytics-track-visibility="yes">1. Scaling up with WordPress multisite</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A Multisite network allows you to manage multiple virtual websites from a single WordPress installation and database. When you create a network of sites, you have to decide how their web addresses (URLs) will be structured. Local handles both perfectly, but they look a bit different:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Sub-Directories (Paths)</strong>: This structures your network like folders on a single website (e.g., <code>mysite.local/shop</code> or <code>mysite.local/blog</code>). It’s the easiest to set up because all sites live under one main domain name.</li>



<li><strong>Sub-Domains</strong>: This structures each site as a unique offshoot of your main domain (e.g., <code>shop.mysite.local</code> or <code>blog.mysite.local</code>).</li>
</ul>



<h4 id="toc-getting-started-5" class="wp-block-heading" data-analytics-track-visibility="yes">Getting started</h4>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li>Launch the Installer: Open Local, click the “+” icon, name your site and select continue</li>



<li>Choose the preferred (recommended) environment setup</li>



<li>Under Advanced Options, locate the Multisite dropdown and select either:
<ul class="wp-block-list">
<li>Sub-Domain: <code>site1.mysite.local</code></li>



<li>Sub-Directory: <code>mysite.local/site1</code></li>
</ul>
</li>



<li>Add Site: Complete the setup wizard. Local automatically handles the complex server routing rules under the hood.</li>



<li>Test the Network: Log into your new site, navigate to <em>My Sites – Network Admin – Sites</em>, and click <em>Add New</em> to instantly spin up a functioning sub-site.</li>
</ol>



<h3 id="toc-2-future-proofing-with-a-beta-testing-sandbox" class="wp-block-heading" data-analytics-track-visibility="yes">2. Future-proofing with a beta testing sandbox</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Never test unreleased WordPress software on a live client site. Local allows you to build a safe, isolated sandbox to ensure your custom themes and plugins are completely compatible with upcoming WordPress releases.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">There are a few ways to get a beta site running, but using a pre-configured Blueprint is by far the fastest method.</p>



<h4 id="toc-getting-started-6" class="wp-block-heading" data-analytics-track-visibility="yes">Getting started</h4>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://wpeng.in/6-6_rc-1/">Download a pre-built beta testing zip file directly</a>.</li>



<li>Drag the .<code>zip </code>file anywhere onto your open Local dashboard window to trigger the automatic environment import.</li>



<li>Launch the site and log in using the pre-baked credentials:
<ul class="wp-block-list">
<li>Username: <code>admin</code></li>



<li>Password: <code>admin</code></li>
</ul>
</li>



<li>The environment comes pre-loaded with the WordPress Beta Tester plugin active and set to the “Bleeding Edge” core development track, giving you instant access to the latest Release Candidates (RCs).</li>
</ol>



<section class="attention-block attention-block--tip" role="note" data-analytics-track-visibility="yes">
	<div class="attention-block__inner">
				<div class="attention-block__icon">
			<span class="screen-reader-text">Tip</span>
			<span aria-hidden="true"><svg viewBox="0 2 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7 19C7 20.1046 7.89543 21 9 21H15C16.1046 21 17 20.1046 17 19V16.9917C18.6164 15.6159 20 13.5197 20 11C20 6.58172 16.4183 3 12 3C7.58172 3 4 6.58172 4 11C4 13.5197 5.38359 15.6159 7 16.9917V19ZM18 11C18 13.087 16.6167 14.9251 15 16V19H9V16C7.3833 14.9251 6 13.087 6 11C6 7.68629 8.68629 5 12 5C15.3137 5 18 7.68629 18 11Z" fill="currentColor" />
<path d="M8.49984 23C8.2237 23 8 23.2239 8 23.5C8 24.2229 8.56274 24.6057 8.84654 24.7476C9.19291 24.9207 9.60207 25 10 25H14C14.3979 25 14.8071 24.9207 15.1535 24.7476C15.4373 24.6057 16 24.2229 16 23.5C16 23.2239 15.7763 23 15.5002 23H8.49984Z" fill="currentColor" />
</svg>
</span>
		</div>
				<div class="attention-block__content">
			<div class="attention-block__message">

<p class="wp-block-paragraph">Alternative for Terminal Pros: If you already have a standard Local site running and prefer using the command line, you can right-click your site in Local, select Open Site Shell, and instantly upgrade to a specific Beta release using WP-CLI by running: <code>wp core update --version=YOUR_TARGET_VERSION</code></p>

</div>
		</div>
	</div>
</section>



<h2 id="toc-professional-workflows-deployments-syncing" class="wp-block-heading" data-analytics-track-visibility="yes">Professional workflows (deployments &amp; syncing)</h2>



<p class="wp-block-paragraph" id="toc-5-professional-workflows-deployments-syncing" data-analytics-track-visibility="yes">Developing sites locally is the industry standard for professional WordPress creators. But once your code is perfected on your machine, how do you take it live?</p>



<p class="wp-block-paragraph" id="toc-5-professional-workflows-deployments-syncing" data-analytics-track-visibility="yes">There is no single “correct” way to launch a site, but your workflow strategy will usually fall into a distinct tier of sophistication. Think of it as a deployment spectrum ranging from manual control to platform automation.</p>



<h3 id="toc-the-core-blueprint-files-vs-database" class="wp-block-heading" data-analytics-track-visibility="yes">The core blueprint: files vs. database</h3>



<p class="wp-block-paragraph" id="toc-the-core-blueprint-files-vs-database" data-analytics-track-visibility="yes">Every WordPress site migration involves moving exactly two components from your origin machine (local) to the remote live server (production):</p>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li>The Files: Specifically your local <code>/wp-content/</code> folder, which holds your custom themes, plugins, and media uploads.</li>



<li>The Database: The brain of your site that records your posts, pages, and system configurations.</li>
</ol>



<h3 id="toc-three-ways-to-go-live" class="wp-block-heading" data-analytics-track-visibility="yes">Three ways to go live</h3>



<h4 id="toc-the-classic-manual-hand-off-sftp-adminer" class="wp-block-heading" data-analytics-track-visibility="yes">The classic manual hand-Off (SFTP &amp; Adminer)</h4>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If you are working with a traditional web host, you will likely be handling things by hand. This involves using an SFTP client (like FileZilla) to copy your local <code>/wp-content/</code> folder over to the live server, exporting a compressed <code>.gzip</code> snapshot of your database from Local’s built-in Adminer tool, and manually importing it into the live database manager (like <code>phpMyAdmin</code>).</p>



<h4 id="toc-the-universal-plugin-option-all-in-one-wp-migration" class="wp-block-heading" data-analytics-track-visibility="yes">The universal plugin option (all-in-one WP migration)</h4>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">For a more automated handoff that works on any hosting provider, you can use a migration plugin. Install a tool like All-in-One WP Migration on both sides to input simple translation rules, package your database and code into a single portable file, and drag-and-drop it directly into your live server dashboard without touching raw database tables.</p>



<h4 id="toc-zero-click-automation-local-connect-magicsync" class="wp-block-heading" data-analytics-track-visibility="yes">Zero-click automation (Local Connect &amp; MagicSync)</h4>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If your live environments host on WP Engine or Flywheel, you can skip the manual pipelines entirely. By linking your hosting API credentials straight to the Local desktop app, deployment becomes a seamless, one-click affair.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong>MagicSync</strong> unlocks a visual, two-pane window that compares your offline code with the live server, allowing you to deploy individual file changes with laser-targeted accuracy up to five times faster.</p>



<h3 id="toc-closing-the-loop-syncing-live-data-back-to-your" class="wp-block-heading" data-analytics-track-visibility="yes">Closing the loop: syncing live data back to your computer</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A true developer workflow isn’t a one-way street. While you are busy writing new features offline, your clients and content creators are constantly posting live blogs and updating system settings on the live site.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To keep your machine from falling behind, Local Connect lets you pull that live site environment right back down to your computer. This gives you a perfect, up-to-date offline twin of the live site to test against before your next big deployment.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong>Ready to take your site live?</strong> For a granular look at setting up database table prefixes, handling complex serialized data strings, or optimizing your plugin exports, check out the complete, step-by-step masterclass:<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/local-wordpress-development-migrations-and-deployment/" target="_blank" rel="noreferrer noopener"> Options for Deploying Your WordPress Site from Local</a>.</p>



<h2 id="toc-advanced-workflows-git-version-control-ci-cd-pipelines" class="wp-block-heading" data-analytics-track-visibility="yes">Advanced workflows (Git version control &amp; CI/CD pipelines)</h2>



<p class="wp-block-paragraph" id="toc-6-advanced-workflows-git-version-control-ci-cd-pipelines" data-analytics-track-visibility="yes">For teams, agency developers, or solo creators demanding strict code backups and automated deployments, clicking buttons in an app interface isn’t enough. You want your codebase to track its own history and deploy itself safely every single time you push code.</p>



<p class="wp-block-paragraph" id="toc-6-advanced-workflows-git-version-control-ci-cd-pipelines" data-analytics-track-visibility="yes">By standardizing a terminal-based version control pipeline, you can isolate development branches, collaborate seamlessly, and eliminate human error from your deployment process entirely.</p>



<h3 id="toc-step-1-track-only-what-matters-gitignore" class="wp-block-heading" data-analytics-track-visibility="yes">Step 1: Track only what matters (<code>.gitignore</code>)</h3>



<p class="wp-block-paragraph" id="toc-step-1-track-only-what-matters-gitignore" data-analytics-track-visibility="yes">Local generates thousands of core WordPress files (wp-admin, wp-includes, etc.). You should never track core WordPress files or massive image upload directories in Git. It bloats your repository and slows down your deployment. Instead, you only want to track your custom themes and plugins.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Open your computer’s text editor, create a new file named .gitignore, and save it directly inside your local site’s /wp-content/ directory. This script forces Git to ignore the core system noise while keeping tabs on your specific active project files:</p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code># Ignore all themes and plugins by default
/themes/*
/plugins/*

# DO NOT ignore your specific development assets!
!/themes/my-custom-agency-theme
!/plugins/my-custom-plugin

# Ignore core system noise, backups, and media uploads
/uploads/
/upgrade/
.DS_Store
Thumbs.db</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong>Initialize the repository</strong>: Inside the Local app dashboard, click the Open Site Shell button directly beneath your site title. This opens a terminal window automatically rooted to your site’s directory. Run the following commands to initialize Git:</p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>cd wp-content
git init
git add -A
git commit -m "Initial commit of custom assets"</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong>Publish to GitHub</strong>: Create a new repository on your GitHub account, link your local machine to it using the terminal prompt provided by GitHub, and push your code live.</p>



<h3 id="toc-step-2-automated-pushes-via-github-actions" class="wp-block-heading" data-analytics-track-visibility="yes">Step 2: Automated pushes via GitHub actions</h3>



<p class="wp-block-paragraph" id="toc-with-your-code-safely-living-on-github-you-can" data-analytics-track-visibility="yes">With your code safely living on GitHub, you can build a CI/CD pipeline. This means whenever you push code to a specific branch on GitHub, a virtual server automatically spins up, double-checks your code, and safely overwrites the files on your live server.</p>



<h4 id="toc-how-a-standard-pipeline-is-structured" class="wp-block-heading" data-analytics-track-visibility="yes">How a standard pipeline is structured:</h4>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>Pushing to the stage branch triggers GitHub to instantly deploy changes to your staging server for client review.</li>



<li>Merging into the main branch triggers an automated production deployment.</li>
</ul>



<p class="wp-block-paragraph" id="toc-to-configure-this-automation-you-create-a-workflow-file" data-analytics-track-visibility="yes">To configure this automation, you create a workflow file inside your repository at .github/workflows/deploy.yml. A typical automated deployment script looks like this:</p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>name: Automated Site Deployment
on:
  push:
    branches:
     - stage
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Deploy Script Execution
      uses: wpengine/github-action-wpe-site-deploy@v3
      with:
        REMOTE_PATH: "wp-content/"
        WPE_SSHG_KEY_PRIVATE: ${{ secrets.WPE_SSHG_KEY_PRIVATE }}
        WPE_ENV: your-staging-environment-name
        PHP_LINT: TRUE
        CACHE_CLEAR: TRUE
</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<p class="wp-block-paragraph" id="toc-the-safety-switches-behind-the-scenes" data-analytics-track-visibility="yes"><strong>The safety switches behind the scenes:</strong></p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><code>PHP_LINT: TRUE</code> automatically runs a code syntax check on your files <em>before</em> deploying. If a developer accidentally left a broken bracket or syntax error in a file, the deployment instantly halts, protecting your live site from the dreaded “White Screen of Death.”</li>



<li><code>CACHE_CLEAR: TRUE</code> ensures that the second your new files land on the hosting server, the server cache is instantly busted so your clients see the visual updates immediately.</li>
</ul>



<h3 id="toc-securing-the-pipeline-with-ssh-keys" class="wp-block-heading" data-analytics-track-visibility="yes">Securing the pipeline with SSH keys</h3>



<p class="wp-block-paragraph" id="toc-to-make-this-deploy-securely-without-saving-passwords-in" data-analytics-track-visibility="yes">To make this deploy securely without saving passwords in public view, you bridge the connection using an SSH key pair:</p>



<ol class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Generate the Keys:</strong> Run ssh-keygen -t ed25519 in your terminal to create a passwordless security handshake.</li>



<li><strong>The Public Key:</strong> You paste this string into your web hosting account under SSH Keys so the server trusts incoming code.</li>



<li><strong>The Private Key: </strong>You save this string inside your GitHub Repository as an encrypted variable by navigating to <em>Settings ➔ Secrets ➔ Actions</em>. GitHub uses this background secret to securely sign off on deployments every time you run a git push command.</li>
</ol>



<h2 id="toc-conclusion" class="wp-block-heading" data-analytics-track-visibility="yes">Conclusion</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Mastering local development is about adopting a professional mindset that prioritizes safety and efficiency. Syncing offline work with production servers removes friction, allowing you to focus entirely on building better sites. With this guide, you can now move from basic local site creation to complex workflows, leveraging features like Live Links, Blueprints, and automated deployments to streamline your daily tasks.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Your professional development doesn’t end with this guide. Keep experimenting, refining your processes, and pushing boundaries. Your local machine is now your most powerful asset, and it’s time to start creating!</p>


<ol class="wp-block-footnotes" data-analytics-track-visibility="yes"><li id="c6f81e5c-531f-44eb-aca1-0fd1622c095e">WP Engine is a proud member and supporter of the community of WordPress® users. The WordPress® trademarks are the intellectual property of the WordPress Foundation, and the Woo® and WooCommerce® trademarks are the intellectual property of WooCommerce, Inc. Uses of the WordPress®, Woo®, and WooCommerce® names in this website are for identification purposes only and do not imply an endorsement by WordPress Foundation or WooCommerce, Inc. WP Engine is not endorsed or owned by, or affiliated with, the WordPress Foundation or WooCommerce, Inc. <a href="#c6f81e5c-531f-44eb-aca1-0fd1622c095e-link" aria-label="Jump to footnote reference 1"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></li></ol><p>The post <a href="https://wpengine.com/blog/local-development/">The Guide to Local Development for WordPress®</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengine.com/blog/local-development/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Future-Proofing Content: Plugging WordPress® Into the Agentic Web</title>
		<link>https://wpengine.com/blog/agentic-web/</link>
					<comments>https://wpengine.com/blog/agentic-web/#comments</comments>
		
		<dc:creator><![CDATA[Fran Agulto]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 21:30:17 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/?p=7836</guid>

					<description><![CDATA[<p>Adopting MCP future-proofs WordPress, ensuring content remains discoverable and actionable for AI agents, not just human browsers.</p>
<p>The post <a href="https://wpengine.com/blog/agentic-web/">Future-Proofing Content: Plugging WordPress® Into the Agentic Web</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes">For much of its history, WordPress<sup><a href="#legal-disclaimer">®[1]</a></sup> has been the definitive open-source CMS for publishers seeking an intuitive editing experience and developers requiring a battle-tested technical stack. Traditionally, its role was straightforward: store content, expose it via templates or APIs, and render pages for users to browse.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">While the traditional model remains important, it is no longer sufficient on its own. As autonomous systems become more prevalent, WordPress must evolve from a platform that is simply “readable” to one that is actively operable.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">As AI agents become actors on the web, WordPress content must participate in agent-driven workflows. This is where the Model Context Protocol (MCP) and managed environments such as the&nbsp;<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/ai-toolkit/" target="_blank" rel="noreferrer noopener">WP Engine AI Toolkit</a>&nbsp;become essential.</p>



<h2 id="toc-mcp-changes-what-wordpress-can-be" class="wp-block-heading" data-analytics-track-visibility="yes">MCP changes what WordPress can be</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/mcp-server/" target="_blank" rel="noreferrer noopener">MCP servers</a> turn WordPress from a content repository into an AI-native interface.&nbsp; Traditionally, WordPress exposes data through REST endpoints or GraphQL, which are interfaces designed for human developers. MCP introduces a new standard designed explicitly for AI agents.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Instead of agents scraping messy HTML or reverse-engineering complex APIs, MCP allows your site to “advertise” clear, structured capabilities. The WP Engine managed hosting platform provides the power that builders need to serve these requests at scale, so when an agent queries your site, your data is structured to help it provide accurate responses.</p>



<h2 id="toc-what-plugging-in-actually-means" class="wp-block-heading" data-analytics-track-visibility="yes">What “plugging in” actually means</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">“Plugging in” does not mean rebuilding WordPress. It means making your existing content queryable in a way that aligns with how&nbsp;<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.ibm.com/think/topics/large-language-models" target="_blank" rel="noreferrer noopener">Large Language Models (LLMs)</a>&nbsp;operate. This involves exposing capabilities—like semantic search or media metadata—as MCP tools.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">This is where the right infrastructure becomes a differentiator. For example, a major hurdle in building for the agentic web is “grounding.” Basically, this means taking steps to ensure the AI doesn’t hallucinate answers, and instead, surfaces correct answers based on your site content. By using&nbsp;<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/managed-vector-database/" target="_blank" rel="noreferrer noopener">WP Engine’s Managed Vector Database</a>, developers can automatically index posts and custom fields into vectors, which are mathematical representations of meaning. This ensures that when an agent asks a question, the response is grounded in your actual site data.</p>



<h2 id="toc-high-level-mcp-schema-reasoning" class="wp-block-heading" data-analytics-track-visibility="yes">High-level MCP schema &amp; reasoning</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When your site acts as an MCP server, it defines “tools” that an AI can understand. Rather than a human writing a specific prompt, the agent sees a machine-executable schema:</p>



<pre class="wp-block-preformatted" data-analytics-track-visibility="yes"><code>
// Example MCP Tool Definition powered by WP Engine Smart Search
{
  "name": "wp_smart_search",
  "description": "Performs a semantic similarity search across vectorized WordPress content.",
  "parameters": {
    "query": { "type": "string", "description": "The user's intent or search query" },
    "limit": { "type": "number", "default": 5 }
  }
}
</code><small>Code language: JSON / JSON with Comments (json)</small></pre>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">An agent like Claude or ChatGPT can see this tool and reason: “I need authoritative info on X—this site provides a&nbsp;<code>wp_smart_search</code>&nbsp;tool.”&nbsp; It calls the tool, receives structured JSON from the <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://developers.wpengine.com/docs/wp-engine-ai-toolkit/vector-db/similarity-api/" target="_blank" rel="noreferrer noopener">WP Engine Similarity API</a>, and incorporates that “ground truth” directly into its workflow.</p>



<h2 id="toc-solving-the-unstructured-data-problem" class="wp-block-heading" data-analytics-track-visibility="yes">Solving the unstructured data problem</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">One of the biggest obstacles for AI agents is understanding non-textual content, such as images, videos, and PDFs. If an agent can’t “see” your media library, it can’t use it.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Modern AI infrastructure now handles this automatically. Within the&nbsp;<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/ai-toolkit/" target="_blank" rel="noreferrer noopener">WP Engine AI Toolkit</a>, the&nbsp;<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/ai-toolkit/#Generate_Metadata_for_Media_in_Bulk" target="_blank" rel="noreferrer noopener">AI-Generated Metadata</a>&nbsp;feature can bulk-generate Alt Text and descriptions for your entire media library. This transforms a blind spots across previously unreadable images into a searchable database that an AI agent can describe to a user, effectively making your entire media library agent-operable.</p>



<h2 id="toc-why-this-matters-across-your-teams" class="wp-block-heading" data-analytics-track-visibility="yes">Why this matters across your teams</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Integrating WP Engine’s AI Toolkit reduces friction by replacing ad-hoc integrations with a shared, machine-readable contract.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong>Traditional Developers</strong>: You can make your sites relevant to the AI era without learning Python or Vector mathematics. Tools like&nbsp;<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/smart-search/" target="_blank" rel="noreferrer noopener">WP Engine Smart Search</a>&nbsp;provide a three-click setup to vectorize content and handle the heavy lifting of AI-ready infrastructure.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong>Headless Developers:&nbsp;</strong>You can treat WordPress as a high-performance, agent-friendly backend. By connecting the&nbsp;WP Engine Similarity API&nbsp;to frameworks like&nbsp;<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://openai.com/index/introducing-agentkit/" target="_blank" rel="noreferrer noopener">OpenAI’s AgentKit</a>, you can build autonomous agents that use your WordPress site as their primary knowledge base.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong>Decision Makers:</strong>&nbsp;By adopting an agent-operable architecture now, you future-proof your content, ensuring your data remains discoverable by both traditional browsers and AI assistants.</p>



<h2 id="toc-from-passive-to-active" class="wp-block-heading" data-analytics-track-visibility="yes">From passive to active</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">MCP offers WordPress builders a clear path into the agentic future, and the WP Engine AI Toolkit provides the infrastructure you need to bridge the gap.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Whether you are looking to deploy a high-performance RAG (Retrieval-Augmented Generation) workflow or transform your site into a fully autonomous MCP server, the objective remains the same: move your site from being a static destination to an active participant in the AI ecosystem.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Ready to get started? Contact us today to explore our vectorization tools, try our MCP server capabilities, and discover how our AI Toolkit can future-proof your digital strategy.</p>


<div class="wpe-button wpe-button--primary wpe-button--color-blue wp-block-wpe-button" data-analytics-track-visibility="yes" data-analytics-content-id="7836" data-analytics-content-type="post" data-analytics-content-name="Future-Proofing Content: Plugging WordPress® Into the Agentic Web" data-analytics-content-tags="[&quot;ai&quot;,&quot;blog&quot;,&quot;developer&quot;,&quot;industry-innovation&quot;,&quot;managed-vector-database&quot;,&quot;smart-search-ai&quot;]" data-analytics-content-personas="[]">
	<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/mcp-server/" target="_blank" rel="noopener noreferrer" class="wpe-button__wrapper wpe-button--show-icon-on-hover">
		<span class="wpe-button__text">Check Out Our Smart Search MCP Server</span>
		<span class="wpe-button__icon" aria-hidden="true"><svg width="13" height="10" viewBox="0 0 13 10" fill="none" aria-hidden="true" focusable="false"><path d="M7.2644 0.902344L10.4382 4.07715L10.4597 4.09863H0.0124512V5.32422H10.4597L7.2644 8.51953L8.12573 9.4043L12.8191 4.71094L8.12573 0.0175781L7.2644 0.902344Z" fill="currentColor" stroke="currentColor" stroke-width="0.025" /></svg></span>
	</a>
</div><p>The post <a href="https://wpengine.com/blog/agentic-web/">Future-Proofing Content: Plugging WordPress® Into the Agentic Web</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengine.com/blog/agentic-web/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Using the Multimodal Feature with Smart Search AI MCP</title>
		<link>https://wpengine.com/blog/smart-search-ai-mcp-multimodal/</link>
		
		<dc:creator><![CDATA[Fran Agulto]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 23:28:45 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/?p=7765</guid>

					<description><![CDATA[<p>Learn how Smart Search AI MCP can surface PDF passages and visual assets together in a headless WordPress chatbot.</p>
<p>The post <a href="https://wpengine.com/blog/smart-search-ai-mcp-multimodal/">Using the Multimodal Feature with Smart Search AI MCP</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In our previous deep-dives into RAG (Retrieval-Augmented Generation), we solved the problem of fragmented data by connecting WordPress, Cloudinary, and Smart Search via MCP.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Now, let’s discuss the issue of modality.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Most RAG systems are great at reading text – but what about understanding context? If a user asks a question that is best answered by a diagram in a PDF or a specific product shot, a standard text-based index often fails to return the visual asset. You end up with a chatbot that can tell you about a document but can’t actually show it to you.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The Multimodal feature in Smart Search AI helps solve this. It allows you to index PDFs and images into a single semantic space. By the end of this guide, we will have refactored our chatbot to interleave PDF passages and visual assets in a single response turn.</p>



<h2 class="wp-block-heading" id="toc-the-multimodal-semantic-bridge" data-analytics-track-visibility="yes">The Multimodal Semantic Bridge</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The core concept here is the Unified Index. Instead of having one vector space for “descriptions” and another for “text,” Smart Search uses AI to “describe” images at the moment of ingestion.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">When you index an image, Smart Search runs it through a vision model to generate a searchable body, caption, and alt-text. This creates a semantic bridge: a user query for “safety diagrams,” for example, can now hit a PDF manual and a JPEG infographic simultaneously because they share the same conceptual space.</p>



<h2 class="wp-block-heading" id="toc-prerequisites" data-analytics-track-visibility="yes">Prerequisites</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If you followed the <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/builders/mcp-wordpress-cloudinary-smart-search/">previous tutorial</a>, your setup focused on syncing WordPress posts and Cloudinary Image data from its MCP.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">This update moves the logic into a mixed-media index. To get the most out of this guide, you should be familiar with the core Smart Search RAG setup we built previously. We will be starting from that point. If you are not familiar, please reference it <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://github.com/Fran-A-Dev/ssai-wp-mcp/tree/multi-modal">here</a>.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">What’s New: From Text-Only to Multimodal</p>



<figure class="wp-block-table has-medium-font-size" data-analytics-track-visibility="yes"><table class="has-fixed-layout"><tbody><tr><td><strong>Feature</strong></td><td><strong>Previous RAG Setup</strong></td><td><strong>Multimodal Setup</strong></td></tr><tr><td><strong>Asset Support</strong></td><td>WordPress Posts / Text</td><td>PDFs + Images (PNG, JPG)</td></tr><tr><td><strong>Processing</strong></td><td>Text Extraction</td><td>Vision Analysis + PDF Text Extraction</td></tr><tr><td><strong>Search Result</strong></td><td>Text Snippets</td><td>Mixed Array (Text + Image URLs)</td></tr><tr><td><strong>Index Strategy</strong></td><td>Separate stores per modality</td><td>Single multimodal index</td></tr></tbody></table></figure>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong><em>Beta note: Smart Search’s multimodal extraction is currently in beta. It works best with short PDFs (roughly under 20 pages) and standard image formats. Large books or technical manuals may fail extraction today.</em></strong></p>



<h3 class="wp-block-heading" id="toc-setting-up-the-environment" data-analytics-track-visibility="yes">Setting Up the Environment</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Update your <code>.env.local</code> to include the specific GraphQL credentials for the ingestion script. Note that <code>SMART_SEARCH_ACCESS_TOKEN</code> is your ingestion secret, while <code>AI_TOOLKIT_MCP_TOKEN</code> is used by the chatbot to query the tools.</p>



<h3 class="wp-block-heading" id="toc-ingestion-credentials-graphql" data-analytics-track-visibility="yes">Ingestion Credentials (GraphQL)</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><code>SMART_SEARCH_GRAPHQL_URL=https://api.wpengine.com/v1/smart-search/your-index/graphql</code></p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><code>SMART_SEARCH_ACCESS_TOKEN=your_ingestion_token</code></p>



<h3 class="wp-block-heading" id="toc-mcp-credentials-chatbot" data-analytics-track-visibility="yes">MCP Credentials (Chatbot)</h3>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>AI_TOOLKIT_MCP_URL=https://your-mcp-endpoint.a.run.app/mcp
AI_TOOLKIT_MCP_TOKEN=your_mcp_token

# Models
GOOGLE_GENERATIVE_AI_API_KEY=your_gemini_key</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<h4 class="wp-block-heading" id="toc-1-the-ingestion-pipeline" data-analytics-track-visibility="yes"><br>1. The Ingestion Pipeline&nbsp;</h4>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Instead of manual uploads, we use a manifest-driven script. It calls Smart Search’s <code>pdf.extract</code> and <code>image.analyze</code> GraphQL queries – the first pulls text and page metadata from PDFs, the second runs a vision model to generate a description, caption, and alt-text for each image.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><br></p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If you are following along, the file lives at <code><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://github.com/Fran-A-Dev/ssai-wp-mcp/blob/multi-modal/scripts/ingest/ingest.ts">scripts/ingest/ingest.ts</a></code></p>



<h3 class="wp-block-heading" id="toc-normalizing-the-data" data-analytics-track-visibility="yes">Normalizing the Data</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">What makes the search multimodal isn’t any single field — it’s that both asset types are indexed into the same Smart Search index under a shared schema, distinguished only by an <code>asset_type </code>discriminator. We also normalize the primary searchable text into a shared body field (PDF content for documents, vision-generated description for images), so a single query naturally retrieves either modality.<br></p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>  // Simplified from ingest.ts
  if (asset.type === "pdf") {
    const result = await extractPdf(asset.url);
    return {
      id: asset.id,
      data: { asset_type: "pdf", body: result.content, ... }
    };
  } else {
    const result = await analyzeImage(asset.url);
    return {
      id: asset.id,
      data: { asset_type: "image", body: result.description, ... }
    };
  }
</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><br></p>



<h2 class="wp-block-heading" id="toc-verifying-via-terminal" data-analytics-track-visibility="yes">Verifying via Terminal</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Run the script and watch the extraction logs. This is your first confirmation that the vision models are correctly seeing your assets:</p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>wpengine-stoke smart-search-rag-chatbot % npm run ingest

  next-chatbot@0.1.0 ingest
  tsx --env-file=.env.local scripts/ingest/ingest.ts

  Loaded manifest: 5 assets

  Step 1/2: Extracting content
    → extracting PDF: Eternal Spring — Press Kit
      extracted 15 page(s), 19147 chars (12.1s)
    → analyzing image: Eternal Spring — Lead Still
      description: An overhead shot captures a person, seen from the back, engrossed in drawing at ... (5.2s)
    → analyzing image: Eternal Spring — Still #7
      description: The image is an animated still depicting a person with East Asian features, wear... (5.1s)
    → analyzing image: Eternal Spring — Awards Poster
      description: An illustration depicts a child holding a vintage twin-lens reflex camera in a s... (4.5s)
    → analyzing image: Eternal Spring — Poster
      description: The image is an illustration depicting a chaotic street scene in a dense urban e... (7.8s)

  Step 2/2: Indexing 5 document(s) via bulkIndex
    bulkIndex: code=200 success=true (0.4s)
      indexed → presskit:eternal-spring
      indexed → image:eternal-spring-lead-still
      indexed → image:eternal-spring-still-7
      indexed → image:eternal-spring-awards-poster
      indexed → image:eternal-spring-poster

  Done. 5/5 assets indexed.</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<h2 class="wp-block-heading" id="toc-orchestrating-the-search" data-analytics-track-visibility="yes">Orchestrating the Search</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">With our index populated, we update the Next.js route handler. The AI needs to know it’s no longer just a “reader” — it’s a “viewer.”</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In the project, the file is at <code><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://github.com/Fran-A-Dev/ssai-wp-mcp/blob/multi-modal/src/app/api/chat/route.ts">src/api/chat/route.ts</a></code></p>



<h2 class="wp-block-heading" id="toc-training-the-llm" data-analytics-track-visibility="yes">Training the LLM</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The Smart Search index contains BOTH text documents (PDFs) AND image documents (with AI-generated descriptions). Each document has fields like title, <code>asset_type </code>(“pdf” or “image”), <code>source_url</code>, body, and (for images) caption and <code>alt_text</code>.</p>


<div class="wp-block-code-wrapper wp-block-acf-code" data-analytics-track-visibility="yes">
	<pre class="wp-block-code"><code>For any content question:
1. Call 'search' with the user's query. Use limit: 5 for normal text questions, but limit: 10 (or higher) when the query mentions a visual asset (poster, image, photo, picture, still, screenshot, diagram, infographic, illustration). Text-heavy results will otherwise crowd image results out of the top-K.
2. If the top result(s) look relevant, IMMEDIATELY call 'fetch' on them to get full content. Do not ask the user for permission to fetch — just fetch and answer in a single turn.
3. Synthesize the answer from the fetched content.
4. When you reference an image in your answer:
   - Use the EXACT source_url from THAT image document (asset_type === "image"). NEVER reuse a source_url from a PDF or any other document.
   - The URL inside ![](url) MUST end in an image extension (.jpg, .jpeg, .png, .gif, .webp, .svg). If the only URL you have is a PDF or other non-image file, render it as a regular markdown link [title](url), NEVER as ![](url).
   - If a relevant image result is missing source_url in the search response, call 'fetch' on that image's id to retrieve it before answering.
5. For mixed queries ("tell me about X and show me what it looks like"), do TWO SEPARATE searches:
   - First search: the topic itself (e.g., "Eternal Spring lead subject") to find explanatory PDF/text content.
   - Second search: the specific visual asset the user asked for (e.g., "Eternal Spring poster" or "Eternal Spring still image"), with limit: 10 so the image actually surfaces.
   Then fetch and combine BOTH the PDF and image docs in one answer. A single combined search will usually fail to return image results because the body text of images describes their visual content (e.g., "a street scene at night"), not their asset role (e.g., "poster"), so generic queries miss them.</code></pre>
	<div class="wp-block-code-controls">
		<button class="wp-block-code-button" aria-label="Copy code to clipboard" type="button">
			<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
				<path d="M5 2C3.34315 2 2 3.34315 2 5V16C2 16.5523 2.44772 17 3 17C3.55228 17 4 16.5523 4 16V5C4 4.44772 4.44772 4 5 4H16C16.5523 4 17 3.55228 17 3C17 2.44772 16.5523 2 16 2H5Z" fill="currentColor" />
				<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C7.34315 6 6 7.34315 6 9V19C6 20.6569 7.34315 22 9 22H19C20.6569 22 22 20.6569 22 19V9C22 7.34315 20.6569 6 19 6H9ZM8 9C8 8.44772 8.44772 8 9 8H19C19.5523 8 20 8.44772 20 9V19C20 19.5523 19.5523 20 19 20H9C8.44772 20 8 19.5523 8 19V9Z" fill="currentColor" />
			</svg>
		</button>
		<span class="toast" role="status" aria-live="assertive"></span>
	</div>
</div>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Setting <code>maxSteps</code>: 5 in <code>streamText</code> gives Gemini room to chain tool calls in a single turn. For mixed queries, that’s two search calls (topic + visual) plus a fetch on the relevant PDF — all before streaming the final answer.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Splitting topic and visual into separate searches matters because vision-generated image bodies describe what’s in an image, not what role it plays, so a single query like “show me the poster” gets crowded out by text-heavy results that explicitly mention the word “poster.”</p>



<h2 class="wp-block-heading" id="toc-testing-the-multi-modal-loop" data-analytics-track-visibility="yes">Testing the Multi-Modal Loop</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Once your dev server is running (npm run dev), try a query that forces the LLM to synthesize both text and visual data.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The Prompt: “Who is the lead subject of the Eternal Spring film, and can you show me the official poster?”</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong>Expected Tool Flow</strong>:</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">1. search<code>({ query: "Eternal Spring lead subject poster" })</code> — returns both presskit:eternal-spring (PDF) and image:eternal-spring-poster (Image), each with metadata including source_url.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">2. fetch<code>({ id: "presskit:eternal-spring" })</code> — pulls the full PDF body so the model can answer the “who is the lead subject” half of the question. (The image result already includes its source_url from the search response, so no second fetch is required to render it.)</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">3. Final Output: the LLM writes a text bio of the subject synthesized from the press kit, then renders the poster inline as <code>![Eternal Spring Poster](source_url)</code>.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">This is what it should look like:</p>



<figure class="wp-block-image size-full" data-analytics-track-visibility="yes"><img fetchpriority="high" decoding="async" width="1920" height="1080" src="https://wpengine.com/wp-content/uploads/2026/06/MultiModalGIF.gif" alt="" class="wp-image-7770"></figure>



<h2 class="wp-block-heading" id="toc-conclusion" data-analytics-track-visibility="yes">Conclusion</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">By moving away from siloed search and embracing the Multimodal feature, we’ve created a chatbot that understands context regardless of format. Whether your data is locked in a 15-page press kit or a series of infographics, Smart Search AI and MCP provide the unified layer needed to bring those assets to life.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">As always, we’re stoked to see how you extend this. Try adding more asset types to your <code>manifest.json</code> and see how the vision model handles different technical complexities – just keep the beta’s short-PDF limit in mind as you scale.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"></p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"></p><p>The post <a href="https://wpengine.com/blog/smart-search-ai-mcp-multimodal/">Using the Multimodal Feature with Smart Search AI MCP</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Meet the Experts: Brandi Baggerman</title>
		<link>https://wpengine.com/blog/meet-the-experts-brandi-baggerman/</link>
		
		<dc:creator><![CDATA[Riley Cullen]]></dc:creator>
		<pubDate>Wed, 03 Jun 2026 13:36:01 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/?p=7720</guid>

					<description><![CDATA[<p>WP Engine is powered by individuals who bring unique perspectives and dedication to their teams every day, and each team member plays a vital role.&#160; Our Meet the Experts series puts the spotlight on some of the people who keep the engine running behind the scenes. In this edition, we’re excited to introduce Campaign Manager [&#8230;]</p>
<p>The post <a href="https://wpengine.com/blog/meet-the-experts-brandi-baggerman/">Meet the Experts: Brandi Baggerman</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes">WP Engine is powered by individuals who bring unique perspectives and dedication to their teams every day, and each team member plays a vital role.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Our Meet the Experts series puts the spotlight on some of the people who keep the engine running behind the scenes. In this edition, we’re excited to introduce Campaign Manager <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.linkedin.com/in/bbaggerman/">Brandi Baggerman</a>, who reflects on her nine-year journey, moving across the country, and the power of a supportive team.</p>



<figure class="wp-block-image aligncenter size-large" data-analytics-track-visibility="yes"><img decoding="async" width="1024" height="768" src="https://wpengine.com/wp-content/uploads/2026/06/brandi-mte-1024x768.png" alt="Two pictures of Brandi Baggerman. In the photo on th left, she's smiling and looking through a pair of binoculars wearing a WP Engine zip-up sweatshirt. In the photo on the right, she's smiling and wearing sunglasses while attending a baseball game." class="wp-image-7722" srcset="https://wpengine.com/wp-content/uploads/2026/06/brandi-mte-1024x768.png 1024w, https://wpengine.com/wp-content/uploads/2026/06/brandi-mte-300x225.png 300w, https://wpengine.com/wp-content/uploads/2026/06/brandi-mte-768x576.png 768w, https://wpengine.com/wp-content/uploads/2026/06/brandi-mte-1536x1152.png 1536w, https://wpengine.com/wp-content/uploads/2026/06/brandi-mte.png 2000w" sizes="(max-width: 1024px) 100vw, 1024px"></figure>



<h2 id="toc-say-hello-to-brandi" class="wp-block-heading" data-analytics-track-visibility="yes">Say hello to Brandi!</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Brandi is a Campaign Manager on our Marketing Campaign Operations team. After spending five years on WP Engine’s Support team, she transitioned into marketing, where she helps teams execute impactful email campaigns.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">“My career at WP Engine has evolved from supporting customer experience issues to influencing the processes that shape them,” Brandi says. “I bring a fresh perspective, applying my experience from the Support side to anticipate potential customer challenges and improve our communications.”</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Outside of work, Brandi is a proud mom and an adventurer who loves embracing new experiences. In fact, she and her family decided to move across the country from Texas to Ohio, where they bought their dream home.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">“Texas was wonderful, but the heat was oppressive,” Brandi jokes. “Now we get to enjoy every season, explore new communities, and spend weekends discovering our city. The parks offer free classes to learn about our wildlife and natural resources, and we’ve done some hikes with my son’s Cub Scout pack. We recently learned about maple sugaring and how local syrup is made.”</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Living less than a mile from Lake Erie, Brandi recharges by hitting the beach and attending local festivals with her family. She is also an avid road-tripper, a passionate plant parent, and a newfound fan of the Cleveland Guardians.</p>



<h2 id="toc-brandis-career-journey" class="wp-block-heading" data-analytics-track-visibility="yes">Brandi’s career journey</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Brandi’s career path started when she took a receptionist job at a tech company in San Antonio before she found her way to WP Engine nine years ago.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Though she describes herself as naturally shy and introverted, Brandi hasn’t let that stop her from stepping out of her comfort zone. Her transition from Support to Marketing was sparked by a manager who challenged her to apply for an opening, even though the competition was stiff.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">“I wanted to find a way to apply my more creative side, so I thought this would be my opportunity to put myself out there, step out of my comfort zone, and showcase my abilities,” she recalls. “When I interviewed for the role, I approached it with as much gusto and enthusiasm as I could, and I ended up getting an offer.”</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Since making the leap, Brandi has built her confidence and achieved major milestones, using her skills to revamp reports and manage sensitive email messaging. Her work directly impacts both internal teams that need to communicate a message and the customers who receive them, so success in her role is a unique balancing act.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">“There are times when a campaign needs a different perspective, or when the campaign owner draws on my experience to fine-tune the details,” she says. “I try to go above and beyond what’s outlined in the campaign notes to make sure we’re looking at the message from all angles.”&nbsp;</p>



<h2 id="toc-words-of-wisdom-lean-on-your-team" class="wp-block-heading" data-analytics-track-visibility="yes">Words of wisdom: Lean on your team</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If there is one recurring theme throughout Brandi’s time at WP Engine, it’s that success is never a solo endeavor. Collaboration and mutual support always lead to the best outcomes.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">“Having a team you can trust is essential for success,” Brandi says. “Moving to WP Engine taught me so much and humbled me in so many ways. I’ve been fortunate to work with a team and leadership that are genuinely supportive and invested in my success. While my contributions remain important, I always feel backed by people who won’t let me fail.”</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Brandi encourages others to be patient with their professional growth and to trust the people around them when stepping into unfamiliar territory.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">“Growth might not always feel obvious, and it doesn’t happen overnight,” she says. “When I question myself, I know I can confidently reach out to my teammates and leaders for guidance, which makes all the difference.”</p>



<h2 id="toc-powered-by-people" class="wp-block-heading" data-analytics-track-visibility="yes">Powered by people</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">For Brandi, WP Engine has provided a genuine community of inspiring people.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">“I have worked at companies that over-promise on the perks and their own hype. WP Engine delivers,” Brandi says. “I have trust in our leaders and experienced firsthand how hard they work to maintain our culture and our mission.”</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><strong><em>Interested in joining Brandi and the rest of the global team that’s powering confidence online? Visit our </em></strong><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://wpengine.careers/" target="_blank" rel="noreferrer noopener"><strong><em>careers site</em></strong></a><strong><em> to see the roles we currently have open, and check out </em></strong><a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/" target="_blank" rel="noreferrer noopener"><strong><em>our blog</em></strong></a><strong><em> for more information about all the great people who work here!</em></strong></p><p>The post <a href="https://wpengine.com/blog/meet-the-experts-brandi-baggerman/">Meet the Experts: Brandi Baggerman</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How LLMs Interpret Websites</title>
		<link>https://wpengine.com/blog/how-llms-interpret-websites/</link>
					<comments>https://wpengine.com/blog/how-llms-interpret-websites/#comments</comments>
		
		<dc:creator><![CDATA[Mike Davey]]></dc:creator>
		<pubDate>Thu, 21 May 2026 16:13:18 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/?p=7403</guid>

					<description><![CDATA[<p>The foundation of digital growth was a predictable cycle for decades. Search engines crawled a page, indexed the content, and ranked it based on keywords and authority. A human then clicked a link to find an answer. Recently, this “search and click” process has been disrupted. AI-powered Large Language Models (LLMs) like ChatGPT, Claude, and [&#8230;]</p>
<p>The post <a href="https://wpengine.com/blog/how-llms-interpret-websites/">How LLMs Interpret Websites</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The foundation of digital growth was a predictable cycle for decades. Search engines crawled a page, indexed the content, and ranked it based on keywords and authority. A human then clicked a link to find an answer. Recently, this “search and click” process has been disrupted.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">AI-powered Large Language Models (LLMs) like ChatGPT, Claude, and Gemini have introduced an “answer layer” to the internet. Instead of pointing to a source, these systems synthesize information from across the web to provide direct, conversational responses. Now, a brand’s visibility depends on more than just ranking in the top ten results. Your prominence often depends on how effectively these machines can interpret and summarize your content. Brands may effectively disappear from the AI-generated answers if their sites cannot be interpreted clearly by LLMs.</p>



<h2 class="wp-block-heading" id="toc-the-new-way-people-discover-websites-isnt-just-search" data-analytics-track-visibility="yes">The new way people discover websites isn’t just search anymore</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">AI-driven discovery changes the mechanics of digital visibility. In the traditional model, discovery followed a path of crawl, index, rank, and click. Success was measured by the ability to capture a user’s attention on a results page.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In contrast, LLM-based discovery follows a path of retrieve, synthesize, and cite. Whether a user is interacting with Google’s AI Overviews, an LLM like Perplexity, or a direct AI search interface, the AI acts as an intermediary that consumes website data to form a coherent response. The web itself is being re-indexed through the lens of machine comprehension.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Modern digital growth strategies must now account for a dual reality. Visibility for brands, small businesses, and individuals now requires both traditional ranking for human users and clear representation for machine interpretation. To succeed, you’ll need to refine your broader <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/wordpress-seo/">WordPress<sup>®</sup> SEO</a> strategy to account for both. Ignoring how LLMs interpret websites means losing the <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.marketingweek.com/tom-roach-share-of-model-ai-era/">share of model</a> that is becoming as vital as search engine market share.</p>



<h2 class="wp-block-heading" id="toc-how-llms-actually-interpret-websites" data-analytics-track-visibility="yes">How LLMs actually interpret websites</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To gain LLM visibility, you’ll need to understand the pipeline an AI model uses to process digital information. While humans read text linearly to find meaning, an LLM processes data through a sophisticated series of computational steps designed to turn prose into math.</p>



<h3 class="wp-block-heading" id="toc-crawling-and-access" data-analytics-track-visibility="yes">Crawling and access</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">LLMs do not always browse the web in real-time. Instead, they often rely on massive, pre-existing search indexes, specialized APIs, and large-scale licensed data sets. This means the information an AI provides about a brand might be based on data collected weeks or months ago.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Despite these differences from traditional search, the fundamentals of technical access remain unchanged. While robots.txt remains the primary technical standard for managing web access, its role as a gatekeeper has become more complex. Some AI crawlers and data aggregators have <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.tomshardware.com/tech-industry/artificial-intelligence/several-ai-companies-said-to-be-ignoring-robots-dot-txt-exclusion-scraping-content-without-permission-report">faced scrutiny for ignoring these directives</a>. However, maintaining clear permission signals and proper indexability is still a foundational requirement. If a site’s technical configuration is fragmented or overly restrictive toward reputable bots, the brand’s data may never reach the retrieval systems that power AI visibility.</p>



<h3 class="wp-block-heading" id="toc-retrieval-and-chunking" data-analytics-track-visibility="yes">Retrieval and chunking</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">AI systems process websites in two distinct ways. During the initial training phase, models ingest trillions of words to learn language patterns. While they use tokenization rather than chunking at this stage, clear site architecture helps the model’s attention mechanism correctly map the relationships between your brand’s concepts.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">For real-time search and discovery, systems use Retrieval-Augmented Generation (RAG). In this mode, the system doesn’t “read” at 2,000-word article from start to finish. Instead, it chunks the content into semantic segments, smaller pieces of text that contain a complete thought or piece of data.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">These segments are then converted into <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/vector-databases-101/">vector embeddings</a>, allowing the AI to rank content for relevance. If a website’s structure is fragmented or lacks logical flow, the model may fail to associate related chunks correctly.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Organizing content into logical, semantic modules ensures that whether the AI is learning from your site or retrieving it for a query, it can synthesize your information accurately.</p>



<h3 class="wp-block-heading" id="toc-semantic-understanding" data-analytics-track-visibility="yes">Semantic understanding</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">LLMs excel at identifying entities like people, products, and organizations, and then identifying the relationships between them. Through <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.datacamp.com/tutorial/what-is-topic-modeling">topic modeling</a>, an AI determines what a website is fundamentally about.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Clearly defined concepts and authoritative language consistently outperform vague marketing jargon in this environment. When a site uses specific, entity-rich language (e.g., explicitly naming solutions and their specific benefits), it provides a clearer signal for the model to map. This semantic clarity is what allows an LLM to confidently state that a specific brand is a leader in a particular niche.</p>



<h3 class="wp-block-heading" id="toc-synthesis-and-citation" data-analytics-track-visibility="yes">Synthesis and citation</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In the final stage, the model summarizes the retrieved information across multiple sources to provide a unified answer. This is where a brand’s authority is tested. LLMs prioritize clarity and consensus. A website that provides a definitive, well-structured answer increases the likelihood that the model will cite it as a primary source of truth.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Interpretability starts with a structured architecture. A clean, machine-readable structure is what transforms a collection of web pages into a definitive source that an LLM can confidently synthesize and cite.</p>



<h2 class="wp-block-heading" id="toc-what-makes-a-website-understandable-to-an-llm" data-analytics-track-visibility="yes">What makes a website understandable to an LLM?</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Making a website machine readable is an intentional design choice. It requires moving beyond aesthetic appeal to focus on how data is organized within the code.</p>



<h3 class="wp-block-heading" id="toc-clear-information-hierarchy" data-analytics-track-visibility="yes">Clear information hierarchy</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A logical heading structure is the roadmap for an AI. Using H1–H3 tags correctly helps LLMs understand the relationship between primary topics and supporting details. We recommend utilizing topic clustering to prevent the model from encountering duplicate or cannibalized information. The key to topic clustering is to group related content under a clear, overarching theme. A clean hierarchy ensures the chunking process preserves the intended context.</p>



<h3 class="wp-block-heading" id="toc-entity-rich-content" data-analytics-track-visibility="yes">Entity-rich content</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">LLMs understand the world through associations. To help an AI understand where a brand fits in the market, content should be explicit. This includes naming competitors and alternatives, providing clear use cases and case studies, and offering definitive comparisons. When a site defines itself clearly against other entities, it helps the AI place that brand within its internal map of the industry.</p>



<h3 class="wp-block-heading" id="toc-structured-data-and-schema" data-analytics-track-visibility="yes">Structured data and schema</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">While LLMs are getting better at reading prose, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/structured-data-for-ai-search/">structured data</a> remains the most direct way to communicate facts. In terms of content, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://digitalmarketinginstitute.com/blog/what-is-schema-markup">schema markup</a> helps to provide this structured data. FAQ schema, product schema, and organization schema provide a literal translation layer for the AI. It tells the machine exactly what a price is, how a product is rated, or what a company does, removing the need for the model to guess based on marketing copy.</p>



<h3 class="wp-block-heading" id="toc-technical-health" data-analytics-track-visibility="yes">Technical health</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A site that is difficult for a human to navigate is often impossible for an AI to interpret accurately. Technical health ensures a strong signal. At minimum, make sure you have a clean sitemap, correct hreflang tags for international markets, and no conflicting redirects. You can verify these signals with a <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/wordpress-website-performance-check/">performance check</a>. Furthermore, security and trust signals (like SSL certificates and consistent uptime) serve as proxies for authority in a machine-led environment.</p>



<h2 class="wp-block-heading" id="toc-seo-vs-llm-optimization-whats-different" data-analytics-track-visibility="yes">SEO vs. LLM optimization: What’s different?</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">While traditional SEO and Generative Engine Optimization (GEO) share certain goals, their tactics and success metrics differ.</p>



<figure class="wp-block-table" data-analytics-track-visibility="yes"><table class="has-fixed-layout"><tbody><tr><td><strong>Feature</strong></td><td><strong>Traditional SEO</strong></td><td><strong>LLM Optimization (GEO)</strong></td></tr><tr><td><strong>Primary Goal</strong></td><td>Ranking and click-throughs</td><td>Synthesis and brand mentions</td></tr><tr><td><strong>Focus</strong></td><td>Page-level authority</td><td>Brand-level consensus</td></tr><tr><td><strong>Optimization</strong></td><td>Keyword distribution/Backlinks</td><td>Semantic clarity/Entity relations</td></tr><tr><td><strong>Outcome</strong></td><td>User visits the site</td><td>User receives a brand-cited answer</td></tr></tbody></table></figure>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Don’t choose one strategy over the other. Winning brands integrate both. By focusing on <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/seo-best-practices/">SEO best practices</a> while simultaneously optimizing for AI interpretability, organizations ensure they remain visible regardless of how a user chooses to find them.&nbsp;</p>



<h2 class="wp-block-heading" id="toc-why-technical-infrastructure-matters-more-in-the-ai-era" data-analytics-track-visibility="yes">Why technical infrastructure matters more in the AI era</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">In the era of AI, the performance of a website’s underlying infrastructure is a direct driver of visibility. Render-blocking resources and heavy scripts do more than just slow down users. They can reduce overall crawl clarity, leading to incomplete interpretation by an AI’s retrieval system. This makes it even more important to ensure you are <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/ultimate-wordpress-performance-optimization-guide/">optimizing WordPress performance</a>.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Ambiguity is the enemy of AI visibility. Duplicate localized pages can dilute signals, and temporary redirects can create confusion about which source is the definitive version. Similarly, security issues reduce the trust signals that probabilistic engines use to determine which brands to cite. High performance and uptime provide a stable, structured environment for machine comprehension while simultaneously improving the human user experience. A few common<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/blog/tips-to-increase-wordpress-speed-and-performance/"> tips to increase speed and performance</a> can help ensure your content remains interpretable.</p>



<h2 class="wp-block-heading" id="toc-how-llms-decide-which-brands-to-mention" data-analytics-track-visibility="yes">How LLMs decide which brands to mention</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">LLMs attempt to synthesize the web’s collective consensus. To increase the likelihood of being mentioned in an AI’s answer, try focusing on the following areas:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Consistent topical authority:</strong> Regularly publish deep-dive content that establishes the brand as an expert in its specific field.</li>



<li><strong>Brand mentions across reputable domains:</strong> AI models look for third-party validation. Mentions on high-authority industry sites reinforce a brand’s importance.</li>



<li><strong>Comparison and “versus” content:</strong> Explicitly comparing solutions helps AI systems understand a brand’s unique value proposition.</li>



<li><strong>Direct answer formatting:</strong> Use FAQs and concise summaries to provide the “answer-ready” text that LLMs prefer to cite.</li>



<li><strong>Freshness and updates:</strong> Models favor current information. Regularly updating core pages ensures AI has access to the most accurate data.</li>
</ul>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Ultimately, LLMs base their opinions about a brand’s citability on the digital reputation it has built across the entire web.&nbsp;</p>



<h2 class="wp-block-heading" id="toc-ai-interpretation-is-ultimately-about-trust" data-analytics-track-visibility="yes">AI interpretation is ultimately about trust</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">LLMs essentially function as probabilistic trust engines. They aggregate trillions of linguistic relationships to determine what response is most statistically likely given the specific context of a user’s query.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">While a brand cannot directly control the output of an AI, it can influence that output through the quality and structure of the data it provides.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The transition from search to synthesis is an opportunity for those who prioritize clarity. Investing in a strong technical foundation and a clear information hierarchy today ensures that your brand remains a trusted source for the answers of tomorrow.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A well-managed foundation can simplify the transition. By leveraging<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/managed-wordpress-hosting/"> managed hosting for websites built on WordPress</a>, brands can ensure their site meets the rigorous technical standards required for the AI era. Visibility suffers when AI systems can’t interpret your site clearly. <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/contact/">Contact us</a> to see how WP Engine supports AI-ready sites on WordPress.</p>



<h2 class="wp-block-heading" id="toc-faqs-about-how-llms-interpret-websites" data-analytics-track-visibility="yes">FAQs about how LLMs interpret websites</h2>



<h3 class="wp-block-heading" id="toc-do-large-language-models-crawl-websites-like-google" data-analytics-track-visibility="yes">Do large language models crawl websites like Google?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Not exactly. While some AI models have live browsing capabilities, many rely on static datasets or existing search indexes from providers like Bing or Google. This means their “view” of a website is often filtered through other indexing services rather than a direct, real-time crawl of every page.</p>



<h3 class="wp-block-heading" id="toc-is-llm-optimization-different-from-traditional-seo" data-analytics-track-visibility="yes">Is LLM optimization different from traditional SEO?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Yes. While traditional SEO is about earning a click from a human, LLM optimization (or GEO) is about being accurately synthesized into an AI’s answer. This requires a heavier focus on semantic relationships, structured data, and “chunkable” content rather than traditional keyword-based strategies.</p>



<h3 class="wp-block-heading" id="toc-how-do-llms-decide-which-brands-to-mention" data-analytics-track-visibility="yes">How do LLMs decide which brands to mention?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">LLMs prioritize brands that demonstrate high topical authority and consistent mentions across reputable sources. They also look for consensus. If multiple authoritative sites agree that a brand is a leader in a specific category, the LLM is more likely to include that brand in its synthesis.</p>



<h3 class="wp-block-heading" id="toc-does-structured-data-help-llm-visibility" data-analytics-track-visibility="yes">Does structured data help LLM visibility?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Absolutely. Structured data and schema markup provide an unambiguous layer of meaning that LLMs can process more easily than plain prose. It acts as a direct signal of facts, helping the AI identify entities and relationships with higher confidence.</p>





<p class="wp-block-paragraph" data-analytics-track-visibility="yes">¹ WP Engine is a proud member and supporter of the community of WordPress® users. The WordPress® trademark is the intellectual property of the WordPress Foundation. Uses of the WordPress® trademarks in this website are for identification purposes only and do not imply an endorsement by WordPress Foundation. WP Engine is not endorsed or owned by, or affiliated with, the WordPress Foundation.</p><p>The post <a href="https://wpengine.com/blog/how-llms-interpret-websites/">How LLMs Interpret Websites</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengine.com/blog/how-llms-interpret-websites/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>What’s New in WordPress® 7.0? A Community Member’s Perspective</title>
		<link>https://wpengine.com/blog/wordpress-7-0-release/</link>
		
		<dc:creator><![CDATA[Brian Gardner]]></dc:creator>
		<pubDate>Wed, 20 May 2026 19:34:49 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/?p=7394</guid>

					<description><![CDATA[<p>Editor’s Note: WP Engine has enabled up to 250 post revisions per site by default across our platform for all sites using core version 7.0. Over the past few years, there have been significant improvements to WordPress core and database technology that now allow us to support revisions without performance degradation.&#160; This change is intended [&#8230;]</p>
<p>The post <a href="https://wpengine.com/blog/wordpress-7-0-release/">What’s New in WordPress® 7.0? A Community Member’s Perspective</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><em>Editor’s Note: WP Engine has enabled up to 250 post revisions per site by default across our platform for all sites using core version 7.0. Over the past few years, there have been significant improvements to WordPress core and database technology that now allow us to support revisions without performance degradation.&nbsp;</em></p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><em>This change is intended to ensure customers can reliably use the new 7.0 co-editing features. For more information, visit <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/platform-settings/#toc-post-revisions" target="_blank" rel="noreferrer noopener">https://wpengine.com/support/platform-settings/#toc-post-revisions</a>.</em> </p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">I’ve been designing and building on WordPress<sup><a href="#disclaimer">®[1]</a></sup> since 2006. In those two decades, I’ve watched it evolve from a simple blogging tool into the most powerful content management tool on the open web. Yet, for many of us, that journey has felt like a series of compromises.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Developing great experiences often became a tug-of-war between the creative vision and the software’s technical limitations, as we fought with custom CSS for mobile menus or installed a dozen third-party plugins just to add a breadcrumb trail. These friction points don’t just slow down the workflow; they add weight to our databases and complexity to our maintenance.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">On May 20, 2026, WordPress 7.0, aka <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://wordpress.org/news/2026/05/armstrong/" target="_blank" rel="noreferrer noopener">Armstrong</a>, officially moved WordPress CMS users past these limitations and into what I believe is a better, more future-ready state. The release has turned the core software into a more sophisticated, design-focused operating system and set the stage for the next phase of the web with a native AI framework built in.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Here is how WordPress 7.0 is improving collaborative workflows, modernizing core functionality, and preparing itself for the intelligent web.</p>



<h2 id="toc-standardizing-ai-integration-for-future-readiness" class="wp-block-heading" data-analytics-track-visibility="yes">Standardizing AI integration for future readiness</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Historically, every plugin with AI features required its own independent setup. If you used multiple AI-powered tools, you had to manage several different connections and API keys.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">WordPress 7.0 addresses this with a shared infrastructure layer through two new features (built on top of the Abilities API from 6.9): the Connectors API and the WP AI Client SDK. Together, they provide a standardized infrastructure for connecting WordPress websites to external AI providers like OpenAI, Google, and Anthropic.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/core/2026/03/18/introducing-the-connectors-api-in-wordpress-7-0/" target="_blank" rel="noreferrer noopener">Connectors API</a> is a new framework for managing external service connections. While it currently focuses on AI providers, its architecture is designed to support other external services in the future.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/ai/2025/11/21/introducing-the-wordpress-ai-client-sdk/" target="_blank" rel="noreferrer noopener">WP AI Client SDK</a> is a WordPress-native library (wordpress/wp-ai-client) that allows developers to interact with multiple AI providers through a single, consistent interface. It uses the WordPress HTTP API under the hood and integrates seamlessly with the Abilities API to expose WordPress-specific functions to AI models.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">These features are some of the first major steps toward AI integration, allowing developers to interact and connect with AI-powered features in a secure, consistent, and easy-to-configure way.&nbsp;</p>



<h2 id="toc-design-flexibility-with-safety-rails" class="wp-block-heading" data-analytics-track-visibility="yes">Design flexibility with safety rails</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">One of the most persistent frustrations for designers has been the lack of native control over the mobile hamburger menu. In 7.0, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/core/2026/03/04/customisable-navigation-overlays-in-wordpress-7-0/" target="_blank" rel="noreferrer noopener">navigation overlays</a> have finally become fully customizable template parts. Mike McAllister’s work with the <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://olliewp.com/" target="_blank" rel="noreferrer noopener">Ollie Menu Designer</a> was a clear inspiration for this feature. He proved that the block editor could handle complex menus if the core software provided the right framework.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Users can now design exactly what happens when a visitor clicks a mobile menu, incorporating social icons, a search bar, or a contact form. Native navigation overlays mark the end of fighting with theme CSS or installing heavy third-party menu plugins, and any images in the navigation overlay are automatically deprioritized to protect the page’s critical rendering path.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Outside the navigation menu, expanded Pattern Editing capabilities, specifically <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/test/2026/02/27/call-for-testing-pattern-editing-and-content-only-interactivity-in-wordpress-7-0/#:~:text=Resources-,What%20is%20content%2Donly%20mode%3F,-Content%2Donly%20mode" target="_blank" rel="noreferrer noopener">“content-only” mode</a>, allow users to better protect their design patterns. For example, if a designer builds a complex hero section as a pattern and another user goes in to edit images, copy, or links, the block structure and styling will be visible but uneditable by default. Your protected patterns now act as individual blocks in their own right, and users can click “edit pattern” for greater editing access to all available elements. Decoupling content elements from structural elements will help prevent accidental breakage of design elements during routine site updates.</p>



<h2 id="toc-core-performance-and-modernization" class="wp-block-heading" data-analytics-track-visibility="yes">Core performance and modernization</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Core updates in 7.0 focused on long-term stability and hardening the codebase. The release includes a refreshed admin experience, optimized core code, more efficient database handling, and expanded native block functionality to reduce reliance on plugins.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">As we mentioned above, improved accuracy in prioritizing image loading <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://core.trac.wordpress.org/ticket/64823" target="_blank" rel="noreferrer noopener">prevents hidden images in navigation overlays</a> or interactive blocks from degrading the loading of critical resources. In classic themes, on-demand block stylesheet loading is more reliable, and <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://core.trac.wordpress.org/ticket/61500" target="_blank" rel="noreferrer noopener">classic scripts can now list script modules as dependencies</a> to reduce render-blocking.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Version 7.0 also <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/core/2026/01/09/dropping-support-for-php-7-2-and-7-3/" target="_blank" rel="noreferrer noopener">raises the minimum PHP version requirement</a> to 7.4, allowing core to leverage newer features in the language.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Each of these enhancements (and more we haven’t discussed here!) improves the out-of-the-box performance of the WordPress core software.</p>



<h3 id="toc-improving-native-functionality-through-blocks" class="wp-block-heading" data-analytics-track-visibility="yes">Improving native functionality through blocks</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">For years, WordPress development relied on a lean core software package supplemented by lots of plugins to piecemeal essential functionality. WordPress 7.0 introduces <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://wordpress.org/news/2026/02/wordpress-7-0-beta-1/#:~:text=7.0%20delivers%20a%20series%20of%20new%20and%20improved%20blocks%20and%20block%20features" target="_blank" rel="noreferrer noopener">more blocks</a> and expands functionality for some existing blocks so they can handle tasks previously outsourced to third-party code, allowing core to do more.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The Grid block is now responsive across columns, enabling multi-column layouts that reflow perfectly across devices. It’s a modern layout tool developers have been waiting for.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The addition of Breadcrumbs and Icon blocks is another welcome expansion. The Breadcrumbs block is highly customizable and schema-ready out of the box, and the Icon block supports scalable SVGs with 88 preloaded icons, all ready to use without requiring massive font libraries.<br></p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The Gallery block now supports lightbox navigation, so users can finally browse through image sets using on-screen buttons or keyboard arrows. The system automatically skips any images where the lightbox is disabled to provide a seamless experience.<br></p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A few additional blocks have also been refined:<br></p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>Query Loop block: Faster and more reliable data fetching.</li>



<li>Heading block: Updated variations for better control over H1-H6 hierarchy.</li>



<li>Paragraph block: Text columns and text indent support.</li>
</ul>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">New <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/core/2026/03/15/block-visibility-in-wordpress-7-0/" target="_blank" rel="noreferrer noopener">viewport-based block visibility</a> lets users hide any block based on the viewer’s device type. No plugin or custom CSS code required; simply choose which blocks you want to hide and on what device type. In List View, blocks will display an icon indicating certain viewports are hidden, and hovering over the icon shows which viewports those are.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Users can also <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/core/2026/03/03/php-only-block-registration/" target="_blank" rel="noreferrer noopener">register blocks entirely with PHP</a>, which will be a welcome change for those who miss the simplicity of shortcodes.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">These core and block improvements provide a solid structural foundation, but 7.0 goes even further by giving designers guardrails to ensure their layouts remain intact during the editing process.</p>



<h2 id="toc-wp-engines-full-time-contribution-team" class="wp-block-heading" data-analytics-track-visibility="yes">WP Engine’s full-time contribution team</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">WP Engine’s sponsored contributors, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://profiles.wordpress.org/westonruter/" target="_blank" rel="noreferrer noopener">Weston Ruter</a>, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://profiles.wordpress.org/mindctrl/" target="_blank" rel="noreferrer noopener">John Parris</a>, and <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://profiles.wordpress.org/joefusco/" target="_blank" rel="noreferrer noopener">Joe Fusco</a>, were instrumental in building and testing many of the features included in WordPress 7.0.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Both Fusco and Parris concentrated on the real-time collaboration (RTC) framework, which was tabled for 7.0 but will likely ship with a future release. Fusco spearheaded the migration of collaboration data from post meta to dedicated database tables, ensuring the system remains performant and scalable, while Parris optimized RTC by implementing awareness-state caching and refining REST endpoints to eliminate race conditions and ensure multi-user editing feels instantaneous and reliable.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Ruter’s contributions focused primarily on core modernization and performance optimization. He led the integration of advanced static analysis tools like PHPStan to harden the codebase, helped bring the command palette to mobile, contributed to smooth admin view transitions, and brought the built-in code editor up to date. His extensive work on the script/style dependency system is crucial for maintaining CSS cascade integrity in classic themes, and he led key media optimizations, including fine-tuning fetchpriority for images.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Along with dozens of other community members, WP Engine’s core contributor team has done the prep work for a new, collaborative experience in a future WordPress release and reinforced the underlying stability and speed of the world’s most-used CMS in time for 7.0.</p>



<h2 id="toc-looking-ahead-to-2026" class="wp-block-heading" data-analytics-track-visibility="yes">Looking ahead to 2026</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">While WordPress 7.0 is the landmark release of the year, it is only the beginning of the <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://wordpress.org/about/roadmap/" target="_blank" rel="noreferrer noopener">2026 roadmap</a>. We are looking forward to even more exciting updates in <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/core/7-1/" target="_blank" rel="noreferrer noopener">version 7.1 (expected in August</a>) and <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://make.wordpress.org/core/7-2/" target="_blank" rel="noreferrer noopener">7.2 (expected in December)</a>.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes"><br>WordPress 7.0 is making a major leap into a more collaborative, AI-ready system. Our gratitude goes out to the entire community of contributors who made this release possible, and special thanks to WP Engine’s sponsored core contribution team for all their hard work on 7.0.</p><p>The post <a href="https://wpengine.com/blog/wordpress-7-0-release/">What’s New in WordPress® 7.0? A Community Member’s Perspective</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Developer&#8217;s Guide to Zero-Downtime Website Migrations</title>
		<link>https://wpengine.com/blog/zero-downtime-migrations/</link>
		
		<dc:creator><![CDATA[Kev Dooley]]></dc:creator>
		<pubDate>Mon, 18 May 2026 16:09:25 +0000</pubDate>
				<guid isPermaLink="false">https://wpengine.com/?p=7362</guid>

					<description><![CDATA[<p>Planning to move a site from one host to another can be a stressful endeavor for developers and technical decision-makers. The stakes are incredibly high. Uptime, data integrity, search engine optimization (SEO) rankings, and performance can be impacted by a less-than-stellar migration. The most successful migrations follow a structured, testable workflow. They use reliable tools [&#8230;]</p>
<p>The post <a href="https://wpengine.com/blog/zero-downtime-migrations/">The Developer&#8217;s Guide to Zero-Downtime Website Migrations</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Planning to move a site from one host to another can be a stressful endeavor for developers and technical decision-makers. The stakes are incredibly high. Uptime, data integrity, search engine optimization (SEO) rankings, and performance can be impacted by a less-than-stellar migration.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The most successful migrations follow a structured, testable workflow. They use reliable tools that minimize the risk of downtime, broken environments, or data loss. This guide outlines the essential zero downtime migration processes, common pitfalls to avoid, and tooling options. It also explains how platforms with built-in migration support help reduce operational friction.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Before migrating, make sure you are using a workflow engineered for reliability, rollback safety, and performance continuity.</p>



<h2 id="toc-why-migration-strategy-matters-for-developers" class="wp-block-heading" data-analytics-track-visibility="yes">Why migration strategy matters for developers</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Poor migrations cause cascading issues that can impact a business for months. A misconfigured transfer can lead to broken environments, plugin and theme conflicts, failed database imports, DNS misconfigurations, and SSL breakage.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Additionally, according to the 2024 ITIC Reliability Survey, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.calyptix.com/wp-content/uploads/Hourly-Cost-of-Downtime-ITIC.pdf" target="_blank" rel="noreferrer noopener">over 90% of mid-sized and large enterprises lose more than $300,000 per hour of downtime</a>, with a significant portion reporting losses between $1 million and $5 million per hour. Even for small businesses, the revenue impact of an offline site is severe, with some SMB sources reporting as much as $100,000 lost per hour of downtime.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Furthermore, a<a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://medium.com/@kaopizsoftware/the-hidden-complexity-of-data-migration-why-83-of-projects-fail-and-how-to-beat-the-odds-191c65f55dcd" target="_blank" rel="noreferrer noopener">2025 industry analysis by Kaopiz Global</a> reveals that a staggering 83% of data migration projects fail to meet their objectives, often significantly exceeding their allocated budgets and timelines due to poor execution.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Technical buyers correctly prioritize stability, speed, and risk elimination. A migration is often the single riskiest moment in a website’s lifecycle.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The modern expectation is simple: zero visible downtime, clean environment parity, and predictable rollback options.</p>



<h2 id="toc-migration-pre-checklist-what-to-verify-before-moving-any" class="wp-block-heading" data-analytics-track-visibility="yes">Migration pre-checklist: What to verify before moving any site</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A successful migration requires meticulous planning. Use this structured, developer-friendly checklist to prepare:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>Audit the current environment: Document the exact PHP version, database engine, caching stack, and file structure in use.</li>



<li>Inventory assets: List all active plugins, themes, custom code snippets, and third-party integrations.</li>



<li>Confirm access: Ensure you have working SFTP/SSH credentials, database access, control panel logins, and API tokens. Familiarize yourself with any new hosting portals and dashboard early on. For instance, if you’re migrating to WP Engine, tour the <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/wp-engine-user-portal/" target="_blank" rel="noreferrer noopener">WP Engine User Portal</a> at this point.</li>



<li>Assess potential blockers: Identify large media libraries, multi-environment setups, or heavy customizations that require special handling.</li>



<li>Ensure robust backups: Verify you have full, versioned backups from both the source and the destination environments.</li>



<li>Identify dependencies: Check for cron jobs, specialized caching rules, or email routing tied to the old host.</li>
</ul>



<h2 id="toc-7-website-migration-best-practices-for-a-smooth-transition" class="wp-block-heading" data-analytics-track-visibility="yes">7 website migration best practices for a smooth transition</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Following a structured approach guarantees a safer transfer. Consider these seven pillars for your next project.</p>



<h3 id="toc-1-use-a-staging-or-temporary-environment-first" class="wp-block-heading" data-analytics-track-visibility="yes">1. Use a staging or temporary environment first</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Never migrate data directly to a live production server. Always <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/resources/clone-your-wordpress-site-how-to/" target="_blank" rel="noreferrer noopener">clone your WordPress®¹ site</a> to a staging environment. This provides a safe sandbox to test compatibility, resolve errors, and measure performance before public traffic hits the server.</p>



<h3 id="toc-2-align-php-versions-database-versions-and-server-configs" class="wp-block-heading" data-analytics-track-visibility="yes">2. Align PHP versions, database versions, and server configs</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Environment mismatches cause the majority of fatal errors during a move. Document the exact configurations of the old host and replicate them on the new platform. Ensuring environment parity prevents broken code and unexpected downtime.&nbsp;</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">If you cannot rollback the new hosting environment to your current environment versions, you’ll need to plan through how to upgrade and test the current environment before migrating.</p>



<h3 id="toc-3-migrate-database-and-content-with-validated-tools" class="wp-block-heading" data-analytics-track-visibility="yes">3. Migrate database and content with validated tools</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Using reliable tools prevents serialization issues, broken URLs, and permanent data corruption. A manual SQL export can easily corrupt serialized PHP arrays. WP Engine provides robust tooling to <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/resources/migrate-wordpress-site/" target="_blank" rel="noreferrer noopener">migrate a WordPress site</a> safely, handling these technical details automatically behind the scenes.</p>



<h3 id="toc-4-migrate-media-efficiently" class="wp-block-heading" data-analytics-track-visibility="yes">4. Migrate media efficiently</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Large media libraries require careful handling. Moving gigabytes of images via standard FTP is slow and prone to timeout errors. Instead, chunk the transfers, use rsync, or rely on host-assisted transfer protocols to ensure every file arrives intact.</p>



<h3 id="toc-5-validate-file-permissions-and-environment-variables" class="wp-block-heading" data-analytics-track-visibility="yes">5. Validate file permissions and environment variables</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Incorrect file permissions are a common cause of broken assets, failed form submissions, and integration errors. Double-check that all directories and files have the correct ownership and permissions mapped to the new server architecture.</p>



<h3 id="toc-6-update-dns-with-minimal-downtime" class="wp-block-heading" data-analytics-track-visibility="yes">6. Update DNS with minimal downtime</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Planning the domain name system (DNS) switch is crucial for zero-downtime migrations. Reduce the Time to Live (TTL) settings days in advance. This ensures that when you <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/point-domain/" target="_blank" rel="noreferrer noopener">point your domain</a> to the new host, the propagation window is as short as possible. Always establish a clear rollback timeline just in case.</p>



<h3 id="toc-7-test-everything-before-going-live" class="wp-block-heading" data-analytics-track-visibility="yes">7. Test everything before going live</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Once the data is moved, test the staging site extensively. Check page load performance, review server error logs, click through navigation links, test caching layers, and verify redirects. Finally, run through transactional flows like checkouts, form submissions, and user logins.</p>



<h2 id="toc-common-migration-pitfalls-and-how-to-avoid-them" class="wp-block-heading" data-analytics-track-visibility="yes">Common migration pitfalls (and how to avoid them)</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Managed platforms help prevent many of the standard issues teams face during a transition. Understanding these pitfalls allows technical teams to approach the problem proactively.</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li>Failing to match environment parity: Different PHP versions or missing extensions will crash a site. Always verify server specs before moving files.</li>



<li>Migrating outdated plugins or themes: According to the Patchstack 2024 State of WordPress Security report, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://patchstack.com/database/" target="_blank" rel="noreferrer noopener">96% of recently reported vulnerabilities originate from plugins</a>. Update everything on the source site before migrating to avoid bringing security flaws to the new host.</li>



<li>Missing DNS windows: Forgetting to lower TTL settings prolongs DNS propagation, leaving users seeing the old site for up to 48 hours. Plan the DNS strategy early.</li>



<li>Media mismatches or partial transfers: Timeout limits often cause large image folders to fail halfway. Use command-line tools or automated plugins to verify file integrity.</li>



<li>Serialized data breaking on import: Standard find-and-replace tools break serialized strings in the database. Always use a tool built specifically to handle these databases correctly.</li>



<li>Overwriting custom code or staging changes: Moving data blindly can erase recent client work. Use Git or a structured deployment process to <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/copy-site/">copy a site</a> without overwriting custom commits.</li>



<li>Lack of rollback plan: Never start a migration without a verified backup. If the new server fails, teams must be able to revert DNS and restore the original site instantly.</li>
</ul>



<h2 id="toc-choosing-the-right-migration-tools-and-workflows" class="wp-block-heading" data-analytics-track-visibility="yes">Choosing the right migration tools and workflows</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Technical buyers have several options when evaluating a migration workflow. The right choice depends on the size of the site and the technical proficiency of the team.</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Automated migration plugins:</strong> These are user-friendly tools that package files and databases into a single payload.</li>



<li><strong>CLI-based migrations: </strong>Command-line interfaces offer deep control for developers comfortable with terminal commands.</li>



<li><strong>Database export/import tools:</strong> These require manual handling of SQL files and careful attention to serialization.</li>



<li><strong>Git-based deployments: </strong>Ideal for custom themes and plugins, allowing teams to push code predictably. To ensure code works perfectly before pushing, many developers use a <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/resources/local-wordpress-development-environment-how-to/" target="_blank" rel="noreferrer noopener">local development environment</a>.</li>



<li><strong>rsync/file transfer methods:</strong> Best for transferring massive media directories securely over SSH.</li>



<li><strong>Host-assisted migration services:</strong> Many platforms offer expert teams to handle the entire process.</li>
</ul>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Platforms offering automated migration plugins, expert-assisted options, staging environments, and consistency checks significantly reduce risk. Predictable, low-downtime workflows are a key decision factor, especially when handling complex <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/resources/agency-site-migrations/" target="_blank" rel="noreferrer noopener">agency site migrations</a> or when planning a <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/resources/website-migration-tips-for-small-businesses/" target="_blank" rel="noreferrer noopener">website migration for small businesses</a> that are entirely web-reliant.</p>



<h2 id="toc-performance-considerations-during-and-after-migration" class="wp-block-heading" data-analytics-track-visibility="yes">Performance considerations during and after migration</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A migration is a valuable opportunity to fix long-standing performance blockers. Platforms optimized for performance help ensure the site is actually faster after the move, not just relocated.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A recent report of 2025 e-commerce performance statistics compiled by Kanuka Digital shows that websites loading in just one second achieve <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="outbound" href="https://www.kanukadigital.com/2025/09/website-load-time-statistics-in-2025/" target="_blank" rel="noreferrer noopener">conversion rates 2.5 times higher than those taking five seconds to load</a>.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Key performance settings to review on the new platform include:</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Rebuilding cache layers:</strong> Ensure object caching and page caching are actively functioning on the new server.</li>



<li><strong>Verifying CDN routing:</strong> Check that the Content Delivery Network is routing traffic correctly and applying edge rules.</li>



<li><strong>Confirming paths and redirects:</strong> Ensure that asset paths, 301 redirects, and compression settings match expectations.</li>



<li><strong>Ensuring background tasks run:</strong> Verify that WP-Cron jobs, message queues, and scheduled posts operate normally.</li>



<li><strong>Testing performance:</strong> Run speed tests on the new infrastructure to confirm Time to First Byte (TTFB) improvements.</li>
</ul>



<h2 id="toc-how-wp-engine-simplifies-and-de-risks-the-migration" class="wp-block-heading" data-analytics-track-visibility="yes">How WP Engine simplifies and de-risks the migration process</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">WP Engine offers specialized infrastructure and tooling designed to make migrations safe, predictable, and fast. Technical teams choose the platform to reduce the operational friction associated with moving complex sites.</p>



<ul class="wp-block-list" data-analytics-track-visibility="yes">
<li><strong>Automated migration tools:</strong> WP Engine provides plugins engineered specifically for reliability and data integrity.</li>



<li><strong>Included environments:</strong> Every account includes dedicated development, staging, and production environments.</li>



<li><strong>Expert support:</strong> The support team is deeply familiar with complex transfers, including how to <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/support/migrate-ecommerce-site/" target="_blank" rel="noreferrer noopener">migrate an eCommerce site</a> without losing order data.</li>



<li><strong>Performance-tuned architecture:</strong> The platform is built to improve speed and security immediately post-migration.</li>



<li><strong>Integrated backups:</strong> Daily automated backups and instant rollbacks provide peace of mind.</li>



<li><strong>Clear deployment workflows:</strong> Built-in tools allow developers to push code seamlessly between environments.</li>



<li><strong>Assisted options:</strong> Optional expert-assisted migrations are available for enterprise-level or highly complex architecture moves.</li>
</ul>



<h2 id="toc-migrate-your-website-with-confidence-and-control" class="wp-block-heading" data-analytics-track-visibility="yes">Migrate your website with confidence and control</h2>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Website migrations are not just a technical risk. They represent a powerful opportunity to improve performance, enhance reliability, and establish long-term maintainability for a digital asset. By preparing a thorough checklist, utilizing staging environments, and carefully managing DNS, developers can execute seamless transfers.</p>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Using the right tools and leaning on specialized platforms takes the guesswork out of the process. If you are ready to explore a better way to host, <a data-analytics-action-type="link" data-analytics-link-location="Post Content" data-analytics-link-type="internal" href="https://wpengine.com/migrate-wordpress/" target="_blank" rel="noreferrer noopener">WP Engine offers the tooling</a>, platform features, and expert support that help teams execute safer, faster migrations.</p>



<h2 id="toc-faqs-about-website-migration-best-practices" class="wp-block-heading" data-analytics-track-visibility="yes">FAQs about website migration best practices</h2>



<h3 id="toc-how-long-does-a-typical-site-migration-take" class="wp-block-heading" data-analytics-track-visibility="yes">How long does a typical site migration take?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">A standard migration for a small to medium website usually takes between two to four hours of active work. However, DNS propagation can add an additional 24 to 48 hours before the transition is visible globally. Complex eCommerce stores or large media sites require additional planning, testing, and synchronization, extending the timeline to several days or weeks.</p>



<h3 id="toc-how-can-i-avoid-downtime-during-migration" class="wp-block-heading" data-analytics-track-visibility="yes">How can I avoid downtime during migration?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">To avoid downtime, migrate data to a staging environment on the new host first. Test the site thoroughly via a temporary URL. Once the staging site functions perfectly, lower the DNS TTL settings, schedule the final data sync during off-peak hours, and update the DNS records to point to the new server.</p>



<h3 id="toc-what-is-the-safest-way-to-migrate-large-media" class="wp-block-heading" data-analytics-track-visibility="yes">What is the safest way to migrate large media libraries?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">The safest way to move massive media directories is by using SSH and the rsync command. This method is faster than standard FTP, encrypts the data during transit, and can resume the transfer automatically if the connection drops. Alternatively, utilize host-assisted migration tools designed to chunk large directories and bypass standard server timeout limits.</p>



<h3 id="toc-how-do-i-test-a-site-properly-after-migration" class="wp-block-heading" data-analytics-track-visibility="yes">How do I test a site properly after migration?</h3>



<p class="wp-block-paragraph" data-analytics-track-visibility="yes">Testing requires a methodical approach. Start by checking the server logs for fatal errors. Click through the primary navigation to ensure permalinks work. Submit contact forms, complete a test purchase on eCommerce setups, and verify that the caching layers are active. Finally, use a performance tool to compare the new load times against the old environment.</p><p>The post <a href="https://wpengine.com/blog/zero-downtime-migrations/">The Developer&#8217;s Guide to Zero-Downtime Website Migrations</a> appeared first on <a href="https://wpengine.com">WP Engine®</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
