
みなさんこんにちは。ベクトルのいしかわでございます。
「ブロックエディタやフルサイト編集のブロックテーマはコードで管理しにくい!」
「ブロックを自作するのは JavaScript をしっかり勉強した上でビルド環境も必要だからハードルが高い!」
と思っていたみなさんに朗報です。
WordPress 7.0 ではPHPだけでブロックが作れるようになりました。
今回はそれについて紹介していきます。
- 1. プラグイン使えば今までもできた
- 2. 公式のサンプルコードで試してみる
- 3. もう少しイメージしやすいブロック例
- 4. カスタムフィールドとの違いに注意
- 5. ブロックパターンでいいんじゃね?
- 5.1.1. 以下のブロックをコピーしてエディタに貼り付け
- 5.1.2. パターンを作成
- 5.1.3. オリジナル編集画面で編集可能部分を指定
- 5.1.4. パターン配置先では上書きを有効化した部分だけが編集可能になる
- 6. PHPのブロックと同期パターンの違い
- 6.1. PHPのブロック
- 6.1.1. メリット
- 6.1.2. デメリット
- 6.2. 同期パターン
- 6.2.1. メリット
- 6.2.2. デメリット
プラグイン使えば今までもできた
使ってる方も多いと思いますが、PHPでブロック作りたかったら プラグインとかったので、今までも出来たんですけどね…。
Custom Block Builder – Lazy Blocks – WordPress プラグイン | WordPress.org 日本語
Easily create custom blocks and custom meta fields for Gutenberg without hard coding.
公式のサンプルコードで試してみる
WordPress公式の記事は下記になりますので、まずはこれに沿ってやってみましょう。
PHP-only block registration – Make WordPress Core
Developers can now create simple blocks using only PHP. This is meant for blocks that only need server-side rendering and aren’t meant to be highly interactive. It isn’t meant to replace the …
上記の記事に記載のサンプルコードを自作のプラグインや子テーマの functions.php に貼ってみます。
function gutenberg_register_php_only_blocks() {
register_block_type(
'my-plugin/example',
array(
'title' => __( 'My Example Block', 'myplugin' ),
'attributes' => array(
'title' => array(
'label' => __( 'Title', 'myplugin' ),
'type' => 'string',
'default' => 'Hello World',
),
'count' => array(
'label' => __( 'Count', 'myplugin' ),
'type' => 'integer',
'default' => 5,
),
'enabled' => array(
'label' => __( 'Enabled?', 'myplugin' ),
'type' => 'boolean',
'default' => true,
),
'size' => array(
'label' => __( 'Size', 'myplugin' ),
'type' => 'string',
'enum' => array( 'small', 'medium', 'large' ),
'default' => 'medium',
),
),
'render_callback' => function ( $attributes ) {
return sprintf(
__( '<p>%s: %d items (%s)</p>', 'myplugin' ),
esc_html( $attributes['title'] ),
$attributes['count'],
$attributes['size']
);
},
'supports' => array(
'autoRegister' => true,
),
)
);
}
add_action( 'init', 'gutenberg_register_php_only_blocks' );エディタ用で /My Example Block など入力すると配置できます。

ブロックの設定項目を変更すると表示がかわるのが確認できると思います。
もう少しイメージしやすいブロック例
以下の手順を参考に試してみてください。
- my-plugin.php というファイルを作って以下を貼り付け
- my-plugin.php を直接 /wp-content/plugins に置くか、zip にして、プラグイン > 新規追加 からファイルをアップロード
- My Plugin を有効化
- エディタ上で /商品データ と入力するとブロックが配置できます
<?php
/**
* Plugin Name: My Plugin
* Plugin URI:
* Description: これは *** のプラグインです。
* Version: 0.0.0
* Requires at least: 6.0
* Requires PHP: 7.4
* License: GPL 2.0 or Later
*/
// ※ 子テーマのfunctions.php などに貼り付けるならここから下だけでOK /////////
/**
* PHP のみで完結するブロックを登録する
*
* WordPress 7.0 で追加された supports.autoRegister を利用し、
* block.json や JS 側の registerBlockType を書かずに、
* PHP だけでブロック定義(属性・サイドバー UI・描画)を完結させる。
*
* @return void
*/
function my_gutenberg_register_php_only_blocks() {
// register_block_type に第1引数でブロック名、第2引数で定義配列を渡す
register_block_type(
'my-plugin/example', // ブロックタイプ(識別スラッグみたいなもの)
array(
// エディター上で表示されるブロック名
'title' => '商品データ',
// ブロックに持たせる属性。autoRegister=true により、
// 各属性の type に応じたコントロール UI がサイドバーへ自動生成される
'attributes' => array(
// 文字列属性 → テキスト入力
'title' => array(
'label' => '商品名',
'type' => 'string',
'default' => 'Vektor Passport',
),
// 整数属性 → 数値入力
'count' => array(
'label' => '残数',
'type' => 'integer',
'default' => 5,
),
// enum 付き文字列 → セレクトボックス(選択肢は enum の値)
'size' => array(
'label' => 'サイズ',
'type' => 'string',
'enum' => array( '小', '中', '大' ),
'default' => '中',
),
// boolean 属性 → トグルスイッチ
'on_sale' => array(
'label' => '販売中',
'type' => 'boolean',
'default' => true,
),
),
/*
* 実際に出力するブロックのPHP
*
* @param array $attributes attributes で定義したキーごとの値
* @return string フロント/エディターに出力する HTML
*/
'render_callback' => function ( $attributes ) {
// 販売中の場合
if ( $attributes['on_sale'] ) {
// 項目名と属性値の組を縦に並べたテーブルとして組み立てる
$content = '<table>';
// 商品名(title 属性)の行
$content .= '<tr>';
$content .= '<th class="text-left">商品名</th>';
$content .= '<td>' . esc_html( $attributes['title'] ) . '</td>';
$content .= '</tr>';
// 残数(count 属性)の行
$content .= '<tr>';
$content .= '<th class="text-left">残数</th>';
if ( $attributes['count'] > 0 ) {
$count = esc_html( $attributes['count'] );
} else {
$count = '在庫なし';
}
$content .= '<td>' . $count . '</td>';
$content .= '</tr>';
// サイズ(size 属性)の行
$content .= '<tr>';
$content .= '<th class="text-left">サイズ</th>';
$content .= '<td>' . esc_html( $attributes['size'] ) . '</td>';
$content .= '</tr>';
$content .= '</table>';
} else {
$content = '<p>この製品の販売は終了しました</p>';
}
return $content;
},
// このブロックが使うコアの編集機能を宣言する場所
'supports' => array(
'autoRegister' => true, // block.json も JS 呼び出しも不要になる
),
)
);
}
// init フックでブロックを登録するのが WP の慣例
add_action( 'init', 'my_gutenberg_register_php_only_blocks' );以下ののようになります。

どうです?ちょっと実際に使うイメージができますかね?
残数が 0 より小さいと「在庫なし」の表示にしたり

「販売中」のチェックを外すと「この商品の販売は終了しました」の文字に切り替えるというような処理ができます。

カスタムフィールドとの違いに注意
この「属性」はあくまで本文コンテンツにそのまま保存されますので、カスタムフィールドのように『投稿一覧でもこの値を表示する』という事ができません。
このブロックを配置する場所以外でも項目を呼び出したいなら、カスタムフィールドを用意して、このブロック内でPHPでカスタムフィールドを呼び出すようにした方が良いでしょう。
ブロックパターンでいいんじゃね?
でもね、これ同じ事がノーコードでできるんですよ。
以下のブロックをコピーしてエディタに貼り付け
アイテム名
Vektor Passport
残数
5
サイズ
中
パターンを作成

パターン名を登録して同期をオンにして追加します。

オリジナル編集画面で編集可能部分を指定

変更可能にするブロックを選んで「上書きを有効化」します

上書きする属性名を指定して有効化

パターン配置先では上書きを有効化した部分だけが編集可能になる

PHPのブロックと同期パターンの違い
今回作れるようになったPHPでのブロックと同期パターンの違いは以下のような違いがします。
PHPのブロック
メリット
- 値によって表示の出し分けが可能
- ファイルをGitでバージョン管理できる
- ファイルなので運用途中の仕様変更でもテストサーバーでの確認 > 本番反映がしやすい
デメリット
- コードを書かないと実装できない。
- CSSも時前で書かないといけない
同期パターン
メリット
- ノーコードで管理画面から実装可能
デメリット
- 属性値によって条件分岐はやりにくい。
※カスタムフィールドであれば VK Dynamic If Block などを使って条件分岐は可能 - Gitでバージョン管理しにくい
- 運用中サイトでの仕様変更は注意が必要
こういった特性の違いを理解して使い分けしましょう。
この記事を書いた人
- 代表取締役
-
名古屋のウェブ制作会社数社に10年程度務めた後、株式会社ベクトル設立。
企画・運営・コンサルティング〜WordPressを中心としたシステム開発まで幅広く携わる。
[ 著書 ]
・いちばんやさしいWordPressの教本(共著)
・現場でかならず使われているWordPressデザインのメソッド(共著)
[ 最近のWordPressコミュニティでの活動 ]
WordCamp Tokoy 2023 セッションスピーカー
WordCamp Asia 2023 セッションスピーカー(LT)
WordCamp Niigata 2019 セッションスピーカー
WordCamp Haneda 2019 セッションスピーカー
WordCamp Osaka 2018 セッションスピーカー
WordCamp Kyoto 2017 セッションスピーカー
他


を購入して
特典をゲットしよう!


特典A
X-T9 工務店
( ナチュラル )
19,800円(税込)
0円に!


特典B
Lightning ビジネス(Evergreen)
9,900円(税込)
0円に!


特典C
Lightning 工務店
( ナチュラル )
19,800円(税込)
0円に!
今なら!
Vektor Passport の
有効期間中、上記の
デモサイトデータを
何度でも素早くまるごと
インポートできます!


パターンを使って
よりクオリティの高いサイトに
パターンとは、WordPressのブロックを組み合わせて作ったデザインテンプレートのようなもの。プロのデザイナーが制作したパターンを300以上公開中!コピペしながら高品質なサイトを簡単に作れます。
ブロックエディターで
ABテストを
自由に作成できる

VK AB Testing は、ABテストを実施するための WordPress 用プラグインです。ブロックエディターでテストパターンを自由に作成でき、ランダム表示とクリック計測が可能です。Webサイトや広告などの施策の改善にぜひご活用ください。

















