前回までの記事の続きです。今回はWordpress5 Gutenberg のBlockに cssを追加する方法です。

前回までの記事はこちら

参考にしたサイトは、ここ「Applying Styles From a Stylesheet 」です。editor用のCSSと表示用のCSS

ファイル構成

前回の「その2」から追加になったのは、style.css, editor.css の二つ、あとはinit.php, block.jsに修正を加えています。

blockの class 名は、block名(register_block_typeで使ってるやつかな?)に wp-block- がプレフィックスとして付いてきて、途中のセパレーター( / )を( – )に置き換えてねって、参考サイトに書いてありました。

以下抜粋

The class name is generated using the block’s name prefixed with wp-block-, replacing the / namespace separator with a single -.

style.css

.wp-block-gutenberg-examples-example-02-stylesheets {
	color: darkred;
	background: #fcc;
	border: 2px solid #c99;
	padding: 20px;
}

editor.css

.wp-block-gutenberg-examples-example-02-stylesheets {
	color: green;
	background: #cfc;
	border: 2px solid #9c9;
	padding: 20px;
}

index.php

wp_register_style 関数で、styleとeditor styleの二つを登録。

<?php
/**
 * Plugin Name: Gutenberg Examples Stylesheets
 * Plugin URI: https://github.com/WordPress/gutenberg-examples
 * Description: This is a plugin demonstrating how to register new blocks for the Gutenberg editor.
 * Version: 1.0.2
 * Author: the Gutenberg Team
 *
 * @package gutenberg-examples
 */
defined( 'ABSPATH' ) || exit;
/**
 * Load all translations for our plugin from the MO file.
*/
add_action( 'init', 'gutenberg_examples_02_load_textdomain' );
function gutenberg_examples_02_load_textdomain() {
	load_plugin_textdomain( 'gutenberg-examples', false, basename( __DIR__ ) . '/languages' );
}
/**
 * Registers all block assets so that they can be enqueued through Gutenberg in
 * the corresponding context.
 *
 * Passes translations to JavaScript.
 */
function gutenberg_examples_02_register_block() {
	if ( ! function_exists( 'register_block_type' ) ) {
		// Gutenberg is not active.
		return;
	}
	wp_register_script(
		'gutenberg-examples-02',
		plugins_url( 'block.build.js', __FILE__ ),
		array( 'wp-blocks', 'wp-i18n', 'wp-element' ),
		filemtime( plugin_dir_path( __FILE__ ) . 'block.build.js' )
	);
	wp_register_style(
		'gutenberg-examples-02-editor',
		plugins_url( 'editor.css', __FILE__ ),
		array( 'wp-edit-blocks' ),
		filemtime( plugin_dir_path( __FILE__ ) . 'editor.css' )
	);
	wp_register_style(
		'gutenberg-examples-02',
		plugins_url( 'style.css', __FILE__ ),
		array( ),
		filemtime( plugin_dir_path( __FILE__ ) . 'style.css' )
	);
	register_block_type( 'gutenberg-examples/example-02-stylesheets', array(
		'style' => 'gutenberg-examples-02',
		'editor_style' => 'gutenberg-examples-02-editor',
		'editor_script' => 'gutenberg-examples-02',
	) );
  if ( function_exists( 'wp_set_script_translations' ) ) {
    /**
     * May be extended to wp_set_script_translations( 'my-handle', 'my-domain',
     * plugin_dir_path( MY_PLUGIN ) . 'languages' ) ). For details see
     * https://make.wordpress.org/core/2018/11/09/new-javascript-i18n-support-in-wordpress/
     */
    wp_set_script_translations( 'gutenberg-examples-02', 'gutenberg-examples' );
  }
}
add_action( 'init', 'gutenberg_examples_02_register_block' );

block.js

const { __, setLocaleData } = wp.i18n;
const { registerBlockType } = wp.blocks;

registerBlockType( 'gutenberg-examples/example-02-stylesheets', {
    title: 'Hello World (Step 2)',

    icon: 'universal-access-alt',

    category: 'layout',

    edit( { className } ) {
        return <p className={ className }>Hello editor.</p>;
    },

    save() {
        return <p>Hello saved content.</p>;
    }
} );

動作確認

今回もesnextでソースをかいているので、buildしてから試します。

npm install
npm run build

ビルドしたら、pluginをActivateして、Blockの動きを見ていきます。 まず、editor.css はこっちの記事を描く時

style.cssは、普通に記事を開いた時

と文字色、背景色がそれぞれ反映されているのが確認できますね。


補足: ビルド用ファイル

webpack.config.js

module.exports = {
    entry: './block.js',
    output: {
        path: __dirname,
        filename: 'block.build.js',
    },
    module: {
        loaders: [
            {
                test: /.js$/,
                loader: 'babel-loader',
                exclude: /node_modules/,
            },
        ],
    },
};

.babelrc

{
	"presets": [
		[ "env", {
			"modules": false,
			"targets": {
				"browsers": [
					"last 2 Chrome versions",
					"last 2 Firefox versions",
					"last 2 Safari versions",
					"last 2 iOS versions",
					"last 1 Android version",
					"last 1 ChromeAndroid version",
					"ie 11"
				]
			}
		} ]
	],
	"plugins": [
		[ "transform-react-jsx", {
			"pragma": "wp.element.createElement"
		} ]
	]
}

package.json

{
  "name": "01-basic-esnext",
  "version": "1.0.0",
  "license": "GPL-2.0-or-later",
  "main": "block.js",
  "devDependencies": {
    "babel-core": "^6.25.0",
    "babel-loader": "^7.1.1",
    "babel-plugin-transform-react-jsx": "^6.24.1",
    "babel-preset-env": "^1.6.0",
    "cross-env": "^5.0.1",
    "webpack": "^3.1.0"
  },
  "scripts": {
    "build": "cross-env BABEL_ENV=default NODE_ENV=production webpack",
    "dev": "cross-env BABEL_ENV=default webpack --watch"
  }
}