Description
Note
This is an integral part of the block API #41236
At WCEU contributor day I brought up an idea to a few people on how we could connect blocks and custom fields in a compelling way. In the early days, we had explored a "meta" block attribute source that allowed block authors to create blocks consuming data from post meta. It worked alright but the behavior predated some of the latest block API affordances — like entity handling — and had the limitation of being accessible only for block developers. The other limitation was that we didn't have enough knowledge of how the final html output should render to recreate it on the server, so the PHP output was handled ad hoc on the blocks that consumed fields. This new approach can overcome both obstacles.
The way it'd work is by connecting attributes from normal static blocks (content on paragraph, url on image, and so on) to meta keys instead of serializing their content. So far so good. The crucial difference is that it doesn't require a new custom block with a custom attribute but leverages the built-in blocks as the primary interface. This means we can work out a UI in the block inspector that just needs to handle the connection but doesn't need to support editing nor extrinsic validation because the block itself takes care of it through its normal setAttribute
flow. For example, updating a meta key for an image url would be as easy as dragging an image into the connected image block for a user. This also means patterns would just work out of the box transparently — a user can insert a pattern they like and map the heading block content to a field, the image source to another field, and so on. The edit UI for updating content remains the same.
To overcome the need to rebuild the html on the server we can employ the source declaration as a tag delimiter if we pair it with the new tag processor.
"content": {
"type": "string",
"source": "html",
"selector": "p",
"default": "",
"__experimentalRole": "content"
},
The gist of it is that the way a block declares how to query a serialized source can also function as an indication of how to reassemble that attribute properly. The implementation can thus reutilize an existing API contract instead of introducing a new syntax for tokens. (See #39831.)
Proposal
- The
selector
functions as a token placement, so we don't need additional syntax. The tag processor can find the element and we reconstructinnerHtml
entirely as it's just a simple composition of<$selector>$field</$selector>
. This means we don't need the full block recipe from save because we are just replacing specific attributes. - Since we are just dealing with block attributes, block variations can be created on demand for convenience.
- Transforming between blocks can retain the connection as long as they are valid transforms (so a paragraph using "book author" meta can be turned into a heading using "book author" meta).
- Users should be able to create and assign fields on the fly through the inspector UI, which right now is blocked by the
show_in_rest
requirement (only meta fields registered with show in rest would be available to pick from). - We can probably reduce the amount of specific blocks needed (post title, etc) down the road as we have discussed previously, as long as variations can have namespace aliases.
- This mechanic can help us simplify the various approaches to The
wp:pattern
block #48458 as it bypàsses the need for additional syntax.
Activity