<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ansak Mahir</title>
    <description>The latest articles on DEV Community by Ansak Mahir (@ansak_11).</description>
    <link>https://dev.to/ansak_11</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4223934%2F15aae218-9f69-44b5-a64e-4bca4901234e.jpg</url>
      <title>DEV Community: Ansak Mahir</title>
      <link>https://dev.to/ansak_11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ansak_11"/>
    <language>en</language>
    <item>
      <title>Elementor MCP: Connect Claude, Codex or Cursor, and Fix It When It Won't Work</title>
      <dc:creator>Ansak Mahir</dc:creator>
      <pubDate>Tue, 03 Nov 2026 09:47:51 +0000</pubDate>
      <link>https://dev.to/ansak_11/elementor-mcp-connect-claude-codex-or-cursor-and-fix-it-when-it-wont-work-5dp</link>
      <guid>https://dev.to/ansak_11/elementor-mcp-connect-claude-codex-or-cursor-and-fix-it-when-it-wont-work-5dp</guid>
      <description>&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://letsknowtech.com/elementor-mcp/" rel="noopener noreferrer"&gt;LetsKnowTech&lt;/a&gt;, where I keep it up to date.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Elementor MCP is the MCP server built into the free Elementor plugin since version 4.3. You switch it on under &lt;strong&gt;Elementor &amp;gt; Elementor MCP&lt;/strong&gt;, paste the prompt it generates into Claude Code, Claude Desktop, Codex or Cursor, and the AI can create pages, change them and publish them using Elementor's own widgets. Three things are easy to miss. It only edits pages built with Elementor's new Atomic (V4) elements. It needs WordPress 6.9 or newer, even though Elementor says 6.8. And a change it publishes to a page that's already live can stay invisible to visitors for up to a day, because of Elementor's element cache. Each of those has a fix below, and so does every connection error we ran into.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need first
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Elementor 4.3.4 or newer. MCP arrived in 4.3.0. Version 4.3.4 fixed two MCP bugs: element settings could get lost when a page was updated through MCP, and the setup screen didn't warn you when Application Passwords were unavailable. 4.3.5 is the current release.&lt;/li&gt;
&lt;li&gt;WordPress 6.9 or newer. Elementor's &lt;a href="https://wordpress.org/plugins/elementor/" rel="noopener noreferrer"&gt;plugin listing&lt;/a&gt; says it needs 6.8, and the plugin does run there, but its MCP feature is built on the Abilities API, whose &lt;a href="https://developer.wordpress.org/reference/functions/wp_register_ability/" rel="noopener noreferrer"&gt;&lt;code&gt;wp_register_ability()&lt;/code&gt;&lt;/a&gt; function arrived in WordPress 6.9. On a WordPress 6.8.3 site with Elementor 4.3.5 there was no Elementor MCP item in the menu at all, and opening &lt;code&gt;wp-admin/admin.php?page=elementor-mcp&lt;/code&gt; directly gave "Sorry, you are not allowed to access this page." Update WordPress and the menu item appears.&lt;/li&gt;
&lt;li&gt;Application Passwords that work. The AI client logs in with one. WordPress only offers them on sites served over HTTPS (or sites marked as local development sites), and some security plugins switch them off.&lt;/li&gt;
&lt;li&gt;An administrator account to open the setup screen. Editors can use the connection, but they can't open that screen (&lt;a href="https://letsknowtech.com/elementor-mcp/#accounts" rel="noopener noreferrer"&gt;which account to connect with&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The Atomic Editor switched on. It's on by default in Elementor 4.3.5, but if someone turned it off under &lt;strong&gt;Elementor &amp;gt; Settings &amp;gt; Atomic Editor&lt;/strong&gt;, 12 of the 20 tools refuse to work, including every one that builds or edits (&lt;a href="https://letsknowtech.com/elementor-mcp/#atomic-off" rel="noopener noreferrer"&gt;the error&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Pages built with Atomic elements, if you want the AI to edit them. It can read older pages but can't change them (&lt;a href="https://letsknowtech.com/elementor-mcp/#v3" rel="noopener noreferrer"&gt;more on that&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Node.js on your computer if you use Claude Desktop, because Elementor's Claude Desktop setup runs &lt;code&gt;npx mcp-remote&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need Elementor Pro. The free plugin gave our test site 20 tools. Pro adds headers, footers and other theme parts (&lt;a href="https://letsknowtech.com/elementor-mcp/#pro" rel="noopener noreferrer"&gt;below&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn it on and connect your AI client
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In wp-admin, go to &lt;strong&gt;Elementor &amp;gt; Elementor MCP&lt;/strong&gt; and click &lt;strong&gt;Enable MCP access&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pick your client's tab: &lt;strong&gt;Claude Code&lt;/strong&gt;, &lt;strong&gt;Claude Desktop&lt;/strong&gt;, &lt;strong&gt;Codex&lt;/strong&gt;, &lt;strong&gt;Cursor&lt;/strong&gt; or &lt;strong&gt;Other&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tick "I understand that clicking Generate Prompt will create an application password for this site", then click &lt;strong&gt;Generate Prompt&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Copy prompt&lt;/strong&gt; and paste it into your AI client. The prompt asks the client to add the server to its own config file.&lt;/li&gt;
&lt;li&gt;Restart the client, then check that the server shows as connected. In Claude Code, type &lt;code&gt;/mcp&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyhoc916r1duepc3ye784.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyhoc916r1duepc3ye784.webp" alt="The Elementor MCP screen in wp-admin with the Claude Code tab selected and a generated setup prompt showing the server URL, username and a blurred application password" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The prompt contains a working application password for your admin account, in plain text. Treat it like your admin password: don't paste it into a shared chat, a support ticket or a screen recording.&lt;/p&gt;

&lt;p&gt;Each click on &lt;strong&gt;Generate Prompt&lt;/strong&gt; creates a new password with a name like "Elementor MCP - Claude Code (2026-10-18 12:42:34)". If you clicked it a few times while getting set up, delete the spares under &lt;strong&gt;Users &amp;gt; Profile &amp;gt; Application Passwords&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you'd rather edit the config file yourself, click &lt;strong&gt;Prefer manual configuration?&lt;/strong&gt; on the same screen. It generates the configuration block and tells you which file to paste it into.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where each client's config goes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Client&lt;/th&gt;
&lt;th&gt;Config file on macOS/Linux&lt;/th&gt;
&lt;th&gt;Config file on Windows&lt;/th&gt;
&lt;th&gt;How it connects&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%USERPROFILE%\.claude.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Straight to the site over HTTP, with an &lt;code&gt;Authorization&lt;/code&gt; header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Desktop&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs &lt;code&gt;npx -y mcp-remote&lt;/code&gt; with the same header (needs Node.js)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.codex/config.toml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%USERPROFILE%\.codex\config.toml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Straight to the site, TOML format (&lt;a href="https://letsknowtech.com/elementor-mcp/#codex" rel="noopener noreferrer"&gt;needs one fix&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%USERPROFILE%\.cursor\mcp.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Straight to the site, with the header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/mcp-config.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%USERPROFILE%\mcp-config.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same JSON as Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For Claude Code the entry looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"your-site-elementor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/wp-json/elementor/mcp/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Basic BASE64_STRING"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;BASE64_STRING&lt;/code&gt; is your username, a colon and the application password (&lt;code&gt;admin:abcd efgh ijkl mnop qrst uvwx&lt;/code&gt;), Base64-encoded. Elementor's prompt fills it in for you. If you're making one by hand, the spaces in the password can stay, and your account's email address works in place of the username. To get the string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS / Linux&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s1"&gt;'admin:abcd efgh ijkl mnop qrst uvwx'&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows PowerShell&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;ToBase64String&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Text.Encoding&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;UTF8.GetBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'admin:abcd efgh ijkl mnop qrst uvwx'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Claude Code you can add the server from a terminal instead of editing the file. &lt;code&gt;--scope user&lt;/code&gt; makes it available in every project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http &lt;span class="nt"&gt;--scope&lt;/span&gt; user your-site-elementor https://example.com/wp-json/elementor/mcp/ &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Basic BASE64_STRING"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Codex: rename &lt;code&gt;headers&lt;/code&gt; to &lt;code&gt;http_headers&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The Codex config Elementor 4.3.5 generates puts the password header under a &lt;code&gt;headers&lt;/code&gt; table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mcp_servers&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="n"&gt;your-site-elementor&lt;/span&gt;&lt;span class="k"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"https://example.com/wp-json/elementor/mcp/"&lt;/span&gt;

&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mcp_servers&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="n"&gt;your-site-elementor&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="k"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Authorization&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Basic BASE64_STRING"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex CLI (0.163) doesn't read that key. &lt;code&gt;codex mcp get your-site-elementor&lt;/code&gt; shows &lt;code&gt;http_headers: -&lt;/code&gt;, which means Codex calls your site without the password and gets a 401. Change &lt;code&gt;.headers]&lt;/code&gt; to &lt;code&gt;.http_headers]&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mcp_servers&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="n"&gt;your-site-elementor&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http_headers&lt;/span&gt;&lt;span class="k"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Authorization&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Basic BASE64_STRING"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;codex mcp get your-site-elementor&lt;/code&gt; again. It should now show &lt;code&gt;http_headers: Authorization=*****&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Desktop config on Windows: &lt;code&gt;npx&lt;/code&gt; not found
&lt;/h3&gt;

&lt;p&gt;Elementor's Claude Desktop config starts the connection with &lt;code&gt;"command": "npx"&lt;/code&gt;. On our Windows machine, Claude Code launched with exactly that config showed the server as &lt;strong&gt;failed&lt;/strong&gt;, while the same &lt;code&gt;mcp-remote&lt;/code&gt; command run by hand from a terminal connected fine. Windows installs &lt;code&gt;npx&lt;/code&gt; as &lt;code&gt;npx.cmd&lt;/code&gt;, and a program that starts commands without a shell doesn't find it. Wrapping the command in &lt;code&gt;cmd /c&lt;/code&gt; fixed it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"your-site-elementor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/wp-json/elementor/mcp/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--header"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Authorization: Basic BASE64_STRING"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your Windows client already connects with the plain &lt;code&gt;npx&lt;/code&gt; version, leave it alone.&lt;/p&gt;

&lt;p&gt;On Windows the &lt;code&gt;Authorization: Basic ...&lt;/code&gt; argument can also get split at its space on the way to &lt;code&gt;mcp-remote&lt;/code&gt;, which turns into a 401. The way around that is to pass the header value through an environment variable, with no space after the colon. This version connected on our Windows machine too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"your-site-elementor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/wp-json/elementor/mcp/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--header"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Authorization:${AUTH_HEADER}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"AUTH_HEADER"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Basic BASE64_STRING"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;p&gt;ChatGPT isn't one of the tabs. ChatGPT's custom connectors sign in with OAuth (or with no authentication at all), while Elementor's server expects an application password in a header, so the two don't connect directly. Our guide to &lt;a href="https://letsknowtech.com/connect-wordpress-to-chatgpt/" rel="noopener noreferrer"&gt;connecting WordPress to ChatGPT&lt;/a&gt; covers what ChatGPT does accept.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the AI can do with it
&lt;/h2&gt;

&lt;p&gt;The free plugin exposes 20 tools. You never call them yourself; the AI picks them based on what you ask. They fall into four groups:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Who can use them&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read the site&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list-posts&lt;/code&gt;, &lt;code&gt;get-page-structure&lt;/code&gt;, &lt;code&gt;list-widget-schemas&lt;/code&gt;, &lt;code&gt;get-widget-schema&lt;/code&gt;, &lt;code&gt;list-assets&lt;/code&gt; (Media Library images, SVGs, videos), &lt;code&gt;list-components&lt;/code&gt;, &lt;code&gt;get-default-styles&lt;/code&gt;, &lt;code&gt;list-resources&lt;/code&gt;, &lt;code&gt;read-resource&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Anyone who can edit posts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build and edit pages&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;create-page&lt;/code&gt; (always as a draft), &lt;code&gt;build-composition&lt;/code&gt; (adds a whole section from a layout), &lt;code&gt;manage-elements&lt;/code&gt; (up to 50 edits, moves, duplicates or deletes per call), &lt;code&gt;update-page-settings&lt;/code&gt; (hide title, layout)&lt;/td&gt;
&lt;td&gt;Anyone who can edit that page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check and publish&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;create-preview-link&lt;/code&gt; (a signed, short-lived preview the AI uses to check its own work), &lt;code&gt;publish-document&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Anyone who can publish that page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Site-wide design&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;manage-global-variable&lt;/code&gt; (colours, fonts, sizes), &lt;code&gt;manage-classes&lt;/code&gt;, &lt;code&gt;reorder-classes&lt;/code&gt;, &lt;code&gt;manage-default-styles&lt;/code&gt;, &lt;code&gt;manage-component&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Administrators only (by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The widgets it can place are Elementor's Atomic ones: heading, paragraph, image, SVG, button, divider, YouTube, self-hosted video, div block, flexbox, grid, tabs, accordion, background video, form and collection loop. Saved components can be placed too.&lt;/p&gt;

&lt;p&gt;On our test site (WordPress 7.1.3, the Hello Elementor theme, no global styles set up), Claude Code built a landing page with a hero, three columns and an FAQ in about two minutes. It saved the page as a draft, avoided inventing prices or reviews, and listed the lines it had written that the owner should check, such as "most boiler services take about an hour". A follow-up asking for a new heading, a dark green button and a fourth column took about a minute and touched only those parts of the page. For more of what the wider WordPress MCP setup can do beyond Elementor, see &lt;a href="https://letsknowtech.com/wordpress-mcp-adapter/" rel="noopener noreferrer"&gt;everything the WordPress MCP Adapter can do&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1t2wfber46f06oy3ujpf.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1t2wfber46f06oy3ujpf.webp" alt="The landing page Claude built through Elementor MCP: a hero heading, a dark green 'Book your service' button, four columns and an FAQ, centred on the Hello Elementor theme" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page opens in the Elementor editor like any other page, with the sections named the way the AI named them ("hero", "features", "faq"). You can carry on by hand from there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5ml26iv3hgjopqmlxp1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5ml26iv3hgjopqmlxp1.webp" alt="The AI-built page open in the Elementor editor, with Atomic Elements in the left panel and the Structure panel listing the hero, features and faq sections" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two things it didn't catch on its own, and that you can put straight into your first prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two H1 headings. The theme printed the page title ("Winter Boiler Service Offer") as an H1, and the hero heading was a second H1. Ask it to "hide the theme's page title on this page". It turns on &lt;strong&gt;Hide Title&lt;/strong&gt; in the page settings.&lt;/li&gt;
&lt;li&gt;Content running edge to edge on wide screens, because no container width was set. Ask for "a centred column no wider than 1140px, with side padding on mobile". It created a reusable class and attached it to each section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Old pages: "Legacy V3 element cannot be modified through this MCP"
&lt;/h2&gt;

&lt;p&gt;Pages built with Elementor's classic widgets (the Heading, Text Editor and Button widgets most existing sites use) can be read but not changed. When we asked Claude to change the heading and button text on a classic page, every edit came back with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Legacy V3 element cannot be modified through this MCP. Edit V3 elements directly in the Elementor editor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI can't even read those widgets' text or styles. It only sees that a "heading" or "button" is there. You have two ways forward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the change in the Elementor editor yourself. For a text change, that's the quickest route and it keeps your styling.&lt;/li&gt;
&lt;li&gt;Let the AI rebuild that section with Atomic elements, then delete the old one. The new section won't copy the old fonts, colours or spacing, so check it before publishing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To find out which parts of a page it can edit before you ask for changes, ask: "Which elements on the About page are version 3 and which are version 4?" The page-structure tool tags every element with its version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Headers, footers and other Pro parts
&lt;/h2&gt;

&lt;p&gt;We asked for a site-wide header with a menu and a footer with a phone number. Claude didn't build anything. The free plugin has no tools for theme parts, and Claude said so, offering to put a header block inside individual pages instead, which it advised against. Elementor's own MCP screen says that with Pro, "your agent can build with Theme Builder, forms, popups, and more advanced Elementor capabilities". Its tool descriptions mention separate site-parts tools for headers, footers, 404 pages and archives that only appear with Pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes on a live page don't show up
&lt;/h2&gt;

&lt;p&gt;This one will confuse you if you don't know about it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Edits wait until they're published
&lt;/h3&gt;

&lt;p&gt;When the AI changes a page that's already live, Elementor stores the change as an autosave. Visitors see the old version until the AI calls its publish tool. If the AI says "done" and the live page hasn't changed, ask it to publish the page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Then the old version can stay up for a day
&lt;/h3&gt;

&lt;p&gt;After a publish through MCP, the database had the new heading, but the live page kept showing the old one. That happened every time we repeated it. The cause is Elementor's &lt;strong&gt;Element Cache&lt;/strong&gt;, which stores the rendered HTML of each page for 1 day by default. Saving in the Elementor editor clears it; publishing through MCP didn't. To fix it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Right now: go to &lt;strong&gt;Elementor &amp;gt; Tools&lt;/strong&gt; and click &lt;strong&gt;Clear Files &amp;amp; Data&lt;/strong&gt;. On the command line, &lt;code&gt;wp elementor flush-css&lt;/code&gt; does the same thing. The new version showed up straight away.&lt;/li&gt;
&lt;li&gt;If you'll edit live pages through MCP often: set &lt;strong&gt;Element Cache&lt;/strong&gt; to a shorter time, or to &lt;strong&gt;Disable&lt;/strong&gt;, under Elementor's &lt;strong&gt;Settings &amp;gt; Performance&lt;/strong&gt;. With it disabled, the published change showed up immediately.&lt;/li&gt;
&lt;li&gt;Clear your page cache plugin and your CDN as well, as you would after any change. Then check the page in a private window, logged out.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  One order to avoid
&lt;/h3&gt;

&lt;p&gt;On a live page, an element edit, then a page-settings change (such as hiding the title), then a publish lost the element edit. The page-settings save replaced the staged autosave. Claude ran into this by itself while fixing our page, noticed, and redid the edits. You can avoid it by asking for page-settings changes first, or by publishing the element edits before you change page settings. Either way, look at the live page afterwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which account to connect with
&lt;/h2&gt;

&lt;p&gt;The AI can do whatever the WordPress account behind the application password can do. Here's what three roles got on our test site:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Account&lt;/th&gt;
&lt;th&gt;Create pages&lt;/th&gt;
&lt;th&gt;Edit and publish any page&lt;/th&gt;
&lt;th&gt;Site-wide colours, fonts, classes, components&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Administrator&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Editor&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No ("Permission denied")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Author&lt;/td&gt;
&lt;td&gt;No ("Sorry, you are not allowed to create posts of this type.")&lt;/td&gt;
&lt;td&gt;No ("Sorry, you are not allowed to access this document.")&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For everyday page work, an Editor account is enough, and it can't touch your site-wide design. The catch is that the Elementor MCP screen needs an administrator. To connect an editor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in as the editor, go to &lt;strong&gt;Users &amp;gt; Profile &amp;gt; Application Passwords&lt;/strong&gt;, and create a password.&lt;/li&gt;
&lt;li&gt;Put that username and password into the config from the &lt;a href="https://letsknowtech.com/elementor-mcp/#configs" rel="noopener noreferrer"&gt;table above&lt;/a&gt;, with the server URL &lt;code&gt;https://yoursite.com/wp-json/elementor/mcp/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two more things worth knowing before you connect an agent to a live client site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Turn off MCP access" doesn't revoke the password. It closes the MCP endpoint, but the application password still logs in to the rest of the WordPress REST API. With MCP turned off, the same password still changed a page through &lt;code&gt;/wp-json/wp/v2/pages&lt;/code&gt;. To cut an agent off completely, revoke its password under &lt;strong&gt;Users &amp;gt; Profile &amp;gt; Application Passwords&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Try it on a copy first. A staging site or a &lt;a href="https://letsknowtech.com/wordpress-localhost/" rel="noopener noreferrer"&gt;local copy of WordPress&lt;/a&gt; lets you see how the AI handles your theme and your pages before it publishes anything real. On a local site, application passwords work without HTTPS as long as &lt;code&gt;WP_ENVIRONMENT_TYPE&lt;/code&gt; is set to &lt;code&gt;local&lt;/code&gt; in wp-config.php.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When it won't connect
&lt;/h2&gt;

&lt;p&gt;First, find out what the endpoint itself says. Paste your username and application password into one of these and run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS / Linux (or curl.exe on Windows)&lt;/span&gt;
curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"admin:abcd efgh ijkl mnop qrst uvwx"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/json, text/event-stream"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://example.com/wp-json/elementor/mcp/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows PowerShell&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;ToBase64String&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Text.Encoding&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;UTF8.GetBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'admin:abcd efgh ijkl mnop qrst uvwx'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseBasicParsing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Method&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'https://example.com/wp-json/elementor/mcp/'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Headers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;Authorization&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Basic &lt;/span&gt;&lt;span class="nv"&gt;$auth&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Accept&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'application/json, text/event-stream'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ContentType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'application/json'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StatusCode&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Content&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StatusCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value__&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ErrorDetails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then match what came back:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You get&lt;/th&gt;
&lt;th&gt;It means&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;200&lt;/code&gt; and JSON with &lt;code&gt;"serverInfo":{"name":"Elementor MCP"&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The site side works&lt;/td&gt;
&lt;td&gt;The problem is in the client: check the &lt;a href="https://letsknowtech.com/elementor-mcp/#configs" rel="noopener noreferrer"&gt;config file&lt;/a&gt;, the &lt;a href="https://letsknowtech.com/elementor-mcp/#codex" rel="noopener noreferrer"&gt;Codex header&lt;/a&gt;, &lt;a href="https://letsknowtech.com/elementor-mcp/#npx" rel="noopener noreferrer"&gt;npx on Windows&lt;/a&gt;, then restart the client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;401&lt;/code&gt; and &lt;code&gt;rest_forbidden&lt;/code&gt;, "Sorry, you are not allowed to do that."&lt;/td&gt;
&lt;td&gt;The password didn't log anyone in&lt;/td&gt;
&lt;td&gt;&lt;a href="https://letsknowtech.com/elementor-mcp/#401" rel="noopener noreferrer"&gt;Wrong password, or the header is being stripped&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;404&lt;/code&gt; and &lt;code&gt;rest_no_route&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No MCP route on this site&lt;/td&gt;
&lt;td&gt;MCP access is turned off, or Elementor or WordPress is too old (&lt;a href="https://letsknowtech.com/elementor-mcp/#no-menu" rel="noopener noreferrer"&gt;no menu item&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;200&lt;/code&gt; with a web page (HTML) instead of JSON&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/wp-json/&lt;/code&gt; isn't reaching WordPress's REST API&lt;/td&gt;
&lt;td&gt;&lt;a href="https://letsknowtech.com/elementor-mcp/#permalinks" rel="noopener noreferrer"&gt;Plain permalinks&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When the client can't connect, Claude Code just lists the server as &lt;strong&gt;failed&lt;/strong&gt; under &lt;code&gt;/mcp&lt;/code&gt; and the AI says it has no Elementor tools, whatever the cause. The test above tells you which cause it is.&lt;/p&gt;

&lt;h3&gt;
  
  
  401 "Sorry, you are not allowed to do that."
&lt;/h3&gt;

&lt;p&gt;All of these produced the same 401 on our test site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a mistyped or revoked application password&lt;/li&gt;
&lt;li&gt;your normal login password instead of an application password (it has to be an application password)&lt;/li&gt;
&lt;li&gt;a correct application password that never reached WordPress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last one fools people, because the password is right. Some servers, Apache with PHP running as FastCGI being the usual one on shared hosting, drop the &lt;code&gt;Authorization&lt;/code&gt; header before PHP sees it. WordPress's standard &lt;code&gt;.htaccess&lt;/code&gt; has a line that passes it through, but a hand-edited or older &lt;code&gt;.htaccess&lt;/code&gt; may not. On our FastCGI test server, removing that one line turned a working connection into a 401. The PHP error log said:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Permission denied for MCP API access. User ID 0 does not have capability "read" | Context: ["HttpTransport::check_permission"] | User ID: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"User ID 0" means nobody was logged in: the password never arrived. Any one of these, near the top of &lt;code&gt;.htaccess&lt;/code&gt;, brought the connection back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# WordPress's own line, inside the "BEGIN WordPress" block, after RewriteEngine On&lt;/span&gt;
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# Apache 2.4.13 and newer&lt;/span&gt;
&lt;span class="nc"&gt;CGIPassAuth&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="nc"&gt;SetEnvIf&lt;/span&gt; Authorization "(.*)" HTTP_AUTHORIZATION=$1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If none of them changes anything, your host may be stripping the header further up. Send them the error log line above.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Application passwords are not available on this site"
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdzz0tr6mquk3yskbmq0t.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdzz0tr6mquk3yskbmq0t.webp" alt="Elementor MCP screen showing 'Application passwords are not available on this site. Your site may require HTTPS, or a plugin may have disabled them.' with the Generate Prompt button greyed out" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elementor shows this, and greys out &lt;strong&gt;Generate Prompt&lt;/strong&gt;, when WordPress won't issue application passwords. On our test site it appeared as soon as the site was set as a production site still served over plain HTTP. Passwords created earlier stopped working too: they returned the same 401 as a wrong password.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serve the site over HTTPS. WordPress decides this from the request it receives. If your site sits behind a proxy or CDN that talks to your server over plain HTTP (Cloudflare's Flexible SSL mode does this), WordPress sees HTTP and keeps application passwords off. Use an SSL mode that encrypts the whole way to your server, such as Cloudflare's Full (strict), or ask your host to pass the HTTPS flag through.&lt;/li&gt;
&lt;li&gt;Check your security plugin. Several have a setting that disables application passwords. Turn that off, or allow them for the account you're connecting.&lt;/li&gt;
&lt;li&gt;For a local test site, set &lt;code&gt;define( 'WP_ENVIRONMENT_TYPE', 'local' );&lt;/code&gt; in wp-config.php.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Elementor 4.3.0 to 4.3.3, the screen didn't show this warning at all, so update to 4.3.4 or newer if the setup seems to do nothing.&lt;/p&gt;

&lt;p&gt;A similar message, "Application passwords are turned off for your user account", means it's switched off for your account only. Enable it on your profile page, as the message says.&lt;/p&gt;

&lt;h3&gt;
  
  
  No Elementor MCP menu item
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;WordPress 6.8 or older: the menu item only appears on 6.9 and newer. On 6.8, the page URL gives "Sorry, you are not allowed to access this page." That message has &lt;a href="https://letsknowtech.com/sorry-you-are-not-allowed-to-access-this-page/" rel="noopener noreferrer"&gt;other causes too&lt;/a&gt;, but here it just means the page doesn't exist yet.&lt;/li&gt;
&lt;li&gt;Elementor older than 4.3.0: update it under &lt;strong&gt;Plugins&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You're not an administrator: only accounts that can manage options see the screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  "This site needs the Atomic Editor turned on"
&lt;/h3&gt;

&lt;p&gt;If the connection works but the AI comes back with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This site needs the Atomic Editor turned on before this can be built. Turn it on in WP Admin → Elementor → Settings → Atomic Editor, then try again.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then the Atomic Editor is switched off on your site. With it off, all 20 tools still show up in the client, so the connection looks fine. But building, editing, reading widget lists and changing site-wide styles all return that message. Only a few things still work, such as listing posts, reading a page's structure, creating a blank draft and publishing. Turn it back on where the message says, and ask again.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/wp-json/&lt;/code&gt; returns your home page
&lt;/h3&gt;

&lt;p&gt;With &lt;strong&gt;Settings &amp;gt; Permalinks&lt;/strong&gt; set to &lt;strong&gt;Plain&lt;/strong&gt;, a request to &lt;code&gt;/wp-json/elementor/mcp/&lt;/code&gt; returned our home page's HTML with a &lt;code&gt;200&lt;/code&gt; status. The client can't make sense of that, so it shows as failed. On the same site, &lt;code&gt;https://example.com/?rest_route=/elementor/mcp/&lt;/code&gt; worked.&lt;/p&gt;

&lt;p&gt;Elementor builds the server URL when you generate the prompt, so it matches the permalink setting at that moment. The problem appears when you switch to Plain afterwards, or type the &lt;code&gt;/wp-json/&lt;/code&gt; URL in by hand. Pick any setting other than Plain, or use the &lt;code&gt;?rest_route=&lt;/code&gt; form of the URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turned off by mistake
&lt;/h3&gt;

&lt;p&gt;If someone clicked &lt;strong&gt;Turn off&lt;/strong&gt; on the Elementor MCP screen, the endpoint returns &lt;code&gt;404 rest_no_route&lt;/code&gt; and every client shows the server as failed. Click &lt;strong&gt;Enable MCP access&lt;/strong&gt; again. The existing application passwords still work, so the clients reconnect after a restart without a new prompt.&lt;/p&gt;

&lt;p&gt;That's all.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written with AI assistance from my own test notes; the fixes were run on real WordPress installs before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>php</category>
      <category>security</category>
      <category>mcp</category>
    </item>
    <item>
      <title>WordPress 7.1.3: Every Change Explained, Tested, and What to Do After You Update</title>
      <dc:creator>Ansak Mahir</dc:creator>
      <pubDate>Tue, 03 Nov 2026 09:47:48 +0000</pubDate>
      <link>https://dev.to/ansak_11/wordpress-713-every-change-explained-tested-and-what-to-do-after-you-update-1h6o</link>
      <guid>https://dev.to/ansak_11/wordpress-713-every-change-explained-tested-and-what-to-do-after-you-update-1h6o</guid>
      <description>&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://letsknowtech.com/wordpress-7-1-3/" rel="noopener noreferrer"&gt;LetsKnowTech&lt;/a&gt;, where I keep it up to date.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;WordPress 7.1.3 came out on October 6, 2026. It's a security and maintenance release with seven security fixes and four bug fixes, and it's the version every WordPress site should be on right now. WordPress.org already marks 7.1.0, 7.1.1 and 7.1.2 as insecure.&lt;/p&gt;

&lt;p&gt;It's a small, low-risk release, so update. Fifteen files change, the database doesn't, and a site on 7.1.2 downloads a 227 KB patch instead of the full 37 MB package. One change is visible to readers, though: &lt;strong&gt;Imgur embeds stop working&lt;/strong&gt;, and old ones keep showing until you clear their cache.&lt;/p&gt;

&lt;p&gt;Below, every change in 7.1.3 is explained twice: once in plain words, and once for developers, with the file and function that changed. Everything in the "what we saw" parts comes from updating a real test site from 7.1.2 to 7.1.3 and checking each change before and after.&lt;/p&gt;

&lt;h2&gt;
  
  
  WordPress 7.1.3 release details
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Released&lt;/td&gt;
&lt;td&gt;October 6, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Security and maintenance release (a "minor" release)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixes&lt;/td&gt;
&lt;td&gt;7 security fixes, 4 bug fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE IDs&lt;/td&gt;
&lt;td&gt;One so far: CVE-2026-66666 (comments on private posts, CVSS 4.0 score 6.9, Medium)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Known attacks&lt;/td&gt;
&lt;td&gt;None reported for any of the seven (but the critical fix in 7.1.2, which 7.1.3 includes, is under active attack)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database change&lt;/td&gt;
&lt;td&gt;None (database version stays 61833, so there's no "Update database" screen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requirements&lt;/td&gt;
&lt;td&gt;Unchanged: PHP 7.4 or newer, MySQL 5.5.5 or newer (&lt;a href="https://make.wordpress.org/hosting/handbook/compatibility/version/7-1/" rel="noopener noreferrer"&gt;7.1 compatibility&lt;/a&gt;; the same minimums are in &lt;code&gt;version.php&lt;/code&gt; of both releases)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Files changed&lt;/td&gt;
&lt;td&gt;15 in the release package, none added or removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Download size from 7.1.2&lt;/td&gt;
&lt;td&gt;227 KB partial update instead of the 37.2 MB full package (the 15 changed files plus the updater and readme that every update package carries; measured October 12, 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Older versions&lt;/td&gt;
&lt;td&gt;Security backports for every branch from 4.7 to 7.0, released the same day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next release&lt;/td&gt;
&lt;td&gt;WordPress 7.2, scheduled for December 8, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The official announcement is on the &lt;a href="https://wordpress.org/news/2026/10/wordpress-7-1-3-maintenance-and-security-release/" rel="noopener noreferrer"&gt;WordPress.org news blog&lt;/a&gt;, and the full code diff is in the &lt;a href="https://github.com/WordPress/wordpress-develop/compare/7.1.2...7.1.3" rel="noopener noreferrer"&gt;7.1.2...7.1.3 comparison on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One correction if you read the official &lt;a href="https://wordpress.org/documentation/wordpress-version/version-7-1-3/" rel="noopener noreferrer"&gt;version page&lt;/a&gt;: its "List of files revised" isn't quite right. It names two Customizer files (&lt;code&gt;class-wp-customize-manager.php&lt;/code&gt; and &lt;code&gt;class-wp-customize-setting.php&lt;/code&gt;) that are byte-for-byte identical in the 7.1.2 and 7.1.3 downloads, and it leaves out &lt;code&gt;wp-admin/includes/image.php&lt;/code&gt;, the toolbar stylesheets, &lt;code&gt;about.php&lt;/code&gt; and &lt;code&gt;version.php&lt;/code&gt;, which did change. You can see this in the GitHub comparison above, which never touches the Customizer files, or by comparing the two zips from the &lt;a href="https://wordpress.org/download/releases/" rel="noopener noreferrer"&gt;release archive&lt;/a&gt; yourself. We did both. The full list of changed files is &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#every-file" rel="noopener noreferrer"&gt;in the developer section&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you update? Is 7.1.3 stable?
&lt;/h2&gt;

&lt;p&gt;Yes, update. Three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It's a security release.&lt;/strong&gt; WordPress recommends updating immediately, and the version API now marks every earlier 7.1 release as insecure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The risk of breaking something is low.&lt;/strong&gt; No database change, no new requirements, no bundled package updates, and the code changes are small. Most of the security patches change a handful of lines each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you're on 7.1.0 or 7.1.1, you're missing much more than these seven fixes.&lt;/strong&gt; WordPress 7.1.2 fixed a critical flaw that could lead to remote code execution under some server setups, and that flaw is now being exploited. More on that &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#coming-from" rel="noopener noreferrer"&gt;below&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of the seven issues is a drop-everything emergency on its own. Two can be started by someone who isn't logged in, and both need something else to line up. The rest need a logged-in account or an unusual plugin setup. But the fixes are public, and the patch shows exactly where each weakness was, so the gap between "patched" and "someone tries it" gets shorter every day.&lt;/p&gt;

&lt;p&gt;How much each fix matters depends on how your site is used:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your site&lt;/th&gt;
&lt;th&gt;The fixes that matter most to you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A blog with open comments&lt;/td&gt;
&lt;td&gt;The pending-comment fix on the Comments screen, and the private-post comment leak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A site with writers (Contributors or Authors)&lt;/td&gt;
&lt;td&gt;The Imgur embed fix, the link-preview slowdown fix, the sticky-post fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A site with private or draft posts that get comments&lt;/td&gt;
&lt;td&gt;The private-post comment leak (CVE-2026-66666)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A site where admins export content (&lt;strong&gt;Tools &amp;gt; Export&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;The export fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A site with custom plugins that use custom post statuses&lt;/td&gt;
&lt;td&gt;The status-hook change (read the &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#developers" rel="noopener noreferrer"&gt;developer notes&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A simple brochure site with comments off and one admin&lt;/td&gt;
&lt;td&gt;Little direct exposure, but update anyway: it's free and takes seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Is 7.1.3 stable?&lt;/strong&gt; As of October 12, 2026, there are no reports of 7.1.3 breaking sites, and there's no 7.1.4 announced. The only change that visibly alters content is the Imgur one. The known WordPress 7.1 problems so far, and where each stands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WP Rocket below 3.23.2.2 crashed sites on 7.1&lt;/strong&gt; with &lt;code&gt;Uncaught TypeError: substr(): Argument #1 ($string) must be of type string, int given in .../wp-rocket/inc/ThirdParty/Plugins/CDN/Cloudflare.php:562&lt;/code&gt;. That's fixed in the plugin, not in WordPress: update WP Rocket to 3.23.2.2 or later (released August 20, 2026).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The toolbar site icon showing huge&lt;/strong&gt; on some themes: fixed in 7.1.3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image uploads failing on hosts without PHP's DOM extension&lt;/strong&gt; (a 7.0 bug): fixed in 7.1.3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run a lot of sites, test on one first. A copy of your site on your computer works fine for that; our &lt;a href="https://letsknowtech.com/wordpress-localhost/" rel="noopener noreferrer"&gt;WordPress localhost guide&lt;/a&gt; covers every way to set one up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7 security fixes, explained
&lt;/h2&gt;

&lt;p&gt;Here's the full list, with what an attacker would need for each one. "Contributor+" means anyone with the Contributor role or higher.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;The fix&lt;/th&gt;
&lt;th&gt;What an attacker needed&lt;/th&gt;
&lt;th&gt;Reported by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Stored XSS on the Comments screen, through pending comments&lt;/td&gt;
&lt;td&gt;A comment waiting for approval, and a moderator (Editor or Administrator) interacting with it&lt;/td&gt;
&lt;td&gt;Trail of Bits, with OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Denial of service in &lt;code&gt;WP_Http::make_absolute_url()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A Contributor+ account&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Second-order SQL injection in the WXR export&lt;/td&gt;
&lt;td&gt;A bad value already stored in the database, and an administrator running a specific export&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Authors could make posts sticky&lt;/td&gt;
&lt;td&gt;An Author account&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Comments on private and unpublished posts readable without logging in (CVE-2026-66666)&lt;/td&gt;
&lt;td&gt;Nothing: no account needed&lt;/td&gt;
&lt;td&gt;Ananda Dhakal (Patchstack)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;XSS through Imgur embeds&lt;/td&gt;
&lt;td&gt;A Contributor+ account, and someone viewing the post&lt;/td&gt;
&lt;td&gt;Zhengyu Liu, Jingcheng Yang, Gavin Zhong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Forgeable &lt;code&gt;{status}_{type}&lt;/code&gt; hook names&lt;/td&gt;
&lt;td&gt;A plugin that saves unchecked post statuses or post types&lt;/td&gt;
&lt;td&gt;Alex Concha (WordPress security team)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The credits come from the &lt;a href="https://wordpress.org/news/2026/10/wordpress-7-1-3-maintenance-and-security-release/" rel="noopener noreferrer"&gt;release announcement&lt;/a&gt;: three of the seven reports came from Anthropic and one from Trail of Bits working with OpenAI. The 7.1.1 credits also name Anthropic (twice) and pwn.ai. Three security releases in 19 days is a fast pace for WordPress, and the security team is shipping fixes as reports arrive rather than holding them for one big release.&lt;/p&gt;

&lt;p&gt;A quick glossary for the terms below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;XSS (cross-site scripting):&lt;/strong&gt; someone gets their own JavaScript to run in another person's browser on your site. If that person is an admin, the script can act as the admin. "Stored" means the script is saved in your database and waits there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQL injection:&lt;/strong&gt; text an attacker controls ends up inside a database query and changes what the query does. "Second-order" means the bad value is stored first, looks harmless, and only causes trouble when WordPress reuses it later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Denial of service (DoS):&lt;/strong&gt; making the server spend its resources on something useless, so the site slows down or stops answering.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Stored XSS on the Comments screen (pending comments)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In plain words:&lt;/strong&gt; a comment waiting in your moderation queue could carry a booby-trapped link. If a moderator interacted with it on the Comments screen, script could run in the moderator's browser, with the moderator's permissions. Comments wait in that queue for exactly the people who can approve them, so the target is always a trusted user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was exposed:&lt;/strong&gt; sites running 7.1.0 to 7.1.2 with comments on. Before 7.1, a visitor's comment couldn't carry the markup this needed. WordPress 7.1 started letting comments keep a &lt;code&gt;class&lt;/code&gt; attribute on &lt;code&gt;span&lt;/code&gt; tags, so @mentions in Notes (the comments you leave on blocks in the editor) display properly; that's &lt;code&gt;_wp_kses_allow_note_mention_span()&lt;/code&gt; in &lt;code&gt;kses.php&lt;/code&gt;. Older branches got the same hardening anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in the code:&lt;/strong&gt; the click handler for the contextual Help tabs in &lt;code&gt;wp-admin/js/common.js&lt;/code&gt; passed a link's &lt;code&gt;href&lt;/code&gt; straight to jQuery's &lt;code&gt;$()&lt;/code&gt;. jQuery treats any string that looks like HTML as HTML to build, not as a selector to look up. 7.1.3 changes one line to &lt;code&gt;$( document ).find( link.attr('href') )&lt;/code&gt;, and &lt;code&gt;.find()&lt;/code&gt; only accepts selectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; update. If you have a big pending queue from before the update, it's fine to moderate it after updating; the patched handler no longer builds HTML from those links.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Denial of service in &lt;code&gt;WP_Http::make_absolute_url()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In plain words:&lt;/strong&gt; WordPress has a helper that turns relative links (like &lt;code&gt;../image.png&lt;/code&gt;) into full addresses. Certain malformed paths sent it into a loop that never ended, tying up a server process. A logged-in writer could reach it through the editor's link previews, which fetch the page you're linking to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was exposed:&lt;/strong&gt; sites with Contributor or higher accounts held by people you don't fully trust, such as open registration with writer roles or guest-post programs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in the code:&lt;/strong&gt; in &lt;code&gt;wp-includes/class-wp-http.php&lt;/code&gt;, the loop that strips &lt;code&gt;folder/../&lt;/code&gt; pairs now counts how many replacements each pass made, and stops when a pass changes nothing. On older branches (before 5.9) the same class lives in &lt;code&gt;class-http.php&lt;/code&gt; and got the same fix. We ran six ordinary relative URLs through the function on 7.1.2 and 7.1.3, and the results were identical, so normal link handling is unchanged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; update. Review who has writer accounts while you're at it (see the &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#checklist" rel="noopener noreferrer"&gt;checklist&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Second-order SQL injection in the WXR export
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In plain words:&lt;/strong&gt; WordPress's export tool (&lt;strong&gt;Tools &amp;gt; Export&lt;/strong&gt;) builds a list of featured-image IDs from each post's settings and drops them into a database query. It trusted that those IDs were numbers. If a non-number had already been stored there, through a buggy plugin or another weakness, the export could run an altered query when an administrator exported content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was exposed:&lt;/strong&gt; two things had to line up: a bad &lt;code&gt;_thumbnail_id&lt;/code&gt; value already sitting in your database, and an administrator exporting a single content type. The default "All content" export doesn't reach this code. The code itself dates from WordPress 6.5.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in the code:&lt;/strong&gt; &lt;code&gt;wp-admin/includes/export.php&lt;/code&gt; now runs &lt;code&gt;absint()&lt;/code&gt; (force to a whole number of zero or more) on the thumbnail IDs, on the merged list of post IDs, and again right before each batch of 20 IDs goes into the &lt;code&gt;WHERE ID IN (...)&lt;/code&gt; query. That's three layers for one bug, which is the security team being deliberately cautious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; update. Exports keep working; a single-type export on our 7.1.3 test site completed normally. If you move content between sites often, our guide on &lt;a href="https://letsknowtech.com/how-to-export-posts-with-media-featured-image-from-a-wordpress-site/" rel="noopener noreferrer"&gt;exporting posts with their media and featured images&lt;/a&gt; still applies unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Authors could make posts sticky
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In plain words:&lt;/strong&gt; a sticky post is pinned to the top of your blog's front page, and on default WordPress roles that's an Editor's decision. Through the REST API, an Author could pin their own posts anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was exposed:&lt;/strong&gt; sites with Author accounts. The impact is mostly editorial: someone can push their post to the top of your home page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in the code:&lt;/strong&gt; in &lt;code&gt;class-wp-rest-posts-controller.php&lt;/code&gt;, the sticky check refused a request only when the user lacked &lt;em&gt;both&lt;/em&gt; &lt;code&gt;edit_others_posts&lt;/code&gt; and &lt;code&gt;publish_posts&lt;/code&gt;. Authors have &lt;code&gt;publish_posts&lt;/code&gt;, so they passed. The fix changes "and" to "or": now a user missing &lt;em&gt;either&lt;/em&gt; capability is refused. On updates, the check only runs when the request actually changes the sticky value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we saw:&lt;/strong&gt; Authors' editing screen doesn't change at all. The block editor never showed them the "Stick to the top of the blog" toggle, because the REST API's &lt;code&gt;action-sticky&lt;/code&gt; link already required both capabilities, even in 7.1.2. On 7.1.3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An Author setting sticky on their own post gets &lt;code&gt;403 rest_cannot_assign_sticky: Sorry, you are not allowed to make posts sticky.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;An Editor can still make any post sticky.&lt;/li&gt;
&lt;li&gt;An Author can still edit a post that an Editor made sticky (the save goes through and the post stays sticky).&lt;/li&gt;
&lt;li&gt;An Author can't unstick it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; nothing, unless you have a custom app or script that lets Authors pin posts. That will now fail with the error above. Have an Editor pin posts, rather than giving Authors &lt;code&gt;edit_others_posts&lt;/code&gt;, which would let them edit everyone's posts.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Comments on private and unpublished posts readable without logging in (CVE-2026-66666)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In plain words:&lt;/strong&gt; every post has a comment feed (an RSS feed of its comments). For private or unpublished posts, WordPress loaded the comments &lt;em&gt;before&lt;/em&gt; checking whether the visitor was allowed to see the post. It then hid the post, but the comments were already loaded, and the feed printed them for anyone who asked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was exposed:&lt;/strong&gt; any site where private, draft or scheduled posts have comments. That's more common than it sounds: internal notes left as comments, client feedback on a draft, or comments left before a post was made private. It's tracked as &lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-66666" rel="noopener noreferrer"&gt;CVE-2026-66666&lt;/a&gt;, rated 6.9 (Medium) on CVSS 4.0. The CVE record lists 6.6 through 7.1.2 as the affected versions. WordPress still shipped the same code change to every older branch down to 4.7, so a site on, say, 6.2 gets it as well, whether or not that branch could actually be attacked this way. It isn't in CISA's list of exploited vulnerabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in the code:&lt;/strong&gt; in &lt;code&gt;wp-includes/class-wp-query.php&lt;/code&gt;, the 37-line block that queries a single post's comment feed moved below the post-status check in &lt;code&gt;get_posts()&lt;/code&gt;. Nothing in it changed; it just runs after WordPress decides whether you can see the post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we saw:&lt;/strong&gt; on 7.1.3, a public post's comment feed still lists its comments, and a private post's feed returns no comments to a logged-out visitor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; update. If private posts on your site hold sensitive comments, assume anything public-facing before the update could have been read, and judge whether that matters for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. XSS through Imgur embeds
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In plain words:&lt;/strong&gt; when you paste a link from YouTube, Spotify or another supported site, WordPress asks that site for the embed code. For a short list of trusted providers, WordPress inserts that code as it arrives. Everyone else's code is cut down to a sandboxed frame first. Imgur was on the trusted list, and its embed code includes text from the person who uploaded the image, so whatever that person wrote could end up on your page unfiltered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was exposed:&lt;/strong&gt; sites where Contributors or higher can publish embeds, and the readers of those posts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in the code:&lt;/strong&gt; &lt;code&gt;wp-includes/class-wp-oembed.php&lt;/code&gt; removes Imgur from the provider list. The file's own table of retired providers now lists Imgur as removed in 7.1.3, alongside Someecards (see the &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#bug-fixes" rel="noopener noreferrer"&gt;bug fixes&lt;/a&gt;). WordPress.org's Embeds help page still lists Imgur as supported; it hasn't caught up with the code yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we saw:&lt;/strong&gt; this is the one change your readers will notice, so we tested it closely.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On 7.1.2, an &lt;code&gt;imgur.com/a/...&lt;/code&gt; album link in an Embed block showed Imgur's full card, with its script loaded from Imgur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After updating, the old card kept showing.&lt;/strong&gt; WordPress stores embed code in the post's metadata, and the update doesn't touch it. It survived re-saving the post, and it survived even when we backdated the cache by ten days and re-saved.&lt;/li&gt;
&lt;li&gt;After clearing the post's embed cache, the post showed the bare Imgur address as plain text: not an embed, and not even a clickable link. A plain Imgur URL on its own line in a classic-editor post did the same.&lt;/li&gt;
&lt;li&gt;In the block editor, the Embed block now says "Sorry, this content could not be embedded." and offers &lt;strong&gt;Convert to link&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Links in the &lt;code&gt;imgur.com/gallery/...&lt;/code&gt; form, which is what Imgur's address bar shows, already failed to embed on 7.1.2, because Imgur's own embed service no longer answers for them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F03ktyc0ol6uox08us4wo.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F03ktyc0ol6uox08us4wo.webp" alt="The block editor on WordPress 7.1.3 showing an Imgur Embed block with the message Sorry, this content could not be embedded, and two buttons: Try again and Convert to link" width="800" height="432"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;An Imgur Embed block after the update. Convert to link turns it into a normal link readers can click.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Imgur also cut off visitors from the UK in September 2025, so UK readers had already been seeing blank Imgur embeds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; update, then clear the embed cache for posts that use Imgur and replace those embeds. The &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#checklist" rel="noopener noreferrer"&gt;checklist&lt;/a&gt; has the exact steps.&lt;/p&gt;
&lt;h3&gt;
  
  
  7. Forgeable &lt;code&gt;{status}_{type}&lt;/code&gt; hook names
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In plain words:&lt;/strong&gt; when a post changes status (say, from draft to published), WordPress announces it to plugins with named "hooks" built from the status and post type, such as &lt;code&gt;publish_post&lt;/code&gt; or &lt;code&gt;draft_to_publish&lt;/code&gt;. Some unrelated core hooks follow the same naming pattern. If a plugin saved a post with a status nobody had registered, the generated name could match one of those unrelated hooks and set off code meant for something else entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was exposed:&lt;/strong&gt; only sites with a plugin that passes unchecked statuses or post types into &lt;code&gt;wp_insert_post()&lt;/code&gt;. Default WordPress doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in the code:&lt;/strong&gt; &lt;code&gt;wp_transition_post_status()&lt;/code&gt; in &lt;code&gt;wp-includes/post.php&lt;/code&gt; now fires &lt;code&gt;{$old_status}_to_{$new_status}&lt;/code&gt; only when the new status is registered and the old one is registered (or is &lt;code&gt;new&lt;/code&gt;), and fires &lt;code&gt;{$new_status}_{$post_type}&lt;/code&gt; only when the new status and the post type are both registered. The general &lt;code&gt;transition_post_status&lt;/code&gt; hook still fires every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; site owners: just update. Developers: read the &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#developers" rel="noopener noreferrer"&gt;developer notes&lt;/a&gt;. This one can change how your plugin behaves.&lt;/p&gt;
&lt;h2&gt;
  
  
  The 4 bug fixes
&lt;/h2&gt;

&lt;p&gt;Two of these fix problems people hit after updating to 7.0 or 7.1. The other two update WordPress's list of embed providers.&lt;/p&gt;
&lt;h3&gt;
  
  
  Image uploads could fail with a fatal error (missing PHP DOM extension)
&lt;/h3&gt;

&lt;p&gt;WordPress 7.0 added a feature that reads alt text embedded in an image's metadata when you upload it. That code used PHP's DOM extension without checking it was installed. On hosts without it, uploading an image stopped with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PHP Fatal error:  Uncaught Error: Class "DOMDocument" not found in .../wp-admin/includes/image.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WordPress lists the DOM extension as recommended, not required, and nearly every host has it, so this was rare. The code shipped in 7.0 and went 134 days before the first report (&lt;a href="https://core.trac.wordpress.org/ticket/66221" rel="noopener noreferrer"&gt;Trac #66221&lt;/a&gt;). For the sites it hit, though, it stopped all image uploads. In 7.1.3, &lt;code&gt;wp_get_image_alttext()&lt;/code&gt; returns empty alt text when DOM isn't available, and the upload continues.&lt;/p&gt;

&lt;p&gt;To check whether your host has the extension, go to &lt;strong&gt;Tools &amp;gt; Site Health&lt;/strong&gt;. If it's missing, Site Health shows "One or more recommended modules are missing". Ask your host to enable &lt;code&gt;dom&lt;/code&gt;; other features use it too.&lt;/p&gt;

&lt;p&gt;Note that &lt;strong&gt;7.0.7 doesn't include this fix&lt;/strong&gt;. The 7.0 backport carries only the security fixes, so sites without the DOM extension need 7.1.3.&lt;/p&gt;

&lt;h3&gt;
  
  
  The toolbar site icon could show up huge
&lt;/h3&gt;

&lt;p&gt;WordPress 7.1 added your site icon to the admin toolbar, sized with just a width and a height. Many themes and plugins have rules like &lt;code&gt;img { width: auto !important; height: auto !important; }&lt;/code&gt;, which override those, so the icon rendered at the size of the image file and covered part of the page. People reported it on Divi and other themes (&lt;a href="https://core.trac.wordpress.org/ticket/65912" rel="noopener noreferrer"&gt;Trac #65912&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;7.1.3 adds matching minimum and maximum sizes and a more specific selector (&lt;code&gt;img.site-icon&lt;/code&gt;) in &lt;code&gt;admin-bar.css&lt;/code&gt;. In our test with that exact theme rule, the icon measured &lt;strong&gt;150 × 150 px on 7.1.2&lt;/strong&gt; and &lt;strong&gt;20 × 20 px on 7.1.3&lt;/strong&gt; (28 × 28 px on a 390 px-wide phone screen). If you added custom CSS to work around this after 7.1, you can remove it now.&lt;/p&gt;

&lt;h3&gt;
  
  
  ReverbNation embeds work again
&lt;/h3&gt;

&lt;p&gt;ReverbNation moved its site and embed service to &lt;code&gt;legacy.reverbnation.com&lt;/code&gt;, and the old address returns "404 Not Found", so embeds of artist and song pages had stopped working (&lt;a href="https://core.trac.wordpress.org/ticket/66079" rel="noopener noreferrer"&gt;Trac #66079&lt;/a&gt;). On 7.1.2, a &lt;code&gt;www.reverbnation.com/artist&lt;/code&gt; link didn't embed at all in our test. On 7.1.3 it embeds the player again. Links that already used &lt;code&gt;legacy.reverbnation.com&lt;/code&gt; worked before through WordPress's generic embed support, and still do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Someecards embeds removed
&lt;/h3&gt;

&lt;p&gt;Someecards' embed service returns a 404, and its pages no longer advertise one, so 7.1.3 removes &lt;code&gt;someecards.com&lt;/code&gt; and &lt;code&gt;some.ly&lt;/code&gt; from the provider list (&lt;a href="https://core.trac.wordpress.org/ticket/66078" rel="noopener noreferrer"&gt;Trac #66078&lt;/a&gt;). Those links were already failing, so nothing that worked before breaks.&lt;/p&gt;

&lt;p&gt;The 7.1.3 tag also includes some changes that never reach your site: trimmed automated-test runs for the 7.1 branch, a database health check for WordPress's Docker development setup, a test fix, and new unit tests for the alt-text function.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we saw when we updated a test site
&lt;/h2&gt;

&lt;p&gt;To see what 7.1.3 changes in practice, we installed WordPress 7.1.2 from the official download on a fresh test site, recorded how it behaved, updated it to 7.1.3 with WP-CLI, and ran the same checks again. The test site used PHP 8.2 and MariaDB 10.4 with the default theme, plus one extra rule that forces every image to its natural size, as some themes do.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq491e9onm922x1k5h566.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq491e9onm922x1k5h566.webp" alt="The same test page before and after the update. On WordPress 7.1.2 the toolbar site icon is 150 pixels wide and an Imgur album shows as a full embed card. On WordPress 7.1.3 the icon is 20 pixels and the Imgur link shows as plain text." width="800" height="678"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The same post before and after the update, with the embed cache cleared: the toolbar icon is back to 20 px, and the Imgur album is now plain text.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What we checked&lt;/th&gt;
&lt;th&gt;7.1.2&lt;/th&gt;
&lt;th&gt;7.1.3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The update itself&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Downloaded the 227 KB partial package; no database update needed; core checksums verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imgur album in an Embed block&lt;/td&gt;
&lt;td&gt;Full Imgur card, script from Imgur&lt;/td&gt;
&lt;td&gt;Cached card keeps showing until the embed cache is cleared, then plain text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toolbar site icon under a "natural size" theme rule&lt;/td&gt;
&lt;td&gt;150 × 150 px&lt;/td&gt;
&lt;td&gt;20 × 20 px (28 × 28 px on phones)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Author pins own post via the REST API&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Refused (403)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Author edits a post an Editor pinned&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Works, stays pinned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Post moved to a status nobody registered&lt;/td&gt;
&lt;td&gt;Both dynamic status hooks fire&lt;/td&gt;
&lt;td&gt;Neither fires; &lt;code&gt;transition_post_status&lt;/code&gt; still does&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publishing a post whose type isn't registered&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;new_to_publish&lt;/code&gt; and &lt;code&gt;publish_book&lt;/code&gt; fire&lt;/td&gt;
&lt;td&gt;Only &lt;code&gt;new_to_publish&lt;/code&gt; fires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReverbNation &lt;code&gt;www&lt;/code&gt; artist link&lt;/td&gt;
&lt;td&gt;No embed&lt;/td&gt;
&lt;td&gt;Embeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relative-URL resolution (6 normal cases)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Identical to 7.1.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public post comment feed&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single-type export&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Works&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing else on the test site changed. The one change you'll see on a real site is the Imgur one, and only once the cache is cleared.&lt;/p&gt;
&lt;h2&gt;
  
  
  For developers: what could affect your code
&lt;/h2&gt;

&lt;p&gt;Most of 7.1.3 is invisible to plugin and theme code. Five changes are worth checking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Dynamic status hooks need registered statuses and post types.&lt;/strong&gt; If your plugin stores posts with a custom status like &lt;code&gt;in_review&lt;/code&gt; but never calls &lt;code&gt;register_post_status()&lt;/code&gt;, hooks like &lt;code&gt;draft_to_in_review&lt;/code&gt; and &lt;code&gt;in_review_post&lt;/code&gt; no longer fire. The same goes for &lt;code&gt;{status}_{type}&lt;/code&gt; when your post type isn't registered at the moment the status changes, for example while your plugin is inactive or if it registers the type late. In our test, the same transition fired both hooks again as soon as the status was registered. The fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;register_post_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'in_review'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'label'&lt;/span&gt;                     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;_x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'In review'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'post status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'my-plugin'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'public'&lt;/span&gt;                    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'internal'&lt;/span&gt;                  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'show_in_admin_status_list'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'label_count'&lt;/span&gt;               &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;_n_noop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'In review &amp;lt;span class="count"&amp;gt;(%s)&amp;lt;/span&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'In review &amp;lt;span class="count"&amp;gt;(%s)&amp;lt;/span&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'my-plugin'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you can't register the status, listen on &lt;code&gt;transition_post_status&lt;/code&gt; instead. It still fires for every change and passes the new status, the old status and the post:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'transition_post_status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$new_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$old_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'in_review'&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;$new_status&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s1"&gt;'in_review'&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nv"&gt;$old_status&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Same job your draft_to_in_review callback used to do.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. The REST sticky check is stricter.&lt;/strong&gt; Changing &lt;code&gt;sticky&lt;/code&gt; now needs both &lt;code&gt;edit_others_posts&lt;/code&gt; and &lt;code&gt;publish_posts&lt;/code&gt;. If your app sends the whole post object back on save, it's fine: on updates, a &lt;code&gt;sticky&lt;/code&gt; value that matches the post's current state isn't checked. If it sends &lt;code&gt;sticky: true&lt;/code&gt; on create for Author-level users, expect &lt;code&gt;rest_cannot_assign_sticky&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Imgur is no longer a built-in oEmbed provider.&lt;/strong&gt; &lt;code&gt;wp_oembed_get()&lt;/code&gt; returns &lt;code&gt;false&lt;/code&gt; for Imgur URLs, and the editor's &lt;code&gt;/oembed/1.0/proxy&lt;/code&gt; endpoint returns &lt;code&gt;404 oembed_invalid_url&lt;/code&gt;. Don't re-add Imgur with &lt;code&gt;wp_oembed_add_provider()&lt;/code&gt; as a trusted provider; that's the exact hole that was closed. Cached results stay in &lt;code&gt;_oembed_*&lt;/code&gt; post meta and &lt;code&gt;oembed_cache&lt;/code&gt; posts until cleared. On the front end, WordPress serves post-meta embed caches without checking their age, so they never refresh on their own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Help-tab links are treated as selectors.&lt;/strong&gt; The handler in &lt;code&gt;common.js&lt;/code&gt; now uses &lt;code&gt;$( document ).find( href )&lt;/code&gt;. If your plugin adds contextual Help tabs with &lt;code&gt;WP_Screen::add_help_tab()&lt;/code&gt;, nothing changes; the generated &lt;code&gt;#tab-panel-…&lt;/code&gt; links are plain ID selectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Comment-feed queries run later in &lt;code&gt;WP_Query::get_posts()&lt;/code&gt;.&lt;/strong&gt; The &lt;code&gt;comment_feed_join&lt;/code&gt;, &lt;code&gt;comment_feed_where&lt;/code&gt;, &lt;code&gt;comment_feed_groupby&lt;/code&gt;, &lt;code&gt;comment_feed_orderby&lt;/code&gt; and &lt;code&gt;comment_feed_limits&lt;/code&gt; filters now run after the single-post status check instead of before it, with the same arguments. For a post the visitor isn't allowed to see, they no longer run at all. If you use those filters to log or count comment-feed requests, expect fewer calls.&lt;/p&gt;

&lt;p&gt;Also changed but behavior-neutral for valid input: &lt;code&gt;WP_Http::make_absolute_url()&lt;/code&gt; stops its cleanup loop when a pass changes nothing, and &lt;code&gt;export_wp()&lt;/code&gt; casts every post ID with &lt;code&gt;absint()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Every file 7.1.3 changes
&lt;/h3&gt;

&lt;p&gt;These are all 15 files that differ between the 7.1.2 and 7.1.3 downloads. Nothing was added or removed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;What changed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;wp-admin/js/common.js&lt;/code&gt; and &lt;code&gt;common.min.js&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Help-tab click handler uses &lt;code&gt;$( document ).find()&lt;/code&gt; (fix 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-includes/class-wp-http.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;make_absolute_url()&lt;/code&gt; loop exits when nothing is replaced (fix 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-admin/includes/export.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;absint()&lt;/code&gt; on thumbnail IDs, merged IDs and each query batch (fix 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sticky check needs both capabilities; on update, only when the value changes (fix 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-includes/class-wp-query.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Comment-feed query moved after the post-status check (fix 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-includes/class-wp-oembed.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Imgur and Someecards removed, ReverbNation endpoint moved to &lt;code&gt;legacy.reverbnation.com&lt;/code&gt; (fix 6 and two bug fixes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-includes/post.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dynamic status hooks fire only for registered statuses and post types (fix 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-admin/includes/image.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;wp_get_image_alttext()&lt;/code&gt; returns early without &lt;code&gt;DOMDocument&lt;/code&gt; (bug fix)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;wp-includes/css/admin-bar.css&lt;/code&gt;, &lt;code&gt;admin-bar.min.css&lt;/code&gt;, &lt;code&gt;admin-bar-rtl.css&lt;/code&gt;, &lt;code&gt;admin-bar-rtl.min.css&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Toolbar site icon gets min/max sizes and an &lt;code&gt;img.site-icon&lt;/code&gt; selector (bug fix)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-admin/about.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"Maintenance and Security Releases" note for 7.1.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wp-includes/version.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$wp_version = '7.1.3'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Still on 7.1.0, 7.1.1 or 7.1.2? What you're missing
&lt;/h2&gt;

&lt;p&gt;7.1.3 is the third security release since WordPress 7.1 "Mary Lou" came out on August 19, 2026. Updates are cumulative, so updating to 7.1.3 gets you everything below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;What it fixed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://wordpress.org/news/2026/09/wordpress-7-1-1-maintenance-and-security-release/" rel="noopener noreferrer"&gt;7.1.1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sep 17, 2026&lt;/td&gt;
&lt;td&gt;11 security fixes, 17 core bug fixes and 19 block editor bug fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://wordpress.org/news/2026/09/wordpress-7-1-2-release/" rel="noopener noreferrer"&gt;7.1.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sep 22, 2026&lt;/td&gt;
&lt;td&gt;1 critical security fix (CVE-2026-87902)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://wordpress.org/news/2026/10/wordpress-7-1-3-maintenance-and-security-release/" rel="noopener noreferrer"&gt;7.1.3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Oct 6, 2026&lt;/td&gt;
&lt;td&gt;7 security fixes, 4 bug fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's &lt;strong&gt;19 security fixes&lt;/strong&gt; in three releases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're on 7.1.2,&lt;/strong&gt; you need only the seven fixes on this page. Your update is a 227 KB download.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're on 7.1.1,&lt;/strong&gt; you're also missing the 7.1.2 fix, and that's the serious one. CVE-2026-87902 let a visitor who isn't logged in make WordPress load a PHP file from outside the theme folder when it picks a page template. With the right server and theme conditions, that becomes remote code execution: an attacker running their own code on your server. WordPress rated it critical (9.2 on CVSS 4.0). And it's being used: the US Cybersecurity and Infrastructure Security Agency (CISA) added it to its &lt;a href="https://www.cisa.gov/known-exploited-vulnerabilities-catalog" rel="noopener noreferrer"&gt;Known Exploited Vulnerabilities catalog&lt;/a&gt; (search for CVE-2026-87902) on September 25, 2026, three days after the fix, which means there's evidence of real attacks. Your update is 236 KB.&lt;/p&gt;

&lt;p&gt;If a site of yours sat on 7.1.0 or 7.1.1 after late September, don't stop at updating. Check it for signs of a break-in: admin accounts you don't recognize, PHP files in &lt;code&gt;wp-content/uploads&lt;/code&gt;, and core files that fail &lt;code&gt;wp core verify-checksums&lt;/code&gt;. Our &lt;a href="https://letsknowtech.com/wordpress-security-checklist/#hacked" rel="noopener noreferrer"&gt;security checklist&lt;/a&gt; has the full clean-up order if you find something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're still on 7.1.0,&lt;/strong&gt; you're missing all 19, including a stored XSS that a visitor could plant through a comment (fixed in 7.1.1). Your partial update is about 9 MB, because it also carries 7.1.1's bug fixes.&lt;/p&gt;

&lt;p&gt;If a site has been stuck on an old 7.1 release, check why. Usually it's automatic updates being off, a host that holds updates back, or &lt;code&gt;wp-config.php&lt;/code&gt; settings such as &lt;code&gt;AUTOMATIC_UPDATER_DISABLED&lt;/code&gt; or &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt;. Our &lt;a href="https://letsknowtech.com/wordpress-security-checklist/" rel="noopener noreferrer"&gt;WordPress security checklist&lt;/a&gt; covers how to set automatic updates so security releases arrive on their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Older WordPress versions and backports
&lt;/h2&gt;

&lt;p&gt;Only the newest WordPress version is actively supported. As a courtesy, the security team backports security fixes to older branches, currently all the way back to 4.7. The 7.1.3 backports all shipped on October 6, 2026, the same day as 7.1.3. The announcement said they were "in progress" when it went out, but every branch has its release now.&lt;/p&gt;

&lt;p&gt;We checked each branch's code changes to see which fixes it actually received:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you're on…&lt;/th&gt;
&lt;th&gt;Update to…&lt;/th&gt;
&lt;th&gt;Security fixes included&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;7.0.x&lt;/td&gt;
&lt;td&gt;7.0.7&lt;/td&gt;
&lt;td&gt;All 7 (but none of the 4 bug fixes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.9.x&lt;/td&gt;
&lt;td&gt;6.9.10&lt;/td&gt;
&lt;td&gt;All 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.8.x&lt;/td&gt;
&lt;td&gt;6.8.11&lt;/td&gt;
&lt;td&gt;All 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.7.x&lt;/td&gt;
&lt;td&gt;6.7.10&lt;/td&gt;
&lt;td&gt;All 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.6.x&lt;/td&gt;
&lt;td&gt;6.6.10&lt;/td&gt;
&lt;td&gt;All 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.5.x&lt;/td&gt;
&lt;td&gt;6.5.13&lt;/td&gt;
&lt;td&gt;All 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.4.x down to 4.7.x&lt;/td&gt;
&lt;td&gt;6.4.13, 6.3.13, 6.2.14, 6.1.15, 6.0.17, 5.9.19, 5.8.18, 5.7.20, 5.6.22, 5.5.23, 5.4.24, 5.3.26, 5.2.29, 5.1.27, 5.0.30, 4.9.34, 4.8.33, 4.7.38&lt;/td&gt;
&lt;td&gt;6 of 7: the export fix isn't needed, because that code arrived in 6.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The full list of downloads is in the &lt;a href="https://wordpress.org/download/releases/" rel="noopener noreferrer"&gt;WordPress release archive&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A backport keeps an old branch from being trivially attackable, but that's all it does. Old branches don't get bug fixes, many plugins stop testing against them, and the older the branch, the older the PHP it was built for. If you're on 6.x or older, plan the move to 7.1 instead of relying on courtesy patches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moving from 7.0 (or older) to 7.1?&lt;/strong&gt; That's a feature update, not just a patch, so test it on a copy first. According to the &lt;a href="https://make.wordpress.org/core/2026/08/05/wordpress-7-1-field-guide/" rel="noopener noreferrer"&gt;WordPress 7.1 Field Guide&lt;/a&gt;, the changes most likely to affect existing sites are these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The post editor now always runs in an iframe, even when plugins add old-style meta boxes. Check plugins that add boxes, styles or scripts to the editor.&lt;/li&gt;
&lt;li&gt;jQuery UI is updated to 1.14.2. Check plugins that use jQuery UI widgets such as date pickers, sliders and dialogs.&lt;/li&gt;
&lt;li&gt;The toolbar now stays available on editor screens. Check plugins that add toolbar items.&lt;/li&gt;
&lt;li&gt;Some image processing can now happen in the browser before upload. Check image-optimization and upload plugins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to update to 7.1.3
&lt;/h2&gt;

&lt;p&gt;Take a backup first, or confirm your host's backup from today exists. Then pick whichever fits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatically.&lt;/strong&gt; Minor and security releases like this one install by themselves unless something turned that off. Go to &lt;strong&gt;Dashboard &amp;gt; Updates&lt;/strong&gt;. If it says you have the latest version, you're done. The footer of any admin page and &lt;strong&gt;Tools &amp;gt; Site Health &amp;gt; Info &amp;gt; WordPress&lt;/strong&gt; also show the version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From the dashboard.&lt;/strong&gt; &lt;strong&gt;Dashboard &amp;gt; Updates &amp;gt; Update to version 7.1.3&lt;/strong&gt;. It takes a few seconds. There's no database update step this time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With WP-CLI.&lt;/strong&gt; Over SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp core version          &lt;span class="c"&gt;# what you're on now&lt;/span&gt;
wp core update           &lt;span class="c"&gt;# updates to 7.1.3&lt;/span&gt;
wp core verify-checksums &lt;span class="c"&gt;# confirms every core file matches WordPress.org's copy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On our test site, &lt;code&gt;wp core update&lt;/code&gt; fetched &lt;code&gt;wordpress-7.1.3-partial-2.zip&lt;/code&gt; (the 227 KB patch for 7.1.2), and &lt;code&gt;wp core update-db&lt;/code&gt; confirmed the database was already current.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Many sites at once.&lt;/strong&gt; If you manage dozens of sites, use your management dashboard's bulk update, or loop WP-CLI over your sites with &lt;code&gt;wp core update&lt;/code&gt; and &lt;code&gt;wp core verify-checksums&lt;/code&gt;, then spot-check a few home pages. With three releases in 19 days, this is the month to set that up if you haven't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manually.&lt;/strong&gt; Download &lt;a href="https://wordpress.org/download/releases/" rel="noopener noreferrer"&gt;WordPress 7.1.3&lt;/a&gt;, replace the &lt;code&gt;wp-admin&lt;/code&gt; and &lt;code&gt;wp-includes&lt;/code&gt; folders and the root PHP files, and leave &lt;code&gt;wp-content&lt;/code&gt; and &lt;code&gt;wp-config.php&lt;/code&gt; alone. You won't need this unless automatic updates fail on your host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rolling back.&lt;/strong&gt; If something breaks, go back to 7.1.2 only for as long as it takes to fix the cause. You'd be reopening all seven holes.&lt;/p&gt;

&lt;h2&gt;
  
  
  After you update: a 10-minute checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Confirm the version.&lt;/strong&gt; &lt;strong&gt;Dashboard &amp;gt; Updates&lt;/strong&gt; should say 7.1.3 (or &lt;code&gt;wp core version&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify core files.&lt;/strong&gt; &lt;code&gt;wp core verify-checksums&lt;/code&gt; should report success. A failure means a core file differs from WordPress.org's copy; find out why before moving on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find posts that use Imgur.&lt;/strong&gt; In &lt;strong&gt;Posts &amp;gt; All Posts&lt;/strong&gt;, search for &lt;code&gt;imgur.com&lt;/code&gt; (do the same under Pages). With WP-CLI:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   wp post list &lt;span class="nt"&gt;--s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;imgur.com &lt;span class="nt"&gt;--post_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;any &lt;span class="nt"&gt;--fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ID,post_title
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clear their embed cache.&lt;/strong&gt; Re-saving the post doesn't do it; we tested that. Use WP-CLI:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;wp post list &lt;span class="nt"&gt;--s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;imgur.com &lt;span class="nt"&gt;--post_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;any &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ids&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;wp embed cache clear &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No WP-CLI? Open the post and replace the Imgur Embed block (next step). Once the Imgur address is no longer in the post, the cached code is never used again.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Replace the Imgur embeds.&lt;/strong&gt; If the image is yours or you have permission, upload it to your Media Library and use an Image block. Otherwise, use &lt;strong&gt;Convert to link&lt;/strong&gt; on the Embed block, so readers get a working link instead of a bare address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Purge your page cache and CDN.&lt;/strong&gt; Caching plugins and CDNs can keep serving the old Imgur card even after WordPress has dropped it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review writer accounts.&lt;/strong&gt; Three of the fixes involve Contributors and Authors. List them under &lt;strong&gt;Users&lt;/strong&gt; (filter by role), or with:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   wp user list &lt;span class="nt"&gt;--role__in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;author,contributor &lt;span class="nt"&gt;--fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user_login,user_email,roles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remove accounts nobody uses, and keep open registration on the Subscriber role.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check Site Health.&lt;/strong&gt; &lt;strong&gt;Tools &amp;gt; Site Health&lt;/strong&gt; will flag a missing DOM extension and other problems worth fixing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you build plugins,&lt;/strong&gt; search your code for &lt;code&gt;register_post_status&lt;/code&gt; and for hooks shaped like &lt;code&gt;*_to_*&lt;/code&gt; or &lt;code&gt;{status}_{post_type}&lt;/code&gt;, and run your tests against 7.1.3 (see &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#developers" rel="noopener noreferrer"&gt;developer notes&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete custom CSS that shrank the toolbar icon&lt;/strong&gt; after 7.1, if you added any. It's not needed now.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;WordPress 7.2 is scheduled for December 8, 2026&lt;/strong&gt;, according to the &lt;a href="https://make.wordpress.org/core/2026/10/06/wordpress-7-2-release-party-schedule/" rel="noopener noreferrer"&gt;release party schedule&lt;/a&gt; on the core team's blog. No 7.1.4 had been announced as of October 12.&lt;/p&gt;

&lt;p&gt;Given the pace of September and October, more 7.1.x security releases before 7.2 wouldn't be surprising. The practical defense is the same as always: leave automatic minor updates on, keep a recent backup, and follow the &lt;a href="https://wordpress.org/news/category/releases/" rel="noopener noreferrer"&gt;WordPress releases feed&lt;/a&gt; so you hear about the next one on the day it ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the latest version of WordPress?&lt;/strong&gt;&lt;br&gt;
WordPress 7.1.3, released October 6, 2026. WordPress.org's version check marks it as the latest and every earlier 7.1 release as insecure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is WordPress 7.1.3 safe to install?&lt;/strong&gt;&lt;br&gt;
Yes. It's a small security release with no database changes and no new requirements. The only visible change in our test was that Imgur embeds stop working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is WordPress 7.1 stable?&lt;/strong&gt;&lt;br&gt;
7.1 itself has had three security releases and plenty of bug fixes since August. On 7.1.3, there are no known regressions as of October 12, 2026. If you held back from 7.1 because of early issues like the oversized toolbar icon or the upload error on hosts without the DOM extension, both are fixed in 7.1.3. If you use WP Rocket, make sure it's on 3.23.2.2 or later before moving to 7.1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will 7.1.3 break my plugins or theme?&lt;/strong&gt;&lt;br&gt;
Very unlikely. The changes that could affect code are narrow: plugins that use unregistered custom post statuses, apps that let Authors set sticky posts through the REST API, and anything that depends on Imgur embeds. See the &lt;a href="https://letsknowtech.com/wordpress-7-1-3/#developers" rel="noopener noreferrer"&gt;developer notes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did my Imgur embeds stop working?&lt;/strong&gt;&lt;br&gt;
WordPress 7.1.3 removed Imgur from its trusted embed providers to close an XSS hole. Old embeds keep showing until their cache is cleared, then they show as plain text. Replace them with uploaded images or links (&lt;a href="https://letsknowtech.com/wordpress-7-1-3/#checklist" rel="noopener noreferrer"&gt;steps&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is anyone exploiting these vulnerabilities?&lt;/strong&gt;&lt;br&gt;
No exploitation has been reported for any of the seven, and the one with a CVE (CVE-2026-66666) isn't on CISA's Known Exploited Vulnerabilities list. The critical flaw fixed two weeks earlier in 7.1.2 (CVE-2026-87902) is on that list, though, so sites still on 7.1.0 or 7.1.1 are the ones at real risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the CVE numbers for WordPress 7.1.3?&lt;/strong&gt;&lt;br&gt;
So far only CVE-2026-66666, for the comments on private posts. The other six don't have CVE IDs or GitHub security advisories yet. Advisories for 7.1.1 appeared the day after that release, so these may follow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to update if I'm on WordPress 7.0?&lt;/strong&gt;&lt;br&gt;
You should at least be on 7.0.7, which has all seven security fixes. But 7.0.7 doesn't have the bug fixes, and 7.0 only gets security fixes now, so moving to 7.1.3 is the better choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does 7.1.3 change the database?&lt;/strong&gt;&lt;br&gt;
No. The database version stays 61833, so you won't see an "Update database" screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How big is the 7.1.3 update?&lt;/strong&gt;&lt;br&gt;
From 7.1.2 it's a 227 KB partial update: the 15 changed files, plus the updater and readme that every update package carries. From 7.1.1 it's 236 KB. From 7.1.0 it's about 9 MB. A fresh download is 37.2 MB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When is WordPress 7.2 coming out?&lt;/strong&gt;&lt;br&gt;
It's scheduled for December 8, 2026.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written with AI assistance from my own test notes; the fixes were run on real WordPress installs before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>php</category>
      <category>security</category>
    </item>
  </channel>
</rss>
