My First
Gutenberg Plugin
Ryo Utsunomiya(@ryo511)
Gutenberg MeetUp vol.1
2018-03-01
自己紹介
- 宇都宮 諒(うつのみや りょう)
- 株式会社 一休 宿泊事業本部 マーケティング部
- 職種は「フロントエンドエンジニア」
- 主なお仕事
-
WordPress歴
- ユーザとして3年くらい
- 開発者として半年くらい
- Twitter: @ryo511
- 個人ブログ( https://ryo511.info/ )
一休コンシェルジュ
- 上質なホテル・旅館を紹介するメディア
- powered by WordPress!
今日は、
Gutenbergに対応した
プラグインの作り方についてお話しします
既存プラグイン:AmazonJS
- Amazonのアフィリエイトリンクを記事中に挿入するためのプラグイン
- Gutenberg非対応、最終更新2年前
最近作ったプラグイン
- AmazonJSをベースに開発
- Gutenberg対応済み 💪
使い方
{DEMO}
Gutenbergプラグインの構造
-
通常のWordPressプラグインと変わらない
- enque_block_editor_assets アクションでブロックのJSを読み込む
<?php
// index.php
/**
* Register Block JavaScript file.
*/
add_action( 'enqueue_block_editor_assets', function () {
wp_enqueue_script(
'amazon-block',
plugins_url( 'build/index.js', __FILE__ ),
array( 'wp-blocks', 'wp-element' )
);
} );
Gutenbergの基本はブロック
-
記事の編集に使用する、再利用可能な部品
ブロックの登録
import AmazonBlock from '../components/AmazonBlock';
wp.blocks.registerBlockType( 'amazon-block/amazon-block', {
title: 'Amazon',
icon: 'cart',
category: 'common',
attributes: {
// 省略
},
edit( { attributes, setAttributes } ) {
return (
<AmazonBlock
attributes={ attributes }
setAttributes={ setAttributes }
/>
);
},
save( { attributes } ) {
// 省略
},
} );
ブロックのライフサイクル
-
edit() で初期状態を出力(保存されたコンテンツを編集する際は、以前の状態の復元)
- ユーザがコンテンツを入力
- save() の結果をDBに保存
- DBに保存されたコンテンツを配信
ブロックはReactで作る
/* global React */
import { EventEmitter } from 'events';
import Search from './Search';
import SelectTemplate from './SelectTemplate';
import AffiliateItem from './AffiliateItem';
export default class AmazonBlock extends React.Component {
// constructorとcomponentDidMount は省略
render() {
const { item, template } = this.props.attributes;
if ( item && template ) {
return <AffiliateItem item={ item } template={ template } />;
} else if ( item ) {
return <SelectTemplate item={ item } event={ this.event } />;
}
return <Search event={ this.event } />;
}
}
必要な知識
-
WordPressプラグインの作り方(最低限でOK)
- HTML, CSS
- JavaScript
- React.js
- Gutenberg特有の知識
あると良い知識
-
ES2015以降のJavaScript(ES.Next)
- Babel, Webpack等を使用したビルドパイプラインの作り方
無くても良い知識
-
FLuxアーキテクチャとRedux(wp.data)
- 小規模なプラグインならReduxは不要
React.js
-
最も人気のあるJavaScriptライブラリの1つ
- npmでは2017年に5900万回ダウンロードされた
- 参考値:jQuery 4600万、Angular 1100万、Vue.js 800万
- フロントエンドエンジニアの求人で「React経験x年以上」としているものも多い
- 最近はAPIの大きな統廃合もなく、枯れてきたといえるのでは
React入門
Gutenberg特有の知識
-
Gutenbergには独特の概念や仕組みがある
- 「ブロック」の概念はGutenberg独自
- フィルタのような、WordPress本体と同様の拡張ポイントもある
- ブロックのattributesがpost_contentにHTMLコメントで埋め込まれる、といった仕組みの部分は理解が必要
-
Gutenbergを拡張するためのドキュメント
- 質・量ともにまだまだ
- 開発の速度にドキュメントが追いついていない
- コアのブロックではバリバリ使ってるのにUndocumentedなAPIがあったり
- 有志による日本語翻訳が進行中
使用したライブラリ
-
"dependencies": {},
- React等、開発に必要な最低限のライブラリは、グローバル変数から参照できる
- "devDependencies": {"babel", "webpack"}
- ReactのJSXのビルド
- ES.Nextのビルド
開発時に苦労したこと
-
Gutenbergのドキュメントが不足しているので、デバッグ時にはコアのソースを追うことが多かった
- Reactに関しては、Redux使うか迷ったくらい(結局使わなかった)
まとめ
- Gutenbergプラグインの開発はそれほど難しくはない
- Gutenberg対応プラグインの開発には、WordPress開発の知識に加え、モダンJavaScriptの知識が必須
- モダンJavaScriptの進化は小康状態。キャッチアップするなら今のうち
My First Gutenberg Plugin
By Ryo Utsunomiya
My First Gutenberg Plugin
Gutenberg Meetup vol.1(2018-03-01)
- 1,977