[ 解説動画あり ] WordPress 7.0 新機能紹介 PHPだけでブロックを作れるようになった機能を試してみる 〜 同期パターンとの違い


  1. Staff Blog
  2. WordPress
  3. [ 解説動画あり ] WordPress 7.0 新機能紹介 PHPだけでブロックを作れるようになった機能を試してみる 〜 同期パターンとの違い
「WordPress 7.0 新機能紹介」「PHPだけでブロックを作れるようになった機能を試してみる」。WordPressロゴといしかわ。

みなさんこんにちは。ベクトルのいしかわでございます。

「ブロックエディタやフルサイト編集のブロックテーマはコードで管理しにくい!」

「ブロックを自作するのは JavaScript をしっかり勉強した上でビルド環境も必要だからハードルが高い!」

と思っていたみなさんに朗報です。

WordPress 7.0 ではPHPだけでブロックが作れるようになりました。

今回はそれについて紹介していきます。

プラグイン使えば今までもできた

使ってる方も多いと思いますが、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 など入力すると配置できます。

ブロックの設定項目を変更すると表示がかわるのが確認できると思います。

もう少しイメージしやすいブロック例

以下の手順を参考に試してみてください。

  1. my-plugin.php というファイルを作って以下を貼り付け
  2. my-plugin.php を直接 /wp-content/plugins に置くか、zip にして、プラグイン > 新規追加 からファイルをアップロード
  3. My Plugin を有効化
  4. エディタ上で /商品データ と入力するとブロックが配置できます
<?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' );

以下ののようになります。

WordPress編集画面のSample Page。商品データ表に「Vektor Passport」、残数5、サイズ中を表示し、右側で設定を編集している。

どうです?ちょっと実際に使うイメージができますかね?

残数が 0 より小さいと「在庫なし」の表示にしたり

WordPress編集画面。商品データ「Vektor Passport」の残数を0に設定し、表の残数欄に「在庫なし」と表示されている。

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

WordPress編集画面。商品データ「Vektor Passport」は残数0で、販売中チェックが外れ、本文に販売終了メッセージが表示。

カスタムフィールドとの違いに注意

この「属性」はあくまで本文コンテンツにそのまま保存されますので、カスタムフィールドのように『投稿一覧でもこの値を表示する』という事ができません。

このブロックを配置する場所以外でも項目を呼び出したいなら、カスタムフィールドを用意して、このブロック内でPHPでカスタムフィールドを呼び出すようにした方が良いでしょう。

ブロックパターンでいいんじゃね?

でもね、これ同じ事がノーコードでできるんですよ。

以下のブロックをコピーしてエディタに貼り付け

アイテム名

Vektor Passport

残数

5

サイズ

STEP
1

パターンを作成

WordPress固定ページ編集画面。グループブロックの三点メニューを開き、「パターンを作成」が強調表示されている。

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

WordPress編集画面で「パターンを追加」ダイアログを表示。名前は「商品データパターン」、同期オンが強調されている。
STEP
2

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

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

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

STEP
3

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

WordPress編集画面。Sample Pageの商品データパターンで、アウトラインの「size」と本文のサイズ値「大」が選択されている。
STEP
4

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 セッションスピーカー
 Vektor Passport

を購入して

特典をゲットしよう!

X-T9 工務店
( ナチュラル )

19,800円(税込)

0に!

Lightning ビジネス(Evergreen)

9,900円(税込)

0に!

Lightning 工務店
( ナチュラル )

19,800円(税込)

0に!

今なら!

Vektor Passport の
有効期間中、上記の
デモサイトデータを
何度でも素早くまるごと
インポートできます!

爆速!!1分デモサイトと同じ
ホームページができる

VK FullSite Installer のロゴ

選んだデモサイトと同じ状態の WordPress サイトを、わずか数ステップで再現できるインポート専用プラグインです。数クリックで、プロ品質のサイトがすぐに起動します。

フルサイト編集に対応したブロックテーマ X-T9

フルサイト編集対応ブロックテーマ

WordPress テーマ X-T9 は、WordPress 5.9 から実装されたフルサイト編集機能に対応した「ブロックテーマ」と呼ばれる新しい形式のテーマです。
ヘッダーやフッターなど、今までのテーマではカスタマイズが難しかったエリアもノーコードで簡単・柔軟にカスタマイズする事ができます。

パターンを使って

よりクオリティの高いサイトに

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

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


このデモサイトは Vektor,Inc. のテーマとプラグインで構築されています。ご購入や詳細情報は下記のリンクもご参考ください。

PAGE TOP