【WordPressブロック開発】モーダルブロックを作成しよう

WordPressのエディターで入力したテキストがポップアップ表示されるモーダルブロックを作成してみます。

モーダルブロックの挙動

モーダルブロックをエディターに挿入すると入力BOXとボタンが表示されます。

Modalボタンを押下すると、モーダルが表示し、入力値が渡されて表示されます。

フロントエンドにも入力値を渡し、データベースに保存します。

モーダルブックソース

block.json

message属性を定義します。デフォルトの入力値は空にします。

	"attributes": {
		"message": {
			"type": "string",
			"default": "",
			"source": "text"
		}
	},

edit.js

適切なクラス名を付与するuseBlockProps、エディターにUIを表示するコンポーネント、状態管理のuseStateをインポートします。

ボタンをクリックするたびにstateの状態のbooleanを更新し、isOpenがtrueの場合はモーダルを表示します。モーダルにはmessage属性を渡して表示します。

import { useBlockProps } from "@wordpress/block-editor";
import { TextControl, Button, Modal } from "@wordpress/components";
import { useState } from "@wordpress/element";

export default function Edit({ attributes, setAttributes }) {
	const { message } = attributes;
	const blockProps = useBlockProps();
	const [isOpen, setIsOpen] = useState(false);

	return (
		<div {...blockProps}>
			<TextControl
				placeholder="Enter..."
				value={message}
				onChange={(value) => {
					setAttributes({ message: value });
				}}
			/>
			<Button variant="primary" onClick={() => setIsOpen(true)}>
				Modal
			</Button>
			{isOpen && (
				<Modal onRequestClose={() => setIsOpen(false)}>
					<p>次のテキストが入力されました。</p>
					<p>{message}</p>
				</Modal>
			)}
		</div>
	);
}

save.js

エディターから渡ってきたmessage属性を表示します。

import { useBlockProps } from "@wordpress/block-editor";

export default function save({ attributes }) {
	const { message } = attributes;

	return (
		<div {...useBlockProps.save()}>
			<p>次のテキストが入力されました。</p>
			<p>{message}</p>
		</div>
	);
}

style.scss

.wp-block-create-block-my-block {
	background-color: lightblue;
	padding: 2em;
}