Depuis la version 6.5, il est désormais possible de définir une variation de bloc avec PHP sans passer par JavaScript.
Le filtre get_block_type_variations
Il faut donc passer par le filtre get_block_type_variations
En paramètre de la fonction de callback, on reçoit un tableau de variation (souvent vide) et une instance du bloc enregistrée.
Ce filtre est donc appelé pour chaque bloc enregistré.
apply_filters( 'get_block_type_variations', array $variations, WP_Block_Type $block_type );
En retour, il faut donc retourner le tableau de variation $variations
avec votre variation ajoutée à ce tableau.
function my_block_type_variations( $variations, $block_type ) {
if ( $block_type->name === 'core/paragraph' ) {
$variations[] = [....]
}
return $variations;
}
add_filter( 'get_block_type_variations', 'my_block_type_variations', 10, 2 );
Détails de la variation de bloc à retourner.
Dans l’ensemble, les paramètres de la variation sont identiques à la version JavaScript :
name, title, description, category, attributes,..
Les différences avec la version PHP.
Pour la valeur « icon
« , on ne peut pas utiliser sont propre SVG. seul dashicon est pris en compte (dommage).
Pour la valeur « innerBlocks
« , on a une version un peu différente.
En JS, on a des tableaux avec en premier le nom du bloc, en deuxième les attributs et en dernier les enfants.
innerBlocks: [
['core/post-template',
{ layout:{type:"default"}, align:"full"},
[
['core/post-title',
{isLink:true},[]],
],
],
],
En version PHP, nous avons aussi un tableau mais ce dernier comporte des clés (name, attributs, innerBlocks). Comme pour la version JavaScript, cela reste difficile à lire.
'innerBlocks' => [
[
'name' => 'core/post-template',
'attributes' => [
'layout' => ['type' => 'default'],
'align' => 'full',
],
'innerBlocks' => [
[
'name' => 'core/post-title',
'attributes' => [
'level' => 3,
'isLink' => true,
],
'innerBlocks' => []
],
],
],
],
Et pour la valeur « isActive », on ne peut pas passer une fonction de callback comme en JavaScript. Il faut passer un tableau de clé.
Les clés correspondent aux clés des attributs.
Voici un exemple :
'isActive' => [
'query.postType',
'namespace',
],
'attributes' => [
'namespace' => 'mytheme/featured-post',
'query' => [
'postType' => 'post',
]
]
Avec ce tableau, il faut que le postType soit de type « post » et que le namespace corresponde à « mytheme/featured-post » pour que la variation soit active. Les 2 doivent correspondre.
Comme vous pouvez le constater, query.postType prend un point pour indiquer une profondeur dans un tableau.
Exemple complet de get_block_type_variations
function my_block_type_variations($variations, $block_type)
{
if ($block_type->name === 'core/query') {
$variations[] = [
'name' => 'mytheme/featured-post',
'title' => __('Featured Post', 'theme-slug'),
'description' => __('Display a featured post', 'theme-slug'),
'category' => 'theme',
'isActive' => [
'query.postType',
'namespace',
],
'icon' => 'admin-post',
'scope' => ['inserter'],
'attributes' => [
'namespace' => 'mytheme/featured-post',
'align' => 'full',
'layout' => ['type' => 'constrained'],
'className' => 'featured_post',
'query' => [
'postType' => 'post',
'perPage' => 3,
'pages' => 0,
'offset' => 0,
'order' => 'asc',
'orderBy' => 'date',
'author' => '',
'search' => '',
'exclude' => [],
'sticky' => '',
'inherit' => false,
],
],
'innerBlocks' => [
['name' => 'core/post-template',
'attributes' => [
'layout' => ['type' => 'default'],
'align' => 'full',
],
'innerBlocks' => [
[
'name' => 'core/post-title',
'attributes' => [
'level' => 3,
'isLink' => true,
],
],
[
'name' => 'core/post-date',
],
[
'name' => 'core/post-excerpt',
'attributes' => [
'length' => 20,
'moreText' => 'Lire la suite',
],
],
],
],
],
];
}
return $variations;
}
add_filter('get_block_type_variations', 'my_block_type_variations', 10, 2);