投稿を書いてる時にそのBlockをPreviewで確認できるようにするにはどうするか試してみます。

 今回の記事の参考元は、ここ「Gutenberg Handbook TabPanel」、これに以前書いた「Blockを作って仕組みを見ていきます その4 editor機能で文字を書けるようにする」の中で使ったRichTextを組み合わせています。出来上がりはこんな感じになります。

ベースにするBlockを作成

Block ジェネレータに、これ「create-guten-block」を使っています。

pluginsフォルダに移動

ターミナルを開いて、自分のwordpressのpluginsフォルダで実行します。私の場合、こんな感じのフォルダ。

cd /var/www/html/wp-content/plugins

Blockを作成

移動したら、「create-guten-block」コマンドで、pluginのテンプレートをジェネレート

npx create-guten-block my-block
cd my-block

これで、元になるBlockの作成が終わりました。今回は、追加のライブラリを使うので、@wordpress/components をインストール。

npm install @wordpress/components --save

ここまで行ったら、次のコマンドを打って、自動ビルドをSTARTします。

npm start

Tabを実装

それでは、コードの実装をしていきます。次のファイルを編集していきます。 my-block/src/block/block.js

block.js

 まだAttributeについて理解が足りないため、色々試行錯誤中です。まだ、editしたものをHTMLのObjtctとして「hpq」と言うライブラリを通してなんとかしているっぽい、、ぐらいしか理解できていません。なので、RichTextという以前の記事で使ったコンポーネントを使ってそのあたりは、Gutenberg Handbookにあったお作法通りにしています。それを、TabPanelの中に「text」/ 「preview」と分けて入れ込んでみました。

/**
 * BLOCK: my-block
 */

//  Import CSS.
import './style.scss';
import './editor.scss';

const { __ } = wp.i18n; // Import __() from wp.i18n
const { registerBlockType } = wp.blocks; // Import registerBlockType() from wp.blocks
import { TabPanel } from '@wordpress/components';
const { RichText } = wp.editor;


const onSelect = ( tabName ) => {
    console.log( 'Selecting tab', tabName );
};

const MyTabPanel = ({className, attributes : { content }, setAttributes}) => {

	function onChangeContent( newContent ) {
    	setAttributes( { content: newContent } );
    }
    
	return (
    <TabPanel className="my-tab-panel"
        activeClass="active-tab"
        onSelect={ onSelect }
        tabs={ [
            {
                name: 'tab1',
                title: 'text',
                className: 'tab-one',
            },
            {
                name: 'tab2',
                title: 'preview',
                className: 'tab-two',
            },
        ] }>
        {
            ( tab ) => <div>
                  {tab.name === 'tab1' ? (
			        <RichText
		                tagName="p"
		                className={ className }
		                onChange={ onChangeContent }
		                value={ content }
		            />
			      ) : (
			    	<RichText.Content
		                tagName="p"
		                value={ content }
		            />
			      )}
            </div>
        }
    </TabPanel>)
};


registerBlockType( 'cgb/block-my-block', {
	title: __( 'my-block - CGB Block' ),
	icon: 'shield',
	category: 'common',
	keywords: [
		__( 'my-block — CGB Block' ),
		__( 'CGB Example' ),
		__( 'create-guten-block' ),
	],
	attributes: {
        content: {
            type: 'string',
            source: 'html',
            selector: 'p',
        },
    },

	edit: function( {setAttributes, className, attributes} ) {

		return (
			<div className={ className }>
				<MyTabPanel
					attributes={attributes}
					className={className}
					setAttributes={setAttributes}
					/>
			</div>
		);
	},

	save: function( props ) {
		const { content } = props.attributes;
        return (
            <RichText.Content
                tagName="p"
                value={ content }
            />
        );
	},
} );

Blockを確認

wordpressの設定画面で、pluginをactivateしたあと、記事の投稿でBlockが使えるようになっていれば完成です。(※ Plugin名、Block名は、ジェネレーターで作成されたものをそのまま使っていれば、my-block と言う名前になっていると思います。)