Extensions
Last modified:
Extensions allow you to extend any registered block in your WordPress
installation using a simple .json
based API, which is similar to the
block.json
configuration. This includes core, third-party and blocks made with
Blockstudio.
All field types can be added to any block, with the data being saved to the block's attributes. The complete feature set of attributes like filtering, disabling, conditional logic and populating options are available for extensions.
Extension types
Extended values can now be utilized in more versatile ways:
- class: Add a class using the attribute value to the block.
- style: Add inline styles using the attribute value to the block.
- attributes: Set any attribute value directly on the block, enhancing its functionality or accessibility.
- data attributes: Use extension values to set specific data attributes, enabling more complex interactions and dynamic content adjustments.
Setup
Imagine the following scenario: you want to add a custom class select
field to
every core block. All you need to do is add this .json
file anywhere in your
block folder, and it will be automatically registered as an extension.
{ "$schema": "https://app.blockstudio.dev/schema/extend", "name": "core/*", "priority": 10, "blockstudio": { "extend": true, "attributes": [ { "id": "customColor", "type": "select", "label": "Custom color", "options": [ { "value": "#f00", "label": "Red" }, { "value": "#00f", "label": "Blue" } ], "set": [ { "attribute": "style", "value": "color: {attributes.customColor}" } ] } ] } }
Copy
This will add a customColor
field to every core block, allowing you to set the
color of the block's text. Let's break down the configuration from top to
bottom:
File name
Since there is no rendering template, an extension doesn't need a matching
index
file and thus doesn't need to be named block.json
. This allows storing
all extensions conveniently in a single folder.
extensions
Schema
Blockstudio provides a custom JSON schema for extension configurations:
Name
The name
property of the configuration object defines which blocks should be
extended. There are three options depending on your needs:
- blockName: A single block name, e.g.
core/paragraph
. - [blockNameA, blockNameB]: An array of block names, e.g.
["core/paragraph", "core/heading"]
. - core/*: A wildcard to extend all blocks of a certain type, e.g.
core/*
.
Blockstudio key
Just like when using block.json
for custom blocks, the blockstudio
property
has to be present in the configuration object with extend
set to true
.
Position
By default, extensions will render in its own tab in the block inspector. If you
want to move the extensions to a different position, you can use the group
property. The following values are currently available:
- settings: The default position.
- styles: The styles tab.
- advanced: The advanced tab.
{ "$schema": "https://app.blockstudio.dev/schema/extend", "name": "core/*", "blockstudio": { "extend": true, "group": "styles", "attributes": [] } }
Copy
Priority
The priority
property allows you to define the order in which extensions are
rendered. Extensions with a higher priority will be rendered later. This is
useful if you want an extension to appear before another one.
Attributes
For more information on how attributes work, please refer to the attributes section.
The only thing you need to know about attributes inside extensions is the set
property. It is used to apply the value of the attribute to one of the types of the block.
For example, the following configuration will set the style
attribute of the
block to color: red
or color: blue
depending on the value of the select
field.
{ "$schema": "https://app.blockstudio.dev/schema/extend", "name": "core/*", "blockstudio": { "extend": true, "attributes": [ { "id": "customColor", "type": "select", "label": "Heading color", "options": [ { "value": "#f00", "label": "Red" }, { "value": "#00f", "label": "Blue" } ], "set": [ { "attribute": "style", "value": "color: {attributes.customColor}" } ] } ] } }
Copy
Getting values
Dot notation inside curly braces is used to get the value of an attribute.
It is also possible to get nested values when attributes are not returning a
single value, for example, when setting the return format to both
on field
types with options.
{ "attributes": [ { "id": "customColor", "type": "select", "label": "Heading color", "options": [ { "value": "#f00", "label": "Red" }, { "value": "#00f", "label": "Blue" } ], "returnFormat": "both", "set": [ { "attribute": "style", "value": "color: {attributes.customColor.value}" }, { "attribute": "data-color", "value": "{attributes.customColor.label}" } ] } ] }
Copy
The example above will set the style
attribute to color: #f00
or
color:#00f
and the data-color
attribute to Red
or Blue
depending on the
value.
For now, only values from the current attribute can be used inside set
definitions. The ability to use values from other attributes might be added in
the future.
Arrays
When using arrays, the set
property will be applied to every item in the
array.
Attributes field
When using the attributes
field, there is no set
property needed, as the
field automatically maps the values to the attribute name and value