【WordPress】カスタム投稿ごとにエディタの初期テンプレートを設定する方法

【WordPress】カスタム投稿ごとにエディタの初期テンプレートを設定する方法 WordPress

WordPressでは、投稿画面にあらかじめ入力済みのテンプレートを表示させることで、執筆時の手間を省いたり、フォーマットを統一したりすることが可能です。この記事では、特定のカスタム投稿タイプに対してのみ、投稿画面に初期コンテンツ(テンプレート)を自動挿入する方法を、ブロックエディタ向けの正しい方法とあわせて紹介します。

スポンサーリンク

方法1:register_post_type()のtemplate引数を使う(ブロックエディタ推奨)

ブロックエディタ(Gutenberg)で、見出し・本文・リストをそれぞれ個別に編集できるネイティブブロックとして最初から配置しておきたい場合は、register_post_type()のtemplate引数を使います。以下のコードを functions.php に追加してください。

functions.php:ブロックテンプレートの指定
register_post_type( 'custom_post', array(
    'label'        => 'カスタム投稿',
    'public'       => true,
    'show_in_rest' => true, // ブロックエディタを使うために必須
    'supports'     => array( 'title', 'editor' ),

    // 新規作成時にあらかじめ配置しておくブロックのテンプレート
    'template' => array(
        array( 'core/heading', array(
            'placeholder' => '見出しを入力',
        ) ),
        array( 'core/paragraph', array(
            'placeholder' => '本文をここに記入してください。',
        ) ),
        array( 'core/list', array(), array(
            array( 'core/list-item', array( 'content' => 'ポイント1' ) ),
            array( 'core/list-item', array( 'content' => 'ポイント2' ) ),
        ) ),
    ),
    // 編集者がブロックを削除・並び替えできないようにする場合は指定
    // 'template_lock' => 'all',
) );

これで新規投稿画面を開くと、最初から見出し・段落・リストの3つのブロックが個別に配置された状態になり、それぞれを独立して編集・並び替え・削除できます。template_lockを'all'にすると、ブロックの追加・削除・並び替えを禁止し、テンプレートの構造を固定することもできます。

方法2:default_contentフィルターを使う(従来の方法)

以下のコードでも、対象の投稿タイプ(例:custom_post)の新規投稿にテンプレート文字列を設定できます。

functions.php:default_contentフィルター
// エディタに初期コンテンツを設定
function set_default_editor_content( $content, $post ) {
    // 対象の投稿タイプを確認
    if ( $post->post_type === 'custom_post' && $post->post_status === 'auto-draft' ) {
        // 初期テンプレートを設定
        $template = "<h2>見出し</h2>\n\n本文をここに記入してください。\n\n<ul>\n<li>ポイント1</li>\n<li>ポイント2</li>\n</ul>";
        return $template;
    }
    return $content;
}
add_filter( 'default_content', 'set_default_editor_content', 10, 2 );
ブロックエディタでは1つの「クラシック」ブロックになる
ブロックコメント(<!-- wp:heading -->等)を含まない生のHTML文字列をdefault_contentで設定した場合、ブロックエディタ(Gutenberg)ではこのHTML全体が1つの「クラシック」ブロック(core/freeform、TinyMCEベースの旧エディタ互換ブロック)としてまとめて扱われます。見出し・本文・リストがそれぞれ個別に編集できるネイティブブロックには自動的には分割されません(編集者がツールバーから手動で「ブロックに変換」する必要があります)。見出しやリストをそれぞれ独立したブロックとして最初から用意したい場合は、上記の「方法1」(register_post_type()のtemplate引数)を使ってください。この方法は、クラシックエディタを使っている場合や、単純なテキストを1つのブロックとして差し込みたい場合に向いています。

複数のカスタム投稿タイプに対応させる方法

1つの投稿タイプだけでなく、複数のカスタム投稿タイプに異なる初期テンプレートを設定したい場合は、投稿タイプごとにテンプレートを切り替える処理を追加することで対応できます(この方法もdefault_content方式のため、ブロックエディタでは1つのクラシックブロックとして扱われる点は同様です)。

以下のコードでは、custom_post1 と custom_post2 に対して、それぞれ異なるテンプレートを挿入する例を示しています。

functions.php:複数投稿タイプへの対応
<?php
function set_default_editor_content( $content, $post ) {
    // 投稿ステータスが auto-draft(新規投稿)の場合のみ処理
    if ( $post->post_status !== 'auto-draft' ) {
        return $content;
    }

    // 投稿タイプごとのテンプレート一覧
    $templates = array(
        'custom_post1' => "<h2>タイトル</h2>\n\nこの投稿タイプ1のテンプレートです。\n\n<ul>\n<li>項目A</li>\n<li>項目B</li>\n</ul>",
        'custom_post2' => "<h2>概要</h2>\n\n投稿タイプ2ではこちらを使います。\n\n<p>ここに本文を入力してください。</p>",
    );

    // 該当する投稿タイプがあればテンプレートを挿入
    if ( array_key_exists( $post->post_type, $templates ) ) {
        return $templates[ $post->post_type ];
    }

    return $content;
}
add_filter( 'default_content', 'set_default_editor_content', 10, 2 );
?>

この方法を使えば、複数の投稿タイプに柔軟に対応できます。今後カスタム投稿タイプが増えた場合でも、$templates 配列にテンプレートを追加するだけで簡単に対応可能です。

外部ファイルからテンプレートを読み込む方法

テンプレートの内容が長くなる場合や、頻繁に更新したい場合は、初期コンテンツを外部ファイルに分けて管理するのがおすすめです。コードをすっきり保てるだけでなく、非開発者でもテンプレート内容の修正がしやすくなります。

以下は、外部HTMLファイルを読み込んで投稿エディタに挿入するコード例です。

functions.php:外部ファイルからの読み込み
<?php
function set_default_editor_content( $content, $post ) {
    if ( $post->post_type === 'custom_post' && $post->post_status === 'auto-draft' ) {
        // テンプレートファイルのパス(テーマ内のtemplate-editor/custom_post.html)
        $file_path = get_theme_file_path( 'template-editor/custom_post.html' );

        if ( file_exists( $file_path ) ) {
            $content = file_get_contents( $file_path );
        }
    }
    return $content;
}
add_filter( 'default_content', 'set_default_editor_content', 10, 2 );
?>

このコードを有効にするには、テーマディレクトリ内に以下のようなテンプレートファイルを作成しておきます。

ディレクトリ構成
/your-theme/
├── functions.php
└── template-editor/
    └── custom_post.html

custom_post.html の中には、次のようなHTMLを記述できます。

template-editor/custom_post.html
<h2>概要</h2>
ここに概要を記入してください。

<h2>詳細</h2>
詳細情報を記載してください。

<h2>備考</h2>
注意事項や補足があればこちらに記載してください。

この方法を使えば、PHPコードの中身をシンプルに保ちつつ、テンプレート内容を柔軟に変更できるようになります。ただしこちらもdefault_content方式のため、ブロックエディタでは1つのクラシックブロックとして扱われます。

よくある質問(FAQ)

Qカスタム投稿タイプの新規作成時に初期コンテンツを自動入力するには?
Adefault_content・default_title・default_excerptフィルターを使います。ただしブロックエディタでは、ブロックコメントのない生のHTMLは1つのクラシックブロックとして扱われるため、個別編集可能なブロックにしたい場合はregister_post_type()のtemplate引数を使ってください。
Q投稿タイプ別に異なるデフォルトテンプレートを設定するには?
Adefault_contentフィルターのコールバック内で$post->post_typeを確認し、タイプごとに異なるテンプレート文字列を返します。ネイティブブロックとして分けたい場合は、投稿タイプごとにregister_post_type()のtemplate引数を個別に設定します。
QGutenbergのブロックテンプレートをカスタム投稿タイプに設定するには?
Aregister_post_type()のtemplateパラメーターにブロック定義の配列を渡します。array(array(‘core/heading’, array(‘placeholder’ => ‘見出しを入力’)), array(‘core/paragraph’, array(‘placeholder’ => ‘本文…’)))のように指定します。リストブロックはcore/listの中にcore/list-itemを内包ブロックとして指定します。

まとめ

カスタム投稿タイプに応じて初期テンプレートを表示させることで、記事作成の効率化や統一感のあるコンテンツ制作が実現できます。ブロックエディタで見出しや本文をそれぞれ独立したブロックとして最初から用意したい場合はregister_post_type()のtemplate引数を、単純なテキストを1つのブロックとして差し込みたい場合や旧エディタを使っている場合はdefault_contentフィルターを、と用途に応じて使い分けましょう。