ブロックテーマを有効化しているサイトで「外観」→「エディター」メニューからテーマの設定を編集する「サイトエディター」。

固定ページごとに別のデザインを使ったり、投稿タイプによってデザインの変更をした時などに、簡単に追加でき、かつ、その場でカスタマイズができるというWordPress唯一と言っていいほどの便利機能ですね。

WordPress6.3では、この機能を使うための画面構成や動きが大きく変わり、より使いやすく、より分かりやすくなった印象を受けます。

そこでちょっと気になったのが、テンプレート追加時に表示される基礎となるテンプレートの選択画面に何かを追加できそうな余白があるのに、サイトエディターのどこにも追加や管理をする項目がないことです。

具体的にはテンプレートを追加し、実際の編集を始める前に出てくる以下のような画面です。

サイトエディターの「パターンを選択」画面で選択できるテンプレートを増やす方法|Personal WP Customization Notes (PWCN)

これはTwenty Twenty-Twoテーマで、カスタム投稿タイプ用のテンプレートを追加した時に表示された画面で、パターンが1つ表示され、それを使ってカスタマイズするか、右下の「スキップ」をクリックして、空白から自身で作っていくのかを選択できるようになっています。

ここにレイアウトやデザインのカスタマイズをしたものを登録しておいて呼び出せたら、テンプレートを作る際にちょっと便利になりそうですよね?

でもいろいろ触っても管理画面上にはその設定はありませんでした(泣)。

あきらめずにいろいろと探していたら、方法がやっと見つかり、体形的なコードができましたので、本ページでは、この画面の中に、予め自身で作っておいたテンプレートデザインを追加して、新規テンプレート作成時に選択できるようにするためのコードを、自身のメモを兼ねて紹介します。

文献を検索していると、この機能はWordPress6.2で追加されたようなことも書かれているのですが、テストしてみた感じでは、実際にGUIとして登場したのは6.3だと思われます。

「パターンを選択」画面で選択できるテンプレートを増やす方法

以下のコードを有効化しているテーマのfunctions.php、または自作プラグインから読み込まれるようにして追加し、必要な部分を修正することで機能します。

/* デフォルトテンプレート追加 */
function sample_default_template_pattern_init(){
$pattern = [
"title" => __('テンプレートの名前',''),
"templateTypes" => array("適用するテンプレートの種類"),
"content" => '
--- ここにブロック類を挿入 ---
',
];

register_block_pattern($pattern["title"], $pattern);
}
add_action('admin_init', 'sample_default_template_pattern_init');

コード内のパラメーターの設定方法など

「title」パラメーター

「テンプレートの名前」の部分を編集して、一意の名前を付けます。

「テンプレートの名前」は、半角英数字で空白のない文字列を指定したほうが無難です。日本語や空白等がある場合はエラーとなるかも知れません(テストはしていません)

「templateTypes」パラメーター

上記コードの「適用するテンプレートの種類」のところを編集し、どのテンプレートを作成する際の選択肢として表示させるのかを指定します。

以下が「templateTypes」パラメーターに設定できる値です(恐らくこの機能を使うシーンは固定ページとカスタム投稿タイプのテンプレート作成時位かと思いますが一応..)。

※解釈に間違いがあるといけないので、プログラム内の英語説明文と日本語訳を両方掲載しています

default_template_types適用されるテンプレートの種類
indexUsed as a fallback template for all pages when a more specific template is not defined
より具体的なテンプレートが定義されていない場合に、すべてのページのフォールバック テンプレートとして使用されます。
homeDisplays the latest posts as either the site homepage or as the “Posts page” as defined under reading settings. If it exists, the Front Page template overrides this template when posts are shown on the homepage.
最新の投稿をサイトのホームページとして、または閲覧設定で定義されている「投稿ページ」として表示します。 フロント ページ テンプレートが存在する場合、投稿がホームページに表示されるときに、フロント ページ テンプレートがこのテンプレートをオーバーライドします。
front-pageDisplays your site\’s homepage, whether it is set to display latest posts or a static page. The Front Page template takes precedence over all templates.
最新の投稿または静的ページを表示するように設定されているかどうかに関係なく、サイトのホームページを表示します。 フロント ページ テンプレートはすべてのテンプレートより優先されます。
singularDisplays any single entry, such as a post or a page. This template will serve as a fallback when a more specific template (e.g. Single Post, Page, or Attachment) cannot be found.
投稿やページなどの単一のエントリを表示します。 このテンプレートは、より具体的なテンプレート (単一の投稿、ページ、添付ファイルなど) が見つからない場合のフォールバックとして機能します。
singleDisplays single posts on your website unless a custom template has been applied to that post or a dedicated template exists.
カスタム テンプレートがその投稿に適用されているか、専用のテンプレートが存在しない限り、Web サイト上の単一の投稿を表示します。
pageDisplay all static pages unless a custom template has been applied or a dedicated template exists.
カスタム テンプレートが適用されているか、専用のテンプレートが存在しない限り、すべての静的ページを表示します。
archiveDisplays any archive, including posts by a single author, category, tag, taxonomy, custom post type, and date. This template will serve as a fallback when more specific templates (e.g. Category or Tag) cannot be found.
単一の投稿者による投稿、カテゴリ、タグ、分類法、カスタム投稿タイプ、日付などのアーカイブを表示します。 このテンプレートは、より具体的なテンプレート (カテゴリやタグなど) が見つからない場合のフォールバックとして機能します。
authorDisplays a single author\’s post archive. This template will serve as a fallback when a more specific template (e.g. Author: Admin) cannot be found.
単一の著者の投稿アーカイブを表示します。 このテンプレートは、より具体的なテンプレート (作成者: Admin など) が見つからない場合のフォールバックとして機能します。
categoryDisplays a post category archive. This template will serve as a fallback when a more specific template (e.g. Category: Recipes) cannot be found.
投稿カテゴリーのアーカイブを表示します。 このテンプレートは、より具体的なテンプレート (例: カテゴリ: レシピ) が見つからない場合のフォールバックとして機能します。
taxonomyDisplays a custom taxonomy archive. Like categories and tags, taxonomies have terms which you use to classify things. For example: a taxonomy named “Art” can have multiple terms, such as “Modern” and “18th Century.” This template will serve as a fallback when a more specific template (e.g. Taxonomy: Art) cannot be found.
カスタム分類アーカイブを表示します。 カテゴリやタグと同様、分類法には物事を分類するために使用する用語があります。 たとえば、「Art」という名前の分類には、「モダン」や「18 世紀」などの複数の用語を含めることができます。 このテンプレートは、より具体的なテンプレート (例: 分類: アート) が見つからない場合のフォールバックとして機能します。
dateDisplays a post archive when a specific date is visited (e.g., example.com/2023/).
特定の日付にアクセスすると、投稿アーカイブが表示されます (例: example.com/2023/)。
tagDisplays a post tag archive. This template will serve as a fallback when a more specific template (e.g. Tag: Pizza) cannot be found.
投稿タグのアーカイブを表示します。 このテンプレートは、より具体的なテンプレート (タグ: ピザなど) が見つからない場合のフォールバックとして機能します。
attachmentDisplays when a visitor views the dedicated page that exists for any media attachment.
訪問者がメディア添付ファイル用に存在する専用ページを閲覧したときに表示されます。
searchDisplays when a visitor performs a search on your website.
訪問者が Web サイトで検索を実行すると表示されます。
privacy-policyDisplays your site\’s Privacy Policy page.
サイトのプライバシー ポリシー ページを表示します。
404Displays when a visitor views a non-existent page, such as a dead link or a mistyped URL.
訪問者がリンク切れや URL の入力ミスなど、存在しないページを閲覧したときに表示されます。

参照:GitHub:block-template-utils.php

「— ここにブロック類を挿入 —」の部分

ここには、実際にテンプレートとして挿入する、ブロックをHTML化したものと入れ替えます。

ブロックのHTML化は、投稿編集画面などを使って以下の手順で行うとスムーズでしょう。

  1. 必要なブロックを挿入してレイアウトやデザインまでをすべて完成させる
  2. すべてのブロックを選択して、三点リーダーをクリック後「ブロックをコピー」をクリックする
  3. パソコン上のテキストエディターを開き、コピーしたものを貼り付ける
  4. 貼り付けたコード(HTML化されたブロック類)を「— ここにブロック類を挿入 —」の文字列に上書きする

すべての項目を編集して保存したら、サイトエディターへ行き、例えば「templateTypes」に「single」を指定した場合には、個別投稿テンプレートの追加をしてみて、選択肢が増えているかを確認ください。

ユーザー定義関数名(上記のコードでいえば先頭行と末尾行にある「sample_default_template_pattern_init」)を変えたものを追加して、パラメーター部分を変えれば、複数の選択肢を追加することもできますから、このコードを1つ覚えておけば便利に使えるようになりますね。

なお、この選択肢はテンプレート追加時にのみ適用されるものであり、WordPress6.3でいう「非同期パターン」と同じで、コード内の記述を変更しても次にそれを選択肢から選択しない限りはどこにも影響がありません(逆にコードを編集しても既に作成されたテンプレートには適用されません)ので、あくまでもテンプレート追加時のベースとなるものとなる点にご注意ください。

「wp:template-part」で呼び出す場合の不具合と対処方法

上記のコードを使ってテンプレート選択肢を作ろう!と、既存のテンプレートのHTMLを流用してコンテンツを作り、それを選択すると、標準の「header」や「footer」が出力される部分で以下のように「テンプレートパーツは削除されたか、利用できません:パーツ名」エラーが出ます。

サイトエディターの「パターンを選択」画面で選択できるテンプレートを増やす方法|Personal WP Customization Notes (PWCN)

これはずいぶん前から以下のページで議論されているのですが、WordPress 6.3 RC-3でも現象が出ました。

GitHub wp:pattern の wp:template-part のレンダリングが機能しない

議論にあるように、どのテーマのパーツなのかが明記されていないことでエラーとなるようで、上記ページに掲載してある対処方法を参考に、「”theme”:”themename”」属性を追加することで、改善できます。

例えば、Twenty Twenty-Twoテーマであれば、標準テンプレートに書かれている、ヘッダーを呼び出すHTMLは

<!-- wp:template-part {"slug":"header","tagName":"header"} /-->

なので、Twenty Twenty-Twoテーマのスラグである「twentytwentytwo」を属性として追加して以下のようにすれば、きちんと埋め込まれ、テーマのヘッダーを編集すればそれが反映されます。

<!-- wp:template-part {"theme":"twentytwentytwo","slug":"header","tagName":"header"} /-->

ただこれだと、使用するテーマが変わるたびにこの部分を書き換えなければならずちょっと使いにくいので、最初に紹介したテンプレート追加用コードにテーマ名を出力する変数を用意して渡してやると、自動で有効化しているテーマのテーマスラグを取得して埋め込んでくれます。

以下のコードの赤字部分が変数の設定と、ヘッダーテンプレートを呼び出す記述例です

/* デフォルトテンプレート追加 */
function sample_default_template_pattern_init(){
$theme_name = get_stylesheet();
$pattern = [
"title" => __('テンプレートの名前',''),
"templateTypes" => array("適用するテンプレートの種類"),
"content" => '
<!-- wp:template-part {"theme":"'.$theme_name.'","slug":"header","tagName":"header"} /-->
--- ここにブロック類を挿入 ---
<!-- wp:template-part {"theme":"'.$theme_name.'","slug":"footer","tagName":"footer"} /-->
',
];

register_block_pattern($pattern["title"], $pattern);
}
add_action('admin_init', 'sample_default_template_pattern_init');

テーマスラグを呼び出すためには、親テーマで使用する前提であれば「get_template()」で呼び出すのが望ましいようですが、子テーマ・親テーマどちらでも使えるよう「get_stylesheet()」を使って呼び出しています

WordPress公式上で参考にしたページ