Gutenbergとカスタムブロックとは

Gutenbergとは、WordPress 5.0から導入されたブロックエディタです。段落・画像・見出しなどの「ブロック」を組み合わせて記事を作成します。プラグインで独自のカスタムブロックを追加することで、ユーザーが簡単に複雑なレイアウトを作れるようになります。

カスタムブロックでできること

  • アラートボックス、料金表、タイムラインなど独自UIを提供
  • 管理画面での見た目をフロントエンドに近づけられる
  • ショートコードより直感的に使えるコンテンツ部品を作れる

プラグインとテーマ、どちらでブロックを作る?

カスタムブロックは、プラグインとしてもテーマとしても作成できます。配布・再利用を前提とするならプラグイン(本ページの方法)、特定のテーマ専用で使うだけならテーマ内での実装が向いています。テーマ側での実装方法は応用編: ブロックエディタ対応で解説しています。

開発環境の準備

Gutenbergブロックの開発にはNode.jsとnpmが必要です。@wordpress/create-blockを使うと、ひな型を自動生成できます。

# Node.js(v16以上)とnpmをインストール後 # ブロックのひな型を生成(プラグインフォルダで実行) npx @wordpress/create-block my-pricing-block # 生成されたフォルダに移動 cd my-pricing-block # 開発サーバーを起動(ファイル変更を自動ビルド) npm start # 本番用ビルド npm run build

生成されるファイル構成

src/edit.js(編集画面)、src/save.js(保存HTML)、src/block.json(ブロック設定)の3ファイルが中心です。

ブロックの基本構成

block.json — ブロックの設定ファイル

{ "apiVersion": 2, "name": "mfp/pricing-table", "title": "料金表カード", "category": "widgets", "icon": "money-alt", "description": "プラン名・価格・注目バッジ付きの料金表カードを挿入します", "textdomain": "my-pricing-block", "attributes": { "planName": { "type": "string", "default": "スタンダードプラン" }, "price": { "type": "string", "default": "\u00a51,980" }, "highlight": { "type": "boolean", "default": false } }, "editorScript": "file:./index.js", "style": "file:./style-index.css" }

edit.js — 編集画面の実装

import { useBlockProps, RichText, InspectorControls } from '@wordpress/block-editor'; import { PanelBody, ToggleControl } from '@wordpress/components'; export default function Edit( { attributes, setAttributes } ) { const { planName, price, highlight } = attributes; const blockProps = useBlockProps(); return ( <> {/* サイドバーのコントロール */} <InspectorControls> <PanelBody title="表示設定"> <ToggleControl label="注目プランとして強調表示" checked={ highlight } onChange={ val => setAttributes({ highlight: val }) } /> </PanelBody> </InspectorControls> {/* 編集画面のプレビュー */} <div { ...blockProps } className={ `pricing-card ${ highlight ? 'is-highlighted' : '' }` }> <RichText tagName="h3" value={ planName } onChange={ val => setAttributes({ planName: val }) } placeholder="プラン名を入力..." /> <RichText tagName="p" className="pricing-card__price" value={ price } onChange={ val => setAttributes({ price: val }) } placeholder="価格を入力..." /> </div> </> ); }

save.js — 保存HTMLの実装

import { useBlockProps, RichText } from '@wordpress/block-editor'; export default function Save( { attributes } ) { const { planName, price, highlight } = attributes; const blockProps = useBlockProps.save(); return ( <div { ...blockProps } className={ `pricing-card ${ highlight ? 'is-highlighted' : '' }` }> <RichText.Content tagName="h3" value={ planName } /> <RichText.Content tagName="p" className="pricing-card__price" value={ price } /> </div> ); }

ブロックパターンの登録

複数のブロックを組み合わせたレイアウトを「パターン」として登録しておくと、ユーザーがワンクリックで挿入できます。

add_action( 'init', function() { register_block_pattern( 'mfp/hero-section', array( 'title' => 'ヒーローセクション', 'description' => '大きな見出しとボタンのセット', 'categories' => array( 'featured' ), 'content' => '<!-- wp:heading {"level":1} --><h1>タイトル</h1><!-- /wp:heading --><!-- wp:buttons --><div class="wp-block-buttons"><!-- wp:button --><div class="wp-block-button"><a class="wp-block-button__link">詳しく見る</a></div><!-- /wp:button --></div><!-- /wp:buttons -->', ) ); } );

演習:シンプルなカスタムブロックを作ろう

課題

  1. @wordpress/create-block でブロックのひな型を生成する
  2. テキストと背景色を設定できる「カラーカード」ブロックを作成する
  3. InspectorControlsに色選択コントロールを追加する
  4. npm run buildでビルドし、実際のエディタで動作確認する

この章のチェックリスト

  • create-blockでひな型を生成できた
  • block.jsonの役割を理解した
  • edit.jsとsave.jsの違いを理解した
  • InspectorControlsでサイドバーコントロールを追加できた
  • ブロックパターンを登録できた

関連ページ・次のステップ

前提知識

あわせて学ぶ

補足

↑