Gutenberg 3.9 を使用します。

Gutenbergブロックの開発環境の構築

開発環境はCreate Guten Blockで構築されたものを使用します。
よかったらこちらの記事もご覧ください。

Create Guten BlockでGutenbergのカスタムブロック開発環境を構築する

準備

src/block.jsにこれから作成するファイルをインポートします。
block-imageというディレクトリ名にしてこの中に作成します。

src/block.js

  1. import './block-image/block.js'

新たに作成したブロックを追加してみてください。
編集できるようになっていますね。

ソースコード

src/block-image/block.js

  1. import './style.scss';
  2. import './editor.scss';
  3.  
  4. const { registerBlockType } = wp.blocks;
  5. const { MediaUpload } = wp.editor;
  6. const { Button } = wp.components;
  7.  
  8. registerBlockType( 'myblock/block-image', {
  9. title: '画像ブロック',
  10. icon: 'index-card',
  11. category: 'common',
  12. attributes: {
  13. mediaID: {
  14. type: 'number'
  15. },
  16. mediaURL: {
  17. type: 'string',
  18. source: 'attribute',
  19. selector: 'img',
  20. attribute: 'src'
  21. }
  22. },
  23. edit ( props ) {
  24. const {
  25. className,
  26. attributes: {
  27. mediaID,
  28. mediaURL
  29. },
  30. setAttributes,
  31. } = props;
  32.  
  33. const onSelectImage = ( media ) => {
  34. setAttributes( {
  35. mediaURL: media.url,
  36. mediaID: media.id,
  37. } );
  38. };
  39.  
  40. return (
  41. <div className={ className }>
  42. <div className="image">
  43. <MediaUpload
  44. onSelect={ onSelectImage }
  45. type="image"
  46. value={ mediaID }
  47. render={ ( { open } ) => (
  48. <Button className={ mediaID ? 'image-button' : 'button button-large' } onClick={ open }>
  49. { ! mediaID ? '画像アップロード': <img src={ mediaURL } /> }
  50. </Button>
  51. ) }
  52. />
  53. </div>
  54. </div>
  55. );
  56. },
  57. save ( props ) {
  58. const {
  59. attributes: { mediaURL }
  60. } = props;
  61. return (
  62. <div>
  63. {
  64. mediaURL && (
  65. <img className="upload-image" src={ mediaURL } alt="アップロードした画像" />
  66. )
  67. }
  68. </div>
  69. );
  70. },
  71. } );
4〜6行目
画像をアップロードするために「MediaUpload」と「Button」を使います。
23〜56行目
編集画面では、画像が選択されている状態では画像が表示されて、それ以外ではボタンが表示され、クリックするとメディア選択ポップアップが立ち上がるという処理になっています。
57〜70行目
表示画面では「mediaURL 」がある場合は画像を表示するという処理をしています。

以上で完了です。これだけだとむしろ通常の画像ブロックよりしょぼいんですが、前回の記事のテキスト入力とスタイルを組み合わせることで、色々と表現できる範囲が増広がりそうです。

下記のコードを参考にさせて頂きました。

gutenberg-examples/05-recipe-card-esnext/block.js