WordPressのブロックをテンプレートの任意の位置に振り分けて表示する方法

WordPressのクラシックテーマで制作しているWebサイトにおいて、1ページの中でブロックの表示位置を振り分ける方法について紹介しています。

テンプレートの任意の位置にGutenbergブロックを呼び出せるため、カスタムフィールドの代わりにブロックでコンテンツを管理したい場合に有効な方法です。

どのようなケースか

次の画像はカスタムブロックを2箇所に挿入したページです。

カスタムブロックを2箇所に挿入したページ

背景色グレーのセクションが3つあり、最初のセクションに「ブロックA」を、最後のセクションに「ブロックB」のカスタムブロック(黒背景に白文字のテキスト)を挿入しています。カスタムブロック以外のHTMLは全てテンプレートに直接記述しています。

エディタは次のようになっています。2つのブロックを挿入しただけのシンプルな画面です。

カスタムブロックを2箇所に挿入したページの編集画面

この方法は、ページ全体はテンプレートで構成しつつ、特定のセクションのみ編集可能にしたい場合に有効です。企業サイトを例にすると以下のようなイメージです。

ページ内コンテンツの例
- 企業情報 ← 固定
- 実績 ← ブロックを活用したい
- サービス内容 ← 固定
- お客様の声 ← ブロックを活用したい
- お問い合わせ ← 固定

本文を表示する<?php the_content(); ?>では、ブロックをセクションごとに分割して表示することは困難です。そこで今回の方法の出番となります。

動的に変更したい箇所が複数ある場合、カスタムフィールドを使うケースも多いかと思いますが、ブロックで管理したい場合や繰り返しフィールドが使えない環境では、この方法が有効な選択肢になり得ます。

実装例

早速ですが以下が実装に使用したコードです。

page.phpなど
<?php
$content = get_the_content();
$blocks = parse_blocks($content);
?>
<section>
<h2>見出し</h2>
<?php
foreach ($blocks as $block) {
if ($block['blockName'] === 'lazyblock/block-a') {
echo render_block($block);
}
}
?>
</section>
<section>
<h2>見出し</h2>
<p>テキストが入ります。テキストが入ります。テキストが入ります。</p>
</section>
<section>
<h2>見出し</h2>
<?php
foreach ($blocks as $block) {
if ($block['blockName'] === 'lazyblock/block-b') {
echo render_block($block);
}
}
?>
</section>

やっていること

コードのポイントを順に説明します。

ブロックデータの取得

テンプレートの冒頭でget_the_content()で投稿本文を取得し、parse_blocks()でブロック構造の配列に変換しています。この処理は1回のみ行い、以降は変数$blocksを使い回します。

ブロックの出力

表示したい箇所でそれぞれ$blocksをループし、引数で指定したブロック名(例:lazyblock/block-a)と一致するブロックをrender_block()でHTMLとして出力しています。render_block()はブロックデータをHTML文字列に変換するWordPressの関数です。

今回はLazy Blocksのカスタムブロックを使用していますが、コアブロックでも同様に機能します。

動作確認環境

以下の環境において動作を確認しました。

  • WordPress 6.9.4(クラシックテーマ)
  • PHP 8.0.0
  • Lazy Blocks 4.2.1

この方法のメリット・デメリット

メリットとデメリットをまとめると次のようになります。

メリットデメリット
  • テンプレートの任意の場所に任意のブロックを挿入できる
  • レイアウトを固定できるため、編集ミスでレイアウトが崩れない
  • HTMLを綺麗に保てる(不要なラッパーを排除できる)
  • カスタムフィールドライクにカスタムブロックを使用できる
  • 編集画面から自由にレイアウトをコントロールできない
  • エディタとフロントの見た目が乖離する
  • ブロックがデータを持ってしまうため、WordPressの思想とは少しズレる

冒頭でも触れましたが、カスタムフィールドの繰り返し機能を使用できない現場ではかなり有効な方法だと感じています。

この方法は、ブロックを「レイアウト要素」ではなく「コンテンツデータ」として扱う設計とも言えます。デメリットを把握しつつ適切な場面で使用していきたいです。

この記事を書いた人

写真:ブール 代表 西川雅人

Masato Nishikawa

ウェブ制作の現場でコーディングパートナーとして活動しているコーダーです。実務で得た知見やノウハウを、このブログで発信しています。

コーディングや
WordPress実装の
ご相談を承っています。

新規制作から運用フェーズの修正まで柔軟に対応します。
お見積りや実装可否の確認など、お気軽にご連絡ください。