Releases

Changelog.

What shipped in each plugin version, sourced directly from the plugin'sCHANGELOG.mdat build time.

v3.13.12 changes
  • 01FixedSaving an Elementor document could hang the site and fill the error log (#119, reported by @HopeItBuilds, fixed by @HafizMMoaz in #120). Opening or saving a document the builder had not yet converted, such as a Floating Buttons library item, sent the search indexer into a loop: reading the document made Elementor convert and save it, that save fired the indexer again, and it went round until PHP ran out of memory. Two requests produced a 22 MB error log. The indexer now refuses to re-enter itself.
  • 02FixedA page died with "There has been a critical error on this website" when a normal Elementor widget, such as a Heading, was given a dynamic value. The dynamic picker offered every source and the editor looked right, so the problem only appeared once a visitor loaded the page. Elementor stores a dynamic source by class name and rebuilds it when the page renders. 3.13.0 registered all seventeen sources as one shared class that was told which source it was when it was created, and that instruction was lost by the time Elementor rebuilt it, so rendering failed outright. Each source is now its own class, which is how Elementor's own dynamic sources are built, so a rebuilt source always knows what it is. No page content or setting was damaged: affected pages render correctly again as soon as you update, with nothing to redo. The block editor was never affected. Its bindings use a different mechanism and worked throughout.
v3.13.024 changesRead the blog
  • 01NewNine new Themer widgets, so a Single, Archive, Search or 404 template can actually be finished. Author Box, Post Navigation, Post Comments, Search Form, Sitemap, Post Info, Archive Posts, Featured Image and Post Excerpt. All free. Elementor charges for the equivalents; these are the pieces that were missing when you tried to build a real template and ran out of parts. Author Box shows the avatar, name, biography and links, with every part switchable. Post Navigation can stay within the same category, which is what makes it useful on a site with several content streams. Search Form is the one that makes a 404 page worth having. Sitemap lists whichever post types and taxonomies you choose. Post Info builds an ordered row of metadata: author, date, time, comment count, terms, or a custom field, in the order you list them. Archive Posts adds pagination. Author Box and Sitemap also ship as blocks, since the block editor has no equivalent. Comments, search and post navigation already exist as core blocks, so those are not duplicated.
  • 02NewThe EMCP Themer widgets sit at the top of the panel while you edit a theme template. The category used to land near the bottom, under everything else, which is the wrong place when the whole point of the screen is to build a template. On an ordinary page or post it stays where it was, and the widgets remain available there, since a sitemap, search form or posts grid is useful outside a template too.
  • 03NewPost Meta and Archive Loop are untouched. Post Info and Archive Posts are new widgets beside them, not replacements, so templates you have already built keep rendering exactly as they do now. Archive Loop is relabelled "Archive Posts (classic)" so the two are tellable apart in the panel.
  • 04NewNew "EMCP Modules" tab on the Tools screen. The WordPress tab had grown to 21 sections, about half of which were not WordPress management at all: the theme builder, backup and migrate, redirects, the change ledger, content search, the content mirror, the PHP snippet sandbox, project memory, and cloud sync. Those now have their own tab, so the WordPress tab means tools that drive WordPress itself and nothing else. Nothing changed about what any tool does or whether it is enabled.
  • 05NewThe Cloud and Marketplace tools now appear on the Tools screen too, in their own sections, along with Resize Media which moves from Stock & Media into an Image Optimization section of its own. Like the Themer tools, these registered and worked but were not listed anywhere, so they could not be toggled and were missing from every count.
  • 06NewThe nine EMCP Themer tools now appear on the Tools screen, in their own section under the WordPress tab. They have always registered and worked, but had no entry on that screen, so you could not see them, could not switch one off on its own, and they were missing from every tool count the plugin reports. All nine stay on by default, and the Modules tab toggle remains the single switch for the whole feature.
  • 07NewThemer templates can pull in live data, the way Elementor Pro's dynamic widgets do. A heading can show the post title, an image can show the featured image, a button can link to the post. Pick the source from the field itself rather than hunting for a special widget: in Elementor it appears in the dynamic picker on any field that accepts one, and in the block editor it binds to a Heading, Paragraph, Image, or Button. This works on free Elementor. Elementor ships the machinery for dynamic fields but none of the sources, so on a free install the picker is empty. EMCP fills it. Ten sources are free: post title, post excerpt, post URL, post date, post ID, featured image, archive title, site title, site logo, and the site description. Pro adds the sources that need configuring, plus a fallback value for when a field is empty: custom fields (ACF-aware), author name, bio, URL and avatar, and taxonomy terms.
  • 08NewConnected AI agents can build dynamic templates too. A new list-dynamic-sources tool tells an agent what is available and what each source produces, and the existing widget and block tools accept a binding alongside the usual settings. A binding that cannot work, such as an image source in a heading, is refused when the agent makes the call rather than rendering blank later.
  • 09NewFive sources that were missing. Post excerpt, post URL, post date and post ID are new. Featured image existed in the code but was never listed anywhere, so nothing could actually use it.
  • 10ChangedThe read-only database guard was rebuilt around a real tokenizer. The old design normalized a query into a plain string and then pattern-matched it, which meant a query only had to be read slightly differently from how MySQL reads it for something to slip through. Five review rounds found four such differences, three of which could expose data from the user table. The guard now splits a query into typed pieces and inspects those, so a table name inside quotes is a piece of text and a keyword inside quotes is a piece of text, whatever characters surround them. Anything it cannot account for is refused outright instead of guessed at, and a query is allowed only if it is safe under every way the server could read it. Some deliberately malformed or exotic queries that previously slipped through are now refused; ordinary reporting queries are unaffected.
  • 11FixedCodex and other command-line AI apps could not finish signing in, failing with "Invalid client or redirect URI". The app registered fine and got as far as the sign-in page, then the page refused it. The cause was the check on the return address the app comes back to. A command-line app listens on your own machine, and it can spell that machine three different ways (localhost, 127.0.0.1, ::1) on a port it picks fresh each run. The check accepted a changing port but insisted the spelling match exactly, so an app that registered one spelling and signed in with another was turned away even though both point at the same place. All three spellings are now treated as the same machine, and a trailing slash on the return path no longer counts as a difference. Return addresses that leave your machine, including every https one, are still matched exactly as before.
  • 12FixedThe sign-in error page now says which of the two things went wrong, the app not being recognised or its return address not matching, and shows the requested and registered addresses side by side. The old page reported both cases with one message, which left nothing to act on.
  • 13Fixed"Manage connected apps" did nothing when no apps were connected yet. The link pointed at a section that was only drawn once at least one app had connected, so it silently went nowhere at exactly the moment people click it, while a connection is failing. The section is now always present and explains that an app appears only after it finishes signing in.
  • 14SecurityQueries could hide a table name from the safety check. Several different tricks (a comment marker MySQL does not treat as a comment, a backslash in a text value, a column alias in backquotes, a name in double quotes) made the guard read a query differently from the database, so a query that looked harmless to the guard could still read the user table. All four are closed, and the guard is now built so this class of mistake fails safe rather than quietly allowing the query.
  • 15SecurityServer system tables are now off limits. The guard protected the WordPress user tables but not the database server's own account tables, so a query naming them directly went through. Reading mysql, information_schema, performance_schema, and sys is now refused.
  • 16SecurityAssigning a variable inside a read-only query is refused, since that changes state rather than reading it.
  • 17SecurityThe migration connector now requires a one-time pairing code (Pro). While an administrator had the pairing window open on a destination site, the connector accepted a pairing from anyone who could reach it, and the caller supplied their own signing key. Winning that window meant being able to push and restore an archive, which replaces the database and files. The destination now shows a one-time code when you arm pairing, you enter it on the source, and it is checked in constant time, used once, and rate limited. Pairing state is cleared on disarm, unpair, expiry, and success. Re-install the connector on any destination before your next migration; the new source and connector must both be on this version.
  • 18SecurityAI Chat approval now covers every destructive tool. The "require approval" setting checked a hand-maintained list of tool names that had fallen behind, so newer destructive tools (deleting redirects, blocks, theme templates, custom blocks, and the migrate/sync tools) could run without the approval prompt. Approval is now decided from each tool's own metadata, so it covers every destructive tool automatically, including future ones, and it fails closed if that metadata cannot be read.
  • 19SecurityAI Chat page fetching is now pinned to the address it validated. The fetcher checked that a hostname resolved to a public address, but the connection itself resolved the name again, so a hostile DNS server could answer with a public address for the check and an internal one for the connection, reaching things like cloud metadata. Each request, and each redirect hop, is now pinned to the validated address while still verifying the certificate for the original hostname.
  • 20SecurityRead-only database queries are now bounded in the database. Delay, lock, and benchmark functions (SLEEP, BENCHMARK, GET_LOCK and similar) are refused, and a server-side statement timeout is applied and restored. The row limit is enforced by the database rather than after fetching the whole result into memory: a query that carries no top-level limit of its own gets one, a query whose own limit is larger than the cap is refused instead of being silently rewritten, and a limit that only appears inside a subquery no longer counts as bounding the outer result.
  • 21SecurityPublic OAuth client registration is bounded. Registration stays open as the standard requires, but request size, client name length, and the number and length of redirect URIs are now capped before any database write. Repeated registrations from one caller are throttled by peer address (forwarded headers such as X-Forwarded-For are believed only from proxies you configure, so the throttle cannot be sidestepped by setting a header), and a hard ceiling on registrations that never complete sign-in bounds the table no matter where requests come from. Redirect URIs must be https with a real host, http on loopback, or an app's own private-use scheme: browser-executable and local-file schemes (javascript:, data:, file: and similar) and transport or messaging schemes (ftp:, mailto: and similar) are refused.
  • 22SecurityA hijacked connector pairing no longer survives the update (Pro). Because reinstalling plugin files does not remove settings stored in the database, a pairing created through the old unauthenticated route would have kept working after the connector was updated. Any pairing made before pairing codes existed is now refused immediately and deleted on the next load, and the destination tells the administrator to pair again.
  • 23SecurityPairing lockout no longer blocks the legitimate site. Failed pairing attempts are counted per caller rather than globally, so an outsider cannot spend the attempt budget and lock the real source site out of its own pairing window.
  • 24SecurityAI Chat page fetching refuses to fall back to an unpinned connection. On servers where the request would be routed through a transport that cannot pin the checked address, the fetch is cancelled rather than performed by hostname.
v3.12.31 change
  • 01FixedConnected AI apps kept reopening a sign-in page that failed with "Invalid client or redirect URI". Claude Desktop, ChatGPT, and other MCP clients would periodically pop open the OAuth page on their own, show that error, and never reconnect. The cause was housekeeping: the plugin deleted any registered app that currently had no tokens and was more than a day old, treating it as an abandoned registration. But an app whose tokens had simply lapsed (a refresh token expiring after 30 days idle, or anything else that cleared them) also has no tokens, so its registration was deleted while the app still had it saved. Every reconnect attempt then failed, permanently, because the app was asking about a registration the site had thrown away. An app that has completed sign-in once is now kept, so its tokens lapsing just means signing in again, the way it should. Only genuinely abandoned registrations that never completed sign-in are still cleaned up, and existing connections are protected automatically when you update. The error page also now tells you what to do if it ever appears (remove and re-add the connector) instead of being a dead end.
v3.12.25 changes
  • 01NewKadence blocks inserted by AI now auto-repair in the editor. Kadence blocks use a static JS save() the server cannot run, so blocks inserted through the tools rendered perfectly on the front end but showed "Attempt recovery" on every block in the editor. EMCP now runs that recovery automatically: when you open a post the AI added Kadence blocks to, the editor repairs each of them with its own recovery mechanism (regenerating the markup with Kadence's own save(), content preserved), shows a single notice, and one click on Update stores the clean markup for good. No more clicking "Attempt recovery" block by block. Other static-save block packs can opt in via the emcp_tools_block_repair_namespaces filter.
  • 02Fixeddetect-elementor-version failed on sites without Elementor Pro (#116). The tool declared its elementor_pro_version output as a string but returned null when Elementor Pro was not installed, and WordPress validates an ability's output against that schema, so the call errored out instead of answering. It now returns an empty string, matching how the core version already reports "not detected". This one bit every free-Elementor site, and detect-elementor-version is the first call an AI agent makes to decide which tools to use. Thanks to @Winsoftpedia for the report and the fix (#117).
  • 03FixedInserting a block at a position that does not exist silently lost the block. When add-block was given a position.path that did not resolve to a real block (a stale or miscounted index), the insert quietly did nothing, the post was saved unchanged, and the tool still reported success, so an AI believed the block was added when it was not. Every block pack (Kadence, Spectra, GenerateBlocks, Blocksy) now validates the position first and returns a clear invalid_position error naming the problem. The core Gutenberg tools already did this.
  • 04FixedOAuth sign-in failed on subdirectory installs (WordPress in a subfolder). On a site installed under a path such as example.com/gpt-build/, the OAuth discovery document that clients need (/.well-known/oauth-protected-resource, RFC 9728) returned 404, so connecting over OAuth from ChatGPT, Claude, or any standard MCP client dead-ended before it could get a token, and no tools appeared. The plugin advertised the correct subfolder URL but did not serve it there, because the request path was matched against the site-root path without accounting for the subdirectory. It now strips the install's home-path prefix before matching, so discovery works on subfolder installs and is unchanged on root installs.
  • 05Lower memory use on every front-end page view. The plugin used to load all ~180 of its PHP class files (about 10 MB) on every single request, including plain front-end page views that never touch the AI tools. The ~120 MCP ability classes and their supporting code (schema catalogs, guards, security and performance audits, and the theme/forms/SEO integrations) now load only when they are actually needed: an MCP request, the admin Tools screen, WP-CLI, or cron. A normal front-end page view now loads about 6 MB less per request, which gives sites on a 128 MB PHP memory limit real headroom and stops the out-of-memory crashes some hosts hit. The full tool surface is unchanged for every real MCP, admin, and CLI request, and a lazy fallback still loads everything the moment the Abilities API fires, so nothing is ever missing when a tool is called.
v3.12.11 change
  • 01NewUpload a local image into the Media Library (#115). A new upload-media tool takes a file's bytes as base64 straight from the client machine and adds it to the WordPress Media Library. It is the companion to sideload-image, which only fetches a URL the server can already reach: now you can ask your AI to upload an image from your own computer and it has a tool for it. Only WordPress-allowed file types are accepted (executable types are refused), with optional alt text, title, caption, description, and attachment to a post. Gated on upload_files, enabled by default, and it runs the same optimize/WebP pipeline as the other media tools.

Showing 5 of 67 releases