応用編
Gutenbergブロック開発
WordPressのブロックエディタ(Gutenberg)用のカスタムブロックを作成します。React/JSXを使って、編集画面と表示画面をそれぞれ実装する方法を学びましょう。
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 -->',
)
);
} );
演習:シンプルなカスタムブロックを作ろう
課題
@wordpress/create-blockでブロックのひな型を生成する- テキストと背景色を設定できる「カラーカード」ブロックを作成する
- InspectorControlsに色選択コントロールを追加する
- npm run buildでビルドし、実際のエディタで動作確認する
この章のチェックリスト
- create-blockでひな型を生成できた
- block.jsonの役割を理解した
- edit.jsとsave.jsの違いを理解した
- InspectorControlsでサイドバーコントロールを追加できた
- ブロックパターンを登録できた
関連ページ・次のステップ
前提知識
- STEP 4: 機能を実装する(フック・ショートコード)
- STEP 5: フロントエンド機能(CSS/JS読み込み)
あわせて学ぶ
- REST API拡張(ブロックからAPIを呼び出す)
- WP-CLIコマンド開発(ブロックの一括操作)
補足
- 実例集(カスタムブロックの実装例)
- トラブルシューティング