Je joue avec Gutenberg en avance sur son inclusion dans le noyau, et j'aimerais savoir comment étendre le bloc de galerie existant pour changer son affichage. Par exemple, au lieu d'une grille de vignettes, j'aimerais afficher un diaporama d'images. C'est possible? Si c'est le cas, comment? Toute aide serait appréciée.
Ok, je joue avec cela un petit moment et j'ai réussi à changer la sortie du bloc Gallery, avec les mises en garde suivantes:
@wordpress/hooks
tandis que la discussion sur le système de crochets à utiliser dans Core est en cours .La première chose à faire est d’enregistrer un script. Ceci est fait avec wp_enqueue_scripts()
, mais sur le hook enqueue_block_editor_assets
.
Le script doit avoir le script wp-blocks
en tant que dépendance. Il est presque certainement déjà chargé dans l'éditeur, mais en faire une dépendance assure probablement son chargement avant notre script.
function wpse_298225_enqueue_block_assets() {
wp_enqueue_script(
'wpse-298225-gallery-block',
get_theme_file_uri( 'block.js' ),
['wp-blocks']
);
}
add_action( 'enqueue_block_editor_assets', 'wpse_298225_enqueue_block_assets' );
Le code HTML pour la sortie d'un bloc est géré par la méthode save()
du bloc. Vous pouvez voir le bloc Gallery dans ce fichier .
À ce stade (mars 2018), Gutenberg prend en charge un filtre sur la méthode de sauvegarde des blocs, blocks.getSaveElement
. Nous pouvons ajouter un crochet à ceci en JavaScript comme ceci:
wp.hooks.addFilter(
'blocks.getSaveElement',
'wpse-298225',
wpse298225GallerySaveElement
)
Le premier argument est le nom du hook, le second argument est - je pense - un espace de noms et le dernier argument est la fonction de rappel.
Comme nous remplaçons la méthode save()
du bloc, nous devons renvoyer un nouvel élément. Cependant, ce n'est pas un élément HTML normal que nous devons renvoyer. Nous devons renvoyer un React element.
Lorsque vous regardez la méthode save()
du bloc original, vous voyez JSX. React, que Gutenberg utilise sous le capot, le supporte pour le rendu des éléments. Voir cet article pour plus d'informations à ce sujet.
JSX nécessite normalement une étape de construction, mais comme je n'introduis pas une étape de construction pour cet exemple, nous avons besoin d'un moyen de créer un élément sans JSX. React fournit ceci avec createElement()
. WordPress fournit un wrapper pour cela et d'autres fonctionnalités de réaction sous la forme de wp.element
. Donc, pour utiliser createElement()
, nous utilisons wp.element.createElement()
.
Dans la fonction de rappel pour blocks.getSaveElement
nous obtenons:
element
L'élément d'origine créé par le bloc.blockType
Un objet représentant le bloc utilisé.attributes
Les propriétés de l'instance de bloc. Dans notre exemple, cela inclut les images de la galerie et des paramètres tels que le nombre de colonnes.Donc, notre fonction de rappel doit:
Voici un exemple complet qui génère simplement une ul
avec une classe, my-gallery
et li
s pour chaque image avec les classes my-gallery-item
et et img
avec chacune la valeur src
définie sur l'URL de l'image.
function wpse298225GallerySaveElement( element, blockType, attributes ) {
if ( blockType.name !== 'core/gallery' ) {
return element;
}
var newElement = wp.element.createElement(
'ul',
{
'className': 'wp-block-gallery my-gallery',
},
attributes.images.map(
function( image ) {
return wp.element.createElement(
'li',
{
'className': 'blocks-gallery-item my-gallery-item',
},
wp.element.createElement(
'img',
{
'src': image.url,
}
)
)
}
)
)
return newElement
}
Quelques points à prendre en compte:
ul.wp-block-gallery .blocks-gallery-item
. Ce balisage et ces classes sont donc indispensables pour pouvoir modifier le bloc. Ce balisage est également utilisé pour le style par défaut.attributes.images.map
parcourt chaque image et renvoie un tableau d'éléments enfants en tant que contenu de l'élément principal. À l'intérieur de ces éléments, il y a un autre élément enfant pour l'image elle-même.Ici pour fournir une réponse mise à jour. J'ai trouvé ce message extrêmement utile en répondant à la question de savoir comment étendre le bloc Galerie.
En bref, il est conseillé de simplement créer un nouveau bloc plutôt que d’étendre un existant. De la poste dans mon lien ci-dessus:
si vous modifiez le code HTML d'un bloc [en étendant], il ne sera pas reconnu comme le bloc d'origine. Plutôt que d'essayer de manipuler un bloc central, il semblerait plus sûr de ne pas enregistrer ce dernier et d'enregistrer un nouveau bloc de remplacement à sa place. Vous garantissez ainsi que les utilisateurs du site utilisent votre galerie personnalisée, ce qui valide il définit sa propre structure HTML.
Le lien ci-dessus fait également référence à Le plug-in Create-Guten_Block , qui est un outil de ligne de commande qui générera tout ce dont vous avez besoin pour démarrer avec la création de blocs. L'outil est très facile à utiliser et facile à configurer.
Avec ces ressources, j'ai pu comprendre comment développer rapidement un bloc de galerie personnalisé.