前回までの記事の続きです。今回はWordpress5 Gutenberg のBlockに cssを追加する方法です。
前回までの記事はこちら
- [WordPress5]ジェネレーターを使わずにゼロからBlockを作って仕組みを見ていきます
- [WordPress5]ジェネレーターを使わずにゼロからBlockを作って仕組みを見ていきます その2 esnext版
参考にしたサイトは、ここ「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"
}
}