{"id":234207,"date":"2023-02-12T15:46:00","date_gmt":"2023-02-12T12:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234207"},"modified":"2022-11-12T00:18:01","modified_gmt":"2022-11-11T21:18:01","slug":"comment-ajouter-une-selection-dimage-dans-votre-bloc-wordpress-gutenberg-personnalise","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-ajouter-une-selection-dimage-dans-votre-bloc-wordpress-gutenberg-personnalise\/","title":{"rendered":"Comment ajouter une s\u00e9lection d&rsquo;image dans votre bloc WordPress Gutenberg personnalis\u00e9"},"content":{"rendered":"\n<p>Ce message est pour vous qui cr\u00e9ez un bloc Gutenberg personnalis\u00e9 et avez besoin d&rsquo;un moyen de s\u00e9lectionner ou de t\u00e9l\u00e9charger une image \u00e0 partir de la m\u00e9diath\u00e8que. La plupart des autres types de champs, tels que les cases \u00e0 cocher, les entr\u00e9es de texte ou les s\u00e9lecteurs de couleurs, sont assez faciles \u00e0 ajouter, mais un t\u00e9l\u00e9chargeur de m\u00e9dias n\u00e9cessite un peu plus de code. Nous allons cr\u00e9er un composant Inspector qui est responsable du rendu d&rsquo;un bouton pour ouvrir la biblioth\u00e8que multim\u00e9dia, s\u00e9lectionner une image et \u00e9ventuellement la supprimer ou la modifier ult\u00e9rieurement. Le tout utilisant des composants WordPress standard.<\/p>\n<p>Avant de plonger dans le code, veuillez garder \u00e0 l&rsquo;esprit que cet article n\u00e9cessite certaines connaissances de Gutenberg sur la fa\u00e7on d&rsquo;\u00e9crire des blocs personnalis\u00e9s. Nous nous concentrerons uniquement sur la partie t\u00e9l\u00e9chargeur de m\u00e9dias et non sur la mani\u00e8re de s&rsquo;enregistrer et de cr\u00e9er un bloc Gutenberg en soi. Si vous ne savez pas comment \u00e9crire un bloc Gutenberg personnalis\u00e9, j&rsquo;ai une s\u00e9rie de tutoriels couvrant exactement ceci\u00a0:<\/p>\n<p>Avec cela \u00e0 l&rsquo;\u00e9cart, plongeons dedans\u00a0!<\/p>\n<h2>Ce que nous ferons<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f57cf93.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f57cf93.png\" alt=\"Comment ajouter une s\u00e9lection d&#039;image dans votre bloc WordPress Gutenberg personnalis\u00e9\" ><\/a><\/p>\n<p>La fonction de s\u00e9lection de m\u00e9dia sera fonctionnellement exactement la m\u00eame que la fonction d&rsquo;image en vedette de WordPress. Nous allons \u00e0 l&rsquo;int\u00e9rieur d&rsquo;Inspector ajouter un panneau compos\u00e9 d&rsquo;un bouton pour choisir une image.<\/p>\n<p>Lorsque vous cliquez sur le bouton, la fen\u00eatre &quot;S\u00e9lectionner ou t\u00e9l\u00e9charger un m\u00e9dia&quot; s&rsquo;affiche, vous permettant de s\u00e9lectionner un fichier dans la biblioth\u00e8que multim\u00e9dia. Nous limitons la biblioth\u00e8que multim\u00e9dia pour afficher uniquement les images. Une fois qu&rsquo;une image est s\u00e9lectionn\u00e9e, la fen\u00eatre contextuelle se ferme et le panneau pr\u00e9visualise un petite vignette de l&rsquo;image s\u00e9lectionn\u00e9e. Sous les boutons de pr\u00e9visualisation pour modifier et supprimer l&rsquo;image appara\u00eetront. Exactement comme avec l&rsquo;image s\u00e9lectionn\u00e9e.<\/p>\n<p>Ce didacticiel suppose que vous utiliserez l&rsquo;image s\u00e9lectionn\u00e9e comme arri\u00e8re-plan du bloc &#8211; juste \u00e0 titre d&rsquo;exemple. C&rsquo;est pourquoi nous stockons l&rsquo;URL de l&rsquo;image. J&rsquo;inclurai un exemple sur la fa\u00e7on d&rsquo;utiliser l&rsquo;image s\u00e9lectionn\u00e9e (\u00e0 la fois dans <code>edit<\/code>et dans la <code>save<\/code>fonction). Lors du choix d&rsquo;une image, l&rsquo;image appara\u00eetra en arri\u00e8re-plan de notre bloc, \u00e0 la fois dans l&rsquo;\u00e9diteur et dans le frontend.<\/p>\n<p>Nous stockons l&rsquo;ID et l&rsquo;URL du m\u00e9dia dans les attributs du bloc. Le code utilise <code>withSelect<\/code>, un composant d&rsquo;ordre sup\u00e9rieur fourni dans <code>wp.data<\/code>le package, pour demander plus d&rsquo;informations sur le m\u00e9dia s\u00e9lectionn\u00e9, par ID.<\/p>\n<p>J&#8217;emprunte \u00e9galement des noms de classe \u00e0 la fonctionnalit\u00e9 d&rsquo;image en vedette de WordPress pour m&rsquo;assurer que tout a l&rsquo;air bien et qu&rsquo;il n&rsquo;est pas n\u00e9cessaire d&rsquo;\u00e9crire de CSS vous-m\u00eame. Ceci est bien s\u00fbr facultatif.<\/p>\n<h2>Enregistrement du m\u00e9dia s\u00e9lectionn\u00e9 dans les attributs<\/h2>\n<p>Ce que vous devez enregistrer dans les attributs de votre bloc d\u00e9pend un peu de vous. Au minimum, nous devons stocker l&rsquo;ID du m\u00e9dia, \u00e9videmment. Cela peut suffire si vous n&rsquo;avez pas besoin d&rsquo;utiliser l&rsquo;URL du m\u00e9dia n&rsquo;importe o\u00f9 dans le code du script. Par exemple, si vous utilisez <code>ServerSideRender<\/code>o\u00f9 PHP est responsable du rendu de la sortie du bloc. Dans ce cas, vous pouvez facilement obtenir l&rsquo;URL de l&rsquo;image \u00e0 partir de l&rsquo;ID de m\u00e9dia en utilisant par exemple <code>[wp_get_attachment_image_src](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_attachment_image_src\/)()<\/code>. Cependant, dans l&rsquo;exemple ci-dessous, je montre un exemple simple d&rsquo;affichage de l&rsquo;image en arri\u00e8re-plan de notre bloc, donc je stocke \u00e9galement l&rsquo;URL du m\u00e9dia en tant qu&rsquo;attribut. Nous utiliserons l&rsquo;attribut URL \u00e0 la fois dans <code>edit<\/code>(pour ajouter l&rsquo;arri\u00e8re-plan dans l&rsquo;\u00e9diteur) et dans <code>save<\/code>(pour ajouter l&rsquo;arri\u00e8re-plan dans l&rsquo;interface).<\/p>\n<p>Commen\u00e7ons par d\u00e9finir nos attributs. L&rsquo;ID de m\u00e9dia doit \u00eatre un num\u00e9ro de type et la valeur par d\u00e9faut est 0. Cela facilite la comparaison. Et l&rsquo;URL du m\u00e9dia doit \u00eatre une cha\u00eene de type avec une cha\u00eene vide par d\u00e9faut.<\/p>\n<pre><code>attributes: {\n    mediaId: {\n        type: 'number',\n        default: 0\n    },\n    mediaUrl: {\n        type: 'string',\n        default: ''\n    }\n},<\/code><\/pre>\n<h2>Cr\u00e9ation du composant<\/h2>\n<p>Pour rendre notre code plus ordonn\u00e9, nous d\u00e9finissons un composant s\u00e9par\u00e9 pour la fonction du bloc <code>edit<\/code>. Nous passerons plus tard ce composant \u00e0 <code>withSelect<\/code>as pour l&rsquo;envelopper autour de notre composant.<\/p>\n<p>Dans le retour du composant, nous rendons un simple <code>&lt;div&gt;<\/code>pour le contenu du bloc. Je suppose que vous aurez ou aurez plus de contenu de bloc r\u00e9el pour remplacer l&rsquo;exemple de contenu factice. Nous rendons \u00e9galement <code>InspectorControls<\/code>(package <code>wp.blockEditor<\/code>) afin d&rsquo;ajouter une section \u00e0 l&rsquo;inspecteur. Pour l&rsquo;instant j&rsquo;ajoute un vide <code>PanelBody<\/code>\u00e0 l&rsquo;int\u00e9rieur du <code>InspectorControls<\/code>. J&rsquo;ajoute un <code>&lt;div&gt;<\/code>avec la m\u00eame classe que la section d&rsquo;images en vedette de WordPress. Cela garantit que notre style est beau. Plus tard, nous le remplirons <code>PanelBody<\/code>avec le code de la fonctionnalit\u00e9 de s\u00e9lection de m\u00e9dia.<\/p>\n<p>Mais d&rsquo;abord, d\u00e9structurons le composant n\u00e9cessaire au d\u00e9but du fichier :<\/p>\n<pre><code>const { InspectorControls } = wp.blockEditor;\nconst { PanelBody } = wp.components;\nconst { Fragment } = wp.element;<\/code><\/pre>\n<p>Au-dessus <code>registerBlockType<\/code>, je d\u00e9finis un composant simple appel\u00e9 <code>BlockEdit<\/code>. Si vous pr\u00e9f\u00e9rez d\u00e9placer ceci dans un fichier s\u00e9par\u00e9, vous pouvez le faire. C&rsquo;est courant et recommand\u00e9, mais pour ce tutoriel, je garde les choses simples et je le garde dans le m\u00eame fichier.<\/p>\n<pre><code>const BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    return (&lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelBody\n                    title={__('Select block background image', 'awp')}\n                    initialOpen={ true }\n                &gt;\n                    &lt;div className=\"editor-post-featured-image\"&gt;\n                        ...We will add code here...\n                    &lt;\/div&gt;\n                &lt;\/PanelBody&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n};<\/code><\/pre>\n<p>Maintenant, nous voulons rendre ce composant dans notre <code>edit<\/code>fonction. Mais nous voulons l&rsquo;envelopper dans un fichier <code>withSelect<\/code>.<\/p>\n<h2>Utilisation <code>withSelect<\/code>dans la <code>edit<\/code>fonction<\/h2>\n<p>Si vous n&rsquo;\u00eates pas familier avec <code>withSelect<\/code>, il s&rsquo;agit d&rsquo;un composant utile d&rsquo;ordre sup\u00e9rieur qui nous permet d&rsquo;effectuer des requ\u00eates. Vous pouvez par exemple interroger les publications avec ceci. Nous utiliserons cependant la fonction <code>select('core').getMedia()<\/code>pour interroger l&rsquo;ID du m\u00e9dia. En r\u00e9ponse, nous recevrons un objet avec toutes les informations du m\u00e9dia. L&rsquo;objet multim\u00e9dia que nous obtenons en r\u00e9ponse sera ensuite fourni comme accessoire dans notre <code>BlockEdit<\/code>composant, pr\u00eat \u00e0 l&#8217;emploi. Astucieux.<\/p>\n<p>Nous nous assurons de n&rsquo;interroger le m\u00e9dia que si l&rsquo;attribut d&rsquo;ID de m\u00e9dia est r\u00e9ellement d\u00e9fini sur autre chose que 0. Voici \u00e0 quoi ressemblera notre fonction d&rsquo;\u00e9dition\u00a0:<\/p>\n<pre><code>edit: withSelect((select, props) =&gt; {\n    return { media: props.attributes.mediaId? select('core').getMedia(props.attributes.mediaId): undefined };\n})(BlockEdit),<\/code><\/pre>\n<p>\u00c0 la toute fin, apr\u00e8s fermeture <code>withSelect<\/code>de la ligne, <code>#3<\/code>c&rsquo;est l\u00e0 que nous demandons <code>withSelect<\/code>de retourner notre <code>BlockEdit<\/code>composant. Avec cela, notre <code>BlockEdit<\/code>composant a maintenant acc\u00e8s \u00e0 <code>props.media<\/code>.<\/p>\n<h2>Rendu d&rsquo;une s\u00e9lection de m\u00e9dia<\/h2>\n<p>Vient enfin la partie amusante: la partie dans l&rsquo;inspecteur.<\/p>\n<p>Le composant qui nous int\u00e9resse est <code>MediaUpload<\/code>(package <code>wp.blockEditor<\/code>). Si vous \u00eates int\u00e9ress\u00e9, le repo WordPress Github pour Gutenberg contient de <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/block-editor\/src\/components\/media-upload\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentation sur ce composant<\/a>. Nous allons \u00e9galement envelopper ce composant dans un composant appel\u00e9 <code>MediaUploadCheck<\/code>(package <code>wp.blockEditor<\/code>). Ce composant s&rsquo;assure que l&rsquo;utilisateur actuel a les capacit\u00e9s d&rsquo;utiliser la biblioth\u00e8que multim\u00e9dia, il est donc recommand\u00e9 de l&rsquo;utiliser.<\/p>\n<p>Le <code>MediaUpload<\/code>composant a un accessoire requis\u00a0: <code>render<\/code>. La fa\u00e7on dont ce composant fonctionne est que nous d\u00e9finissons une fonction pour le <code>render<\/code>prop o\u00f9 nous rendons la sortie pour la &quot;zone de t\u00e9l\u00e9chargement de m\u00e9dias&quot;. Dans notre cas, nous rendrons un <code>Button<\/code>(package <code>wp.components<\/code>). Dans le prop de rendu de MediaUpload, nous avons acc\u00e8s \u00e0 la <code>open<\/code>fonction que nous pouvons appeler pour que WordPress ouvre la fen\u00eatre contextuelle de la biblioth\u00e8que multim\u00e9dia\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f6d571d.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f6d571d.png\" alt=\"Comment ajouter une s\u00e9lection d&#039;image dans votre bloc WordPress Gutenberg personnalis\u00e9\" ><\/a><\/p>\n<p>Il y a quelques autres accessoires disponibles pour <code>MediaUpload<\/code>. Nous couvrirons les \u00e9l\u00e9ments importants pour le rendre fonctionnel dans ce didacticiel, mais il y en a quelques autres avec lesquels vous pouvez jouer. Vous pourriez au moins \u00eatre int\u00e9ress\u00e9 par le prop <code>allowedTypes<\/code>o\u00f9 vous pouvez limiter les types de fichiers qu&rsquo;il est possible de s\u00e9lectionner dans la biblioth\u00e8que. Dans notre cas, nous l&rsquo;avons configur\u00e9 pour n&rsquo;autoriser que les images.<\/p>\n<h3>Ajout de la<code>MediaUpload<\/code><\/h3>\n<p>D\u00e9structurez d&rsquo;abord les nouveaux composants\u00a0;<\/p>\n<pre><code>const { Button } = wp.components;\nconst { MediaUpload, MediaUploadCheck } = wp.blockEditor;<\/code><\/pre>\n<p>Ajoutons <code>MediaUploadCheck<\/code>et <code>MediaUpload<\/code>\u00e0 l&rsquo;int\u00e9rieur de notre <code>div<\/code>dans notre <code>PanelBody<\/code>:<\/p>\n<pre><code>&lt;div className=\"editor-post-featured-image\"&gt;\n    &lt;MediaUploadCheck&gt;\n        &lt;MediaUpload\n            allowedTypes={ ['image'] }\n            render={({open}) =&gt; (&lt;Button \n                    className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n                    onClick={open}\n                &gt;\n                    {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n                &lt;\/Button&gt;\n            )}\n        \/&gt;\n    &lt;\/MediaUploadCheck&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511fa0bf3f.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511fa0bf3f.png\" alt=\"Comment ajouter une s\u00e9lection d&#039;image dans votre bloc WordPress Gutenberg personnalis\u00e9\" ><\/a><\/p>\n<p>Le code ci-dessus d\u00e9structure <code>open<\/code>\u00e0 l&rsquo;int\u00e9rieur de la fonction pour <code>render<\/code>. Nous rendons un simple <code>Button<\/code>o\u00f9 sa <code>onClick<\/code>propri\u00e9t\u00e9 ex\u00e9cutera la <code>open<\/code>fonction. J&rsquo;ai \u00e9galement ajout\u00e9 les m\u00eames noms de classe que la fonctionnalit\u00e9 d&rsquo;image en vedette de WordPress pour nous assurer que nous n&rsquo;avons pas besoin d&rsquo;ajouter de style.<\/p>\n<p>\u00c0 l&rsquo;int\u00e9rieur du <code>Button<\/code>composant, nous v\u00e9rifions si une image a \u00e9t\u00e9 d\u00e9finie ou non (<code>attributes.mediaId<\/code>). Si ce n&rsquo;est pas le cas, nous faisons \u00e9cho au texte \u00ab\u00a0Choisissez une image\u00a0\u00bb. Nous devrions maintenant avoir ceci dans notre bloc.<\/p>\n<p>Lorsque vous cliquez sur le bouton, la fen\u00eatre contextuelle de la biblioth\u00e8que multim\u00e9dia doit appara\u00eetre. Cependant, la s\u00e9lection d&rsquo;une image ne fonctionne pas pour le moment, car il nous manque les accessoires <code>onSelect<\/code>et sur. R\u00e9glons cela maintenant. Nous d\u00e9finissons l&rsquo;ID de m\u00e9dia s\u00e9lectionn\u00e9 et nous d\u00e9finissons pour ex\u00e9cuter une fonction que nous d\u00e9finirons plus tard dans notre composant.<code>value``MediaUpload``value``onSelect<\/code><\/p>\n<pre><code>...\n&lt;MediaUploadCheck&gt;\n    &lt;MediaUpload\n        onSelect={onSelectMedia}\n        value={attributes.mediaId}\n        allowedTypes={ ['image'] }\n        ...<\/code><\/pre>\n<p>D\u00e9finissons la <code>onSelectMedia<\/code>fonction dans notre composant.<\/p>\n<h3>Gestion de la s\u00e9lection des m\u00e9dias<\/h3>\n<p><strong>Remarque<\/strong>: je d\u00e9finis mes fonctions comme des fonctions fl\u00e9ch\u00e9es (<code>onSelectMedia =() =&gt; { }<\/code>). Les fonctions fl\u00e9ch\u00e9es sont assez nouvelles dans ESNext et plut\u00f4t astucieuses. L&rsquo;inconv\u00e9nient est que l&rsquo;utilisation des fonctions fl\u00e9ch\u00e9es n\u00e9cessite que vous ajoutiez la prise en charge de cela dans votre configuration Babel. Si vous ne l&rsquo;avez pas encore fait, je vous recommande de regarder sous le titre &quot;Configurer Babel&quot; dans <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-gutenberg-blocks-part-1-setting-up-the-development-environment\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cet article<\/a>.<\/p>\n<p>Juste avant l&rsquo;instruction return du composant, je d\u00e9finis une <code>onSelectMedia<\/code>fonction. Tout ce dont nous avons besoin est de mettre \u00e0 jour nos attributs en utilisant <code>setAttributes()<\/code>. En tant que param\u00e8tre, <code>onSelectMedia<\/code>nous obtenons un objet multim\u00e9dia. Nous extrayons simplement ce dont nous avons besoin de l&rsquo;objet m\u00e9dia. Dans notre cas, il s&rsquo;agit de l&rsquo;ID de m\u00e9dia et de l&rsquo;URL compl\u00e8te, qui sont respectivement les propri\u00e9t\u00e9s <code>id<\/code>et <code>url<\/code>.<\/p>\n<pre><code>const BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    const onSelectMedia = (media) =&gt; {\n        props.setAttributes({\n            mediaId: media.id,\n            mediaUrl: media.url\n        });\n    }\n\u00a0\n    return(\n        ...<\/code><\/pre>\n<p>Essayez-le maintenant et vous pourrez d\u00e9sormais s\u00e9lectionner une image dans la m\u00e9diath\u00e8que. Le m\u00e9dia s\u00e9lectionn\u00e9 est enregistr\u00e9 dans les attributs du bloc. Cependant, il n&rsquo;y a pas encore de pr\u00e9visualisation dans l&rsquo;Inspecteur, et parce que vous avez s\u00e9lectionn\u00e9 une image, le bouton de s\u00e9lection d&rsquo;une image dispara\u00eet. Le panneau est maintenant vide. L&rsquo;\u00e9tape suivante consiste \u00e0 afficher l&rsquo;aper\u00e7u chaque fois qu&rsquo;une image a \u00e9t\u00e9 s\u00e9lectionn\u00e9e, ainsi qu&rsquo;\u00e0 fournir des options pour la supprimer ou la modifier.<\/p>\n<h2>Rendu d&rsquo;une image d&rsquo;aper\u00e7u<\/h2>\n<p>\u00c0 l&rsquo;int\u00e9rieur du <code>Button<\/code>composant, nous rendons \u00e0 l&rsquo;int\u00e9rieur <code>MediaUpload<\/code>de la <code>render<\/code>prop de nous \u00e9cho un texte &quot;Choisissez une image&quot; si une image n&rsquo;est pas encore d\u00e9finie. Mais nous devons ajouter du code lorsqu&rsquo;une image est d\u00e9finie \u00e0 l&rsquo;int\u00e9rieur ici\u00a0; un aper\u00e7u.<\/p>\n<p>Pour nous aider \u00e0 rendre un bel aper\u00e7u, nous utilisons le composant <code>ResponsiveWrapper<\/code>(package <code>wp.components<\/code>). Afin de <code>ResponsiveWrapper<\/code>fonctionner pleinement, nous devons fournir des accessoires pour la hauteur et la largeur. Nous avons \u00e9galement besoin de l&rsquo;URL de la vignette. Il ne sert \u00e0 rien d&rsquo;utiliser l&rsquo;URL compl\u00e8te (qui peut \u00eatre gigantesque) pour afficher un aper\u00e7u dans l&rsquo;inspecteur. C&rsquo;est l\u00e0 qu&rsquo;intervient l&rsquo;accessoire <code>withSelect<\/code>. \u00c0 l&rsquo;int\u00e9rieur du composant, nous rendons une simple <code>&lt;img&gt;<\/code>balise HTML.<\/p>\n<p>On d\u00e9structure d&rsquo;abord le composant n\u00e9cessaire :<\/p>\n<pre><code>const { ResponsiveWrapper } = wp.components;<\/code><\/pre>\n<pre><code>&lt;Button \n    className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n    onClick={open}\n&gt;\n    {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n    {props.media != undefined &amp;&amp; \n        &lt;ResponsiveWrapper\n                naturalWidth={ props.media.media_details.width }\n            naturalHeight={ props.media.media_details.height }\n            &gt;\n                &lt;img src={props.media.source_url} \/&gt;\n            &lt;\/ResponsiveWrapper&gt;\n    }\n&lt;\/Button&gt;<\/code><\/pre>\n<p>Comme vous pouvez le voir, nous acc\u00e9dons \u00e0 l&rsquo;accessoire <code>withSelect<\/code>fourni par le composant, <code>props.media<\/code>. Nous r\u00e9cup\u00e9rons la largeur, la hauteur et l&rsquo;URL de la taille de la vignette du m\u00e9dia \u00e0 partir de l&rsquo;objet.<\/p>\n<p>Vous devriez maintenant avoir un bel aper\u00e7u de l&rsquo;image s\u00e9lectionn\u00e9e !<\/p>\n<p>Parce que nous rendons l&rsquo;image d&rsquo;aper\u00e7u \u00e0 l&rsquo;int\u00e9rieur, le fait <code>Button<\/code>de cliquer sur l&rsquo;image d&rsquo;aper\u00e7u d\u00e9clenchera la <code>Button<\/code>fonction de <code>onClick<\/code>&#8211; qui consiste \u00e0 ouvrir la m\u00e9diath\u00e8que. De cette fa\u00e7on, vous pouvez d\u00e9j\u00e0 modifier l&rsquo;image s\u00e9lectionn\u00e9e.<\/p>\n<p>Il n&rsquo;existe actuellement aucun moyen de supprimer ou de r\u00e9initialiser l&rsquo;image s\u00e9lectionn\u00e9e. R\u00e9parons \u00e7a\u00a0!<\/p>\n<h3>Ajout d&rsquo;une fonction de suppression<\/h3>\n<p>Nous devrions \u00e0 tout le moins offrir la possibilit\u00e9 \u00e0 l&rsquo;utilisateur de supprimer l&rsquo;image s\u00e9lectionn\u00e9e. \u00c0 partir de maintenant, une fois que vous avez s\u00e9lectionn\u00e9 une image, vous pouvez uniquement la modifier, mais pas la supprimer.<\/p>\n<p>Nous le ferons de la m\u00eame mani\u00e8re que WordPress le fait pour l&rsquo;image s\u00e9lectionn\u00e9e\u00a0: un nouveau <code>Button<\/code>sous l&rsquo;image d&rsquo;aper\u00e7u (enti\u00e8rement en dehors de son <code>MediaUploadCheck<\/code>). En fournissant quelques accessoires astucieux au <code>Button<\/code>nous le faisons ressembler \u00e0 un lien (<code>isLink<\/code>) avec une couleur de texte rouge (<code>isDestructive<\/code>). Lisez la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/button\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentation de Button<\/a> pour voir ce qui est possible d&rsquo;autre. Nous enveloppons le bouton dans un autre <code>MediaUploadCheck<\/code>, juste pour nous assurer que l&rsquo;utilisateur dispose des bonnes capacit\u00e9s.<\/p>\n<pre><code>        ...\n        &lt;\/MediaUploadCheck&gt;\n        {attributes.mediaId != 0 &amp;&amp; \n            &lt;MediaUploadCheck&gt;\n                &lt;Button onClick={removeMedia} isLink isDestructive&gt;{__('Remove image', 'awp')}&lt;\/Button&gt;\n            &lt;\/MediaUploadCheck&gt;\n        }\n    &lt;\/div&gt;\n&lt;\/PanelBody&gt;<\/code><\/pre>\n<p>Pour cet \u00e9v\u00e9nement, nous <code>Button<\/code>ex\u00e9cutons <code>onClick<\/code>une nouvelle fonction dans notre composant: <code>removeMedia()<\/code>. Nous le d\u00e9finissons quelque part juste avant la fonction de retour du composant, comme nous l&rsquo;avons fait avec <code>onSelectMedia<\/code>.<\/p>\n<pre><code>const removeMedia =() =&gt; {\n    props.setAttributes({\n        mediaId: 0,\n        mediaUrl: ''\n    });\n}<\/code><\/pre>\n<p>Cette fonction ne fait que r\u00e9initialiser nos deux valeurs d&rsquo;attribut.<\/p>\n<p>Nous aurons maintenant un joli lien clair pour supprimer l&rsquo;image\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511faedb09.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511faedb09.png\" alt=\"Comment ajouter une s\u00e9lection d&#039;image dans votre bloc WordPress Gutenberg personnalis\u00e9\" ><\/a><\/p>\n<p>Lorsque vous cliquez sur le nouveau bouton, l&rsquo;image s\u00e9lectionn\u00e9e et le bouton lui-m\u00eame disparaissent, et le bouton de s\u00e9lection d&rsquo;une image r\u00e9appara\u00eet.<\/p>\n<h3>Ajout d&rsquo;un bouton de remplacement<\/h3>\n<p>Cette \u00e9tape est enti\u00e8rement facultative. Comme mentionn\u00e9 pr\u00e9c\u00e9demment, cliquer sur l&rsquo;image d&rsquo;aper\u00e7u de l&rsquo;image ouvrira la biblioth\u00e8que multim\u00e9dia et vous permettra de modifier l&rsquo;image. Cependant, cela pourrait ne pas \u00eatre aussi intuitif pour tout le monde \u00e0 comprendre. WordPress ajoute un bouton s\u00e9par\u00e9 pour changer l&rsquo;image, juste pour le rendre tr\u00e8s clair. Nous pouvons faire la m\u00eame chose.<\/p>\n<p>Pour rendre un bouton de changement d&rsquo;image, nous r\u00e9p\u00e9tons essentiellement le code que nous avons pour s\u00e9lectionner l&rsquo;image: un autre <code>MediaUpload<\/code>composant. Nous fournissons la m\u00eame fonction pour <code>onSelect<\/code>, <code>allowedFileTypes<\/code>et <code>value<\/code>comme pr\u00e9c\u00e9demment. \u00c0 l&rsquo;int\u00e9rieur de l&rsquo; <code>render<\/code>accessoire, <code>MediaUpload<\/code>nous en rendons simplement un autre <code>Button<\/code>qui ouvre la m\u00e9diath\u00e8que. Pla\u00e7ons ce bouton avant le bouton Supprimer &#8211; car cela a plus de sens pour l&rsquo;utilisateur final\u00a0:<\/p>\n<pre><code>&lt;\/MediaUploadCheck&gt;\n{attributes.mediaId != 0 &amp;&amp; \n    &lt;MediaUploadCheck&gt;\n        &lt;MediaUpload\n            title={__('Replace image', 'awp')}\n            value={attributes.mediaId}\n            onSelect={onSelectMedia}\n            allowedTypes={['image']}\n            render={({open}) =&gt; (&lt;Button onClick={open} isDefault isLarge&gt;{__('Replace image', 'awp')}&lt;\/Button&gt;\n            )}\n        \/&gt;\n    &lt;\/MediaUploadCheck&gt;\n}\n{attributes.mediaId != 0 &amp;&amp; \n    &lt;MediaUploadCheck&gt;\n        &lt;Button onClick={removeMedia} ...<\/code><\/pre>\n<p>Alors maintenant, vous devriez obtenir ceci :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f57cf93.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f57cf93.png\" alt=\"Comment ajouter une s\u00e9lection d&#039;image dans votre bloc WordPress Gutenberg personnalis\u00e9\" ><\/a><\/p>\n<h2>Utilisation de l&rsquo;image s\u00e9lectionn\u00e9e<\/h2>\n<p>\u00c0 pr\u00e9sent, il devrait \u00eatre assez clair comment vous pouvez utiliser l&rsquo;image s\u00e9lectionn\u00e9e. L&rsquo;ID et l&rsquo;URL du m\u00e9dia sont stock\u00e9s dans les attributs de votre bloc. Cependant, \u00e0 titre d&rsquo;exemple simple, j&rsquo;inclurai du code qui d\u00e9finit l&rsquo;image s\u00e9lectionn\u00e9e comme arri\u00e8re-plan du bloc. Le code peut \u00eatre fait exactement de la m\u00eame mani\u00e8re dans les fonctions <code>edit<\/code>et dans les <code>save<\/code>. Nous cr\u00e9ons simplement un objet de style que nous appliquons sur la div d&rsquo;habillage du bloc. Dans l&rsquo;objet de style, nous d\u00e9finissons l&rsquo;image d&rsquo;arri\u00e8re-plan sur l&rsquo;URL du m\u00e9dia.<\/p>\n<pre><code>    ...\n    const blockStyle = {\n        backgroundImage: attributes.mediaUrl != 0? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n    };\n\u00a0\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n            ...\n            &lt;\/InspectorControls&gt;\n            &lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n        ...<\/code><\/pre>\n<p>Avec le reste de votre contenu de bloc personnalis\u00e9, cela pourrait facilement ressembler \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511fd78dce.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511fd78dce.png\" alt=\"Comment ajouter une s\u00e9lection d&#039;image dans votre bloc WordPress Gutenberg personnalis\u00e9\" ><\/a><\/p>\n<p>Si vous appliquez le style de bloc dans <code>edit<\/code>et <code>save<\/code>, votre bloc devrait maintenant avoir le m\u00e9dia s\u00e9lectionn\u00e9 en arri\u00e8re-plan. \u00c0 la fois dans l&rsquo;\u00e9diteur et dans le frontend.<\/p>\n<h2>Conclusion<\/h2>\n<p>La s\u00e9lection d&rsquo;une image (ou d&rsquo;un fichier) dans la m\u00e9diath\u00e8que est une fonction dont vous, en tant que d\u00e9veloppeur Gutenberg, aurez sans aucun doute besoin pour vos blocs. Nous avons appris \u00e0 ajouter une fonction pour s\u00e9lectionner une image de la m\u00e9diath\u00e8que dans notre bloc Gutenberg personnalis\u00e9. Nous l&rsquo;avons fait de la m\u00eame mani\u00e8re que WordPress lui-m\u00eame le fait pour l&rsquo;image en vedette. (Edit mai 2020: WordPress a maintenant mis \u00e0 jour l&rsquo;image s\u00e9lectionn\u00e9e pour utiliser <code>useSelect<\/code>, le crochet React \u00e0 la place). Cela garantit que notre code n&rsquo;est pas &quot;hack-ish&quot; avec un risque \u00e9lev\u00e9 de rupture dans les futures mises \u00e0 jour.<\/p>\n<p>Faites-moi savoir si vous avez eu une utilisation de cela!<\/p>\n<h2>Code complet<\/h2>\n<p>Vous trouverez ci-dessous le code complet d&rsquo;un bloc personnalis\u00e9 qui pr\u00e9sente la fonctionnalit\u00e9 de s\u00e9lection de m\u00e9dia. Et rien d&rsquo;autre vraiment. Cette partie d\u00e9pend de vous!<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { InspectorControls, MediaUpload, MediaUploadCheck } = wp.blockEditor;\nconst { PanelBody, Button, ResponsiveWrapper } = wp.components;\nconst { Fragment } = wp.element;\nconst { withSelect } = wp.data;\nconst { __ } = wp.i18n;\nconst BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    const removeMedia = () =&gt; {\n        props.setAttributes({\n            mediaId: 0,\n            mediaUrl: ''\n        });\n    }\n    const onSelectMedia = (media) =&gt; {\n        props.setAttributes({\n            mediaId: media.id,\n            mediaUrl: media.url\n        });\n    }\n\u00a0\n    const blockStyle = {\n        backgroundImage: attributes.mediaUrl != ''? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n    };\n    return (&lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelBody\n                    title={__('Select block background image', 'awp')}\n                    initialOpen={ true }\n                &gt;\n                    &lt;div className=\"editor-post-featured-image\"&gt;\n                        &lt;MediaUploadCheck&gt;\n                            &lt;MediaUpload\n                                onSelect={onSelectMedia}\n                                value={attributes.mediaId}\n                                allowedTypes={ ['image'] }\n                                render={({open}) =&gt; (&lt;Button \n                                        className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n                                        onClick={open}\n                                    &gt;\n                                        {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n                                        {props.media != undefined &amp;&amp; \n                                                &lt;ResponsiveWrapper\n                                                naturalWidth={ props.media.media_details.width }\n                                            naturalHeight={ props.media.media_details.height }\n                                            &gt;\n                                                &lt;img src={props.media.source_url} \/&gt;\n                                            &lt;\/ResponsiveWrapper&gt;\n                                            }\n                                    &lt;\/Button&gt;\n                                )}\n                            \/&gt;\n                        &lt;\/MediaUploadCheck&gt;\n                        {attributes.mediaId != 0 &amp;&amp; \n                            &lt;MediaUploadCheck&gt;\n                                &lt;MediaUpload\n                                    title={__('Replace image', 'awp')}\n                                    value={attributes.mediaId}\n                                    onSelect={onSelectMedia}\n                                    allowedTypes={['image']}\n                                    render={({open}) =&gt; (&lt;Button onClick={open} isDefault isLarge&gt;{__('Replace image', 'awp')}&lt;\/Button&gt;\n                                    )}\n                                \/&gt;\n                            &lt;\/MediaUploadCheck&gt;\n                        }\n                        {attributes.mediaId != 0 &amp;&amp; \n                            &lt;MediaUploadCheck&gt;\n                                &lt;Button onClick={removeMedia} isLink isDestructive&gt;{__('Remove image', 'awp')}&lt;\/Button&gt;\n                            &lt;\/MediaUploadCheck&gt;\n                        }\n                    &lt;\/div&gt;\n                &lt;\/PanelBody&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n};\nregisterBlockType('awp\/imageselectinspector', {\n    title: 'AWP Imageselect',\n    icon: 'smiley',\n    category: 'layout',\n    supports: {\n        align: true\n    },\n    attributes: {\n        mediaId: {\n            type: 'number',\n            default: 0\n        },\n        mediaUrl: {\n            type: 'string',\n            default: ''\n        }\n    }, \n    edit: withSelect((select, props) =&gt; {\n        return { media: props.attributes.mediaId? select('core').getMedia(props.attributes.mediaId): undefined };\n    })(BlockEdit),\n    save: (props) =&gt; {\n        const { attributes } = props;\n        const blockStyle = {\n            backgroundImage: attributes.mediaUrl != ''? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n        };\n        return (&lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce didacticiel explique comment ajouter un bouton de s\u00e9lection ou de t\u00e9l\u00e9chargement d&rsquo;image pour la biblioth\u00e8que multim\u00e9dia dans l&rsquo;inspecteur pour votre bloc WordPress Gutenberg personnalis\u00e9.<\/p>\n","protected":false},"author":1,"featured_media":153622,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,893,832,936,936,728,728,1110,801,801,811,811,832,841,841,862,862],"tags":[1167],"class_list":["post-234207","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-guide-pour-les-debutants","category-gutenberg-3","category-javascript-3","category-n-a","category-php-3","category-plugins-2","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234207"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234207\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/153622"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}