Added — A visual Data Picker to insert dynamic data into content blocks without writing expressions: search and pick a field, drill into related data, apply filters and operators, then insert — or place the caret inside an existing expression to edit it.
Added — Expression editing is now assisted: the HTML inspector and the condition, variable and query fields suggest the available data, filters and functions as you type, and colour each part of the expression.
Added — Argument values such as custom-field (meta) keys and image sizes are suggested as you fill them, in both the Data Picker and the code editors.
Fixed — Loop block: pagination did nothing when the loop inherited the main query and was given a name — clicking a page link kept showing the first page.
Fixed — Variable, Condition and Loop blocks: when placed inside a grid or other sized layout, the block's invisible anchor could be stretched by the surrounding CSS and take up space, breaking the layout.
Added — At-rules manager: nested CSS layer names (e.g. theme.base) are now supported and declared in the @layer order statement.
Improved — Editor UI: all controls, panels and the AI chat now share one refreshed design system, for consistent spacing, colors and typography across the plugin.
Fixed — Nested CSS rules (e.g. a &:hover state or a descendant selector inside another selector) were dropped or merged into the base state on the frontend; they now render correctly and match the editor preview.
Fixed — Media queries written inside nested rules were hoisted out of order on the frontend; they now stay in place and keep their source order, while top-level breakpoints remain flat for browser compatibility.
Fixed — Loop block: editing the query (e.g. the number of items) briefly wiped and reloaded every item in the editor; existing items now stay in place while the results update.
Added — Class names and IDs typed in the HTML inspector appear as chips in the CSS selectors panel and become a real selector on the first style edit.
Added — Rename a chip inline; if the new name matches an existing selector, it links to it instead of creating a duplicate.
Improved — Class names used in Twig expressions auto-load their matching selector's CSS without freezing the expression's editor-time value.
Fixed — Renaming a CSS selector cleanly updates every block using it.
Fixed — {{ site.option('field_name') }} now returns values from ACF Options Pages, including translated values when a multilingual plugin (WPML, Polylang Pro) is active.
Added — AI chat reliably completes complex multi-step requests (e.g. landing page with a generated hero image) on any AI provider and any model, including weaker or auto-routed ones that previously left the editor empty or partially built.
Improved — External AI tools connected via MCP (Claude Desktop, ChatGPT, etc.) can now build dynamic content (loops, conditions, {{ post.title }} and other data bindings) instead of being limited to static HTML.
Fixed — Simple AI edits (rename a title, remove a block, etc.) now run as a single faster request instead of triggering a wasted follow-up call.
Fixed — Fatal error on activation under PHP 8.1 caused by a true literal return type (PHP 8.2+ syntax) in the AI environment check.
Added — AI image generation respects requested aspect ratios (16:9, 4:3, 9:16, etc.) when supported by the provider; falls back transparently when the provider rejects the field (e.g., Google Imagen).
Added — unblock/ai/image/model_preference filter to override the model used for AI image generation (string or ordered fallback list).
Added — Plugin version badge in the Settings modal header for easier identification.
Fixed — AI chat losing its editor session due to a crash in the MCP session REST endpoints (mcp/session).
Fixed — AI-generated images missing the alt attribute in inserted HTML; the value was saved to the media library but not returned to the model.
Added — Inline data:image/* URIs (PNG, JPEG, GIF, WebP, AVIF, SVG) on <img>, <video poster>, <source>, and <track>.
Added — Editors and Authors can now use Unblock without manage_options. Settings moved to a dedicated unblock/v1/settings REST endpoint, filterable via unblock/settings/can_read and unblock/settings/can_write.
Fixed — SVG content and expression operators (>, <) preserved on save.
Fixed — Twig expressions ({{ ... }}) in block content no longer corrupted on save.
Fixed — SVG attribute casing (viewBox, preserveAspectRatio, etc.) and MathML's definitionURL preserved on save.
Added — unblock/form/client_ip filter for overriding the client IP used in form rate limiting (proxy support).
Added — Security regression tests for PostQuery type filtering and Processor timestamp validation.
Improved — AI chat shows a notice with a link to Settings → Connectors when no AI provider is configured, instead of letting the user send a message and get an error.
Improved — AI image generation errors are now reported to the model so it can explain the failure to the user.
Improved — Form rate limiting uses REMOTE_ADDR only; proxy setups use the new unblock/form/client_ip filter.
Improved — MCP sessions now store user_id and enforce ownership on register/deregister.
Improved — MCP command IDs use cryptographically secure UUIDs (wp_generate_uuid4) instead of uniqid.
Improved — File write permissions use FS_CHMOD_FILE (default 0644) instead of hardcoded 0755.
Improved — License update check uses POST instead of GET to keep license keys out of URLs and server logs.