WordPressのGutenbergのハンドブックやGitHubの内容などを参考にして、求める機能の実装を試した内容です。
注意点
- Gutenbergがコアに入る前の段階の記事です
- 書き方だけではなく、語句や名称にも問題がある可能性があります
- バッドノウハウな状態だと思いますので、読む方は参考程度に考えてください
- 私自身の書き方がまだ固まっていないためと参考にしたサンプルの都合上、当ブログ内のサンプルコードにはアロー関数の使用の有無などに表記揺れがあります
実現したいこと
- Gutenbergでブロック編集時にサイドバーにラジオボタンを設定
- ラジオボタンでdivのクラスを変更して、そのdivに囲まれたulを出力する
- divのクラス名にはwp-block-〇〇のような自動出力のクラスを出力させない
- 初期値として任意のHTMLを設定する
ハンドブックやGitHubでは以下のページに説明があります。
- Block Controls: Toolbars and Inspector
- RadioControl
- gutenberg/block-library/html/index.js
- gutenberg/components/code-editor/README.md
サンプルコード

以下がサンプルコードです。
なお、限定的な目的のために作っていますので(今回であればliの中にテキストやspanやaが入る程度)、「何を入れても問題なく表示される」かどうかは確認していませんし、そういう用途は意図していません。その点は留意してください。
その他懸念点などは、今回の仕組みの基本部分に触れている「Gutenbergメモ カスタムHTMLを使う」の記事を参照してください。
//初期設定
add_action( 'enqueue_block_editor_assets', function() {
wp_enqueue_script(
'myplugin-gutenberge',
plugins_url( 'block.js', __FILE__ ),
[ 'wp-blocks', 'wp-element', 'wp-components', 'wp-editor' ]
);
} );
const { registerBlockType } = wp.blocks;
const { CodeEditor, PanelBody, RadioControl } = wp.components;
const { RawHTML, Fragment } = wp.element;
const { InspectorControls } = wp.editor;
registerBlockType( 'my-plugin/test-codeeditor-radio', {
title: 'test-codeeditor-radio',
icon: 'universal-access-alt',
category: 'layout',
supports: {
className: false,
},
attributes: {
content: {
type: 'string',
//初期値が要らない場合はdefaultなしでよい
default: '<ul>\n\t<li>default HTML</li>\n</ul>',
},
option:{
tuype: 'string',
default: 'block-a',
}
},
edit( { attributes, setAttributes } ) {
const { content, option } = attributes;
const onChangeContent = newContent => {
setAttributes( { content: newContent } );
};
const onChangeOption = newOption => {
setAttributes( { option: newOption } );
};
return(
<Fragment>
<InspectorControls>
<PanelBody title="クラス名">
<RadioControl
label="任意のクラス付きdivで囲んだul"
help="種類(クラス名)を選んでください"
selected={ option }
options={ [
{ label: '種類A(block-a)', value: 'block-a' },
{ label: '種類B(block-b)', value: 'block-b' },
{ label: '種類C(block-c)', value: 'block-c' },
] }
onChange={ onChangeOption }
/>
</PanelBody>
</InspectorControls>
<div className="wp-block-html">
<p>{ attributes.option }クラスを設定</p>
<CodeEditor
value={ attributes.content }
onChange={ onChangeContent }
/>
</div>
</Fragment>
);
},
save( { attributes } ) {
const { content, option } = attributes;
return (
<div className={ attributes.option }>
<RawHTML>{content}</RawHTML>
</div>
);
},
} );
投稿画面表示時に内容がわかるように、この部ブロックの真上に「block-aクラスを設定」という文言を出力しています。
supportsでclassNameをfalseにすることにより、自動で追加されるクラス名の出力を停止させています。
ひな形(初期値)を作る
今回の重要ポイントの1つが、ひな形を用意することでした。
運用を考えた場合、使うブロックに0からHTMLを入れるのは手間がかかりすぎますし、基本形となる構造を全て覚えているのでもなければどう書けば良いか忘れることも十分考えられます。
この問題を解決するために、追加したブロック自体にひな形としてのHTMLを用意できれば良いのではと考え、コードを作成しました。
具体的には、前述のコードの以下の部分です。
attributes: {
content: {
type: 'string',
//初期値が要らない場合はdefaultなしでよい
default: '<ul>\n\t<li>default HTML</li>\n</ul>',
},
defaultの値を他のHTML構造に丸ごと変えて対応もできるため、色々と便利に使えるのではと思います。
なお、defaultの\r\tは、一応コードエディタの挙動に合わせてliの前に改行とタブスペースを1つ分入れるためにつけています。
\rも\tも取れば隙間なく1行で表示させることもできます。
関連記事
Gutenberg(ブロックエディタ)に関連する記事一覧。
- [Gutenberg対応版]WordPressで複数のCSSをまとめてインラインCSSとして出力する
- @wordpress/create-blockで一つのプラグインに複数のブロックを入れる
- @wordpress/wp-env と @wordpress/create-block で簡単にブロック開発環境を作る
- 3度目のブロック開発環境(Docker Desktopとcreate-block)
- Gutenberg(ブロックエディタ)メモ
- Gutenberg(ブロックエディタ)メモ -Gutenbergの使い方で迷うところ
- Gutenberg(ブロックエディタ)メモ -ハンドブックでわからないところ1
- Gutenberg(ブロックエディタ)メモ -ハンドブックでわからないところ2
- Buttonを使う(MediaUploadとRichTextも含む)
- metaデータを設定する
- Templatesとplaceholderを使う
- Toggleを使う
- カスタムHTMLを使う
- サイドバー(Inspector)を設定する
- サイドバーを作ってcheckboxを使う
- サイドバーを作ってラジオボタンを使う
- ショートコードの代替案的なブロックを作る
- ラジオボタンでクラスを変更可能なコードエディタブロックを作る [現在表示中]
- 登録されているショートコードの一覧を表示したブロックを作る
- AddQuicktagのGutenberg対応に関して
- Classic Editorプラグインに関して
- wp_is_mobile関数を利用して出し分け機能をもったブロックを作る
- 任意のHTMLタグを範囲選択で挿入可能なツールバーを付ける
- 任意のHTMLタグを範囲選択で挿入可能なボタンをRichTextのツールバーに追加する
- 自動でテーマCSSの指定箇所をGutenberg用CSSとして用いる方法の検討
- 自動で出力されるブロック用のCSSを取除く
- Gutenberg関連の参考サイト:メモ
- WPのsetMeta()で複数のキーと値を保存する
- WPのブロックエディタでTypeError: Cannot read property ‘firstChild’ of nullのエラー:メモ
- WPのブロックエディタでUncaught Error: Minified React error #321のエラー:メモ
- WPのブロックエディタでタグをドロップダウンで変更する:メモ
- WPのブロックエディタでブロック追加用ボタンを表示させる:メモ
- WPのブロックエディタで親の値を子に設定する:メモ
- WPのブロック作成メモ
- WPの独自ブロックが設定されている時のみCSSやJSをフロントに表示する方法
- ブロック作成時のclassNameに関するメモ
- ブロック開発の環境構築におけるwp-scriptsとCreate Guten Blockのメモ
3人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。