Added — History: the History tab of the Unblock manager lists the changes the editor, the AI chat and your AI client make to your pages, templates, CSS and settings, and undoes or redoes one change or a whole session. An undo never discards a later change unless you choose Undo Anyway. Settings > History sets how much is kept.
Added — Unblock AI: over MCP, your AI client lists its changes and undoes or redoes them when you ask; it asks you first when the undo changes a published page or a template.
Improved — Unblock AI: the CSS the AI writes on a draft copy now waits with the copy, shown in its preview, and goes live when the copy is applied, keeping what you changed meanwhile on the same selectors; it used to change every page at once.
Improved — Unblock AI: over MCP, your AI client reaches Unblock's other tools on the first try more often, and a refused call says which parameters the tool takes, so smaller models such as gpt-4.1-mini finish twice as many asks.
Changed — Dynamic data: get_posts({...}) with no posts_per_page now gives the number of posts set in Settings > Reading, as a Loop block does, instead of 10, and its found_posts and pagination count every post, where they gave 0.
Added — WPML and Polylang integration: the texts of Unblock blocks are translated with the page, their dynamic data kept in place; a translation keeps the JavaScript of its source page; the editor preview and the page's data follow the page's language.
Added — Yoast SEO, Rank Math, SEOPress and All in One SEO integration: they read Unblock pages as they show, so a page gets its description and share image from its content, Yoast SEO and Rank Math analyze it in the editor, and your AI client writes its SEO title and description over MCP.
Added — Unblock AI: claude.ai, ChatGPT and other AI clients connect over MCP once you approve them on your site, with no password to copy, with full or read-only access; the MCP tab lists them and disconnects each one.
Improved — Unblock AI: over MCP, your AI client builds a page in fewer requests and with about 40% fewer tokens: it sees Unblock's tools directly, knows your site's styles from the start, and each change answers with only the blocks it wrote.
Changed — Element block: the page no longer adds a space of its own between blocks, in loops and conditions too, so two links with no space between them in the HTML now touch, as in the editor.
Added — Settings: a Privacy category opens private data to expressions: users' email, username, roles, registration date and chosen meta keys, the admin email, the roles loops may list, and the post types hidden from the public.
Improved — Pages, the admin and the REST API load faster: Unblock loads less code and runs fewer queries on each request.
Changed — Privacy: users' email, username, roles, registration date and meta, the admin email, and the posts of post types hidden from the public show nothing until opened in Settings > Privacy; a user still sees their own, and user fields made with ACF, Meta Box, Pods or JetEngine stay public.
Changed — Custom fields: images, files, posts, terms and users now come as the field plugin returns them, as in Timber; add {transform_value: true} to get objects you can chain, dates included, whatever the field's format: post.meta('hero', {transform_value: true}).src('medium'). The unblock/data/meta_transform_value filter turns it on for the whole site.
Fixed — Security: expressions could show private data: users' password hashes and emails, other users' editor preferences, password fields of ACF and Meta Box, options pages included, commenters' emails and IP addresses, or a file's server path.
Added — Loop block: {% for key, value in … %} gives each item's key along with its value, as in Twig.
Changed — Loop block: a loop over an object now gives each value directly, as in Twig; use {% for key, value in … %} instead of item.key and item.value.
Improved — AI: loops, conditions and variables can now be targeted like any other block, to move them, remove them or rewrite their content.
Improved — AI: over MCP, when the editor tab is paused or closed, the assistant is told right away and can ask you to bring it back, instead of waiting for a vague timeout.
Fixed — Security: a user allowed to edit posts could run PHP functions on the server through the list filters of a dynamic expression.
Added — Library: a new toolbar button opens a catalogue of ready-made blocks, patterns and templates; browse by library, type and category, preview at desktop, tablet or mobile size, then insert.
Added — Library: save a selection of blocks as a pattern or a template from the block menu (Save to library), filed in a library and a category you create as you go and rename or delete from the sidebar.
Added — Library: inserting a pattern brings the styles it needs, in a single undo step; the classes, variables and at-rules you already have are reused, never overwritten.
Added — Library: share your libraries with other sites running Unblock through access tokens, each opening the libraries you choose, and connect the sites you were given a token for.
Improved — Editor: the selected breakpoint now follows the actual canvas width when resizing or switching device, so every breakpoint can be reached; some tablet breakpoints could never be selected by resizing before.
Added — WooCommerce: product fields such as price, SKU, stock, attributes and galleries can now be inserted from the data picker when editing a product, a product template, or a loop over products.
Improved — Data picker: search now ranks the current level's fields so the one you want is at the top and the list stays short, points to the sources a nested field lives in, and lets you type a path like author.email to reach it directly.
Improved — Loop and Variable blocks: the query builder's post and term pickers no longer come up empty for custom post types and taxonomies outside the REST API, or for terms searched before a taxonomy is set.
Improved — CSS inspector: the add-selector field now autocompletes with grouped suggestions and can create a new selector, matching the styles panel.
Improved — Condition and query builders: your choice of Visual or Code mode is now remembered, so a builder reopens the way you left it instead of resetting to Visual.
Added — Loop and Variable blocks: build the query visually instead of writing code — post types, taxonomy and date filters, custom fields and ordering, with the visual and code views in sync.
Added — Data Picker: insert dynamic data directly into HTML attribute fields (class, id, href, src, data-*) and the Variable expression editor.
Added — Data Picker: is / is not tests, if / then / else, not, and comparison operators (equals, not equal, less than, greater than, in, starts with, ends with) can now be built and edited visually, instead of only as typed code.
Added — Dynamic data: slice a list or string with [start:length], such as post.categories[0:3] for the first three or title[0:20] for the first 20 characters.
Fixed — Loop block: a query set to iterate a relationship or post-object field (a list of posts, users or terms) rendered empty items — each item's data such as title and link was blank.
Added — Dynamic data: new operators and tests usable in any expression: xor, same as, divisible by, starts with, ends with, and is / is not tests (empty, defined, null, even, odd, iterable, mapping, sequence).
Added — Condition block: build conditions visually, clause by clause (data, operator, value), with AND, OR, NOT and XOR groups; the visual and code views stay in sync.
Added — Condition value field: suggestions match the data being compared (post statuses, user roles, capabilities, archive types), with a picker for a specific post or user.
Added — Condition builder: "in" / "not in" conditions take a list of values, one per row, each a literal or dynamic data.
Fixed — Data Picker: it stayed open when clicking elsewhere and could be opened twice from the data and value fields.
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.