オリジナルテーマをインストーラーの選択肢に追加する


これまでインストーラーからインストールできるテーマは本体コードに直書きされており、制作者がオリジナルテーマをインストールできるテーマの選択肢に加えることはできませんでした。Ver. 3.2.27 より、コード改修なしに、ファイルを置くだけで選択肢を追加できるようになりました。標準の 5 テーマも、コアだからという特別扱いではなく、この仕組みに統一されています。

やること

setup/bin/<テーマ名>/ ディレクトリを作り、その中に次のファイルを置きます。本体の改修や DB への登録は不要です。

ファイル

役割

必須

theme.yaml

インストーラーに「この選択肢を追加してほしい」と伝える宣言ファイルです。

必須

<テーマ名>.yaml

インストール時に流し込むサイトデータ(ブログ設定・デモコンテンツなど)ブログのエクスポート機能を利用して生成します。

必須

サムネイル画像(例 blog.png

テーマ選択画面に表示する画像です。

任意

media / storage / archives ディレクトリ

デモ用の画像・添付ファイルの実体です。ブログのエクスポート機能を利用して生成します。

任意

これに加えて、themes/<テーマ名>/ に実際のテンプレート本体も用意します。

setup/bin/my-theme/
├── theme.yaml       ← 宣言ファイル(必須)
├── my-theme.yaml    ← 流し込むサイトデータ(必須)
├── my-theme.png     ← サムネイル(任意)
├── media/           ← デモ用メディア(任意)
└── storage/         ← デモ用添付ファイル(任意)

themes/my-theme/     ← テンプレート本体

theme.yaml の書き方

既存の Blog テーマの宣言ファイル(setup/bin/blog/theme.yaml)を例にすると、次のような内容です。

key: blog
label: Blog
image: blog.png
order: 20
description: 時系列順のエントリー表示を前提にしたブログやニュースサイト向きのシンプルで機能的なテーマです。
comparison:
  カスタマイズ難易度: ★★
  デモデータ数: 1件
  テンプレートの継承: ○
  モジュールID利用: ×
  会員機能: ×
  コンテンツの表示切替: ×
  レイアウト機能: ×

各項目の意味は次のとおりです。

項目

必須

説明

key

-

インストーラーに送信される選択値。省略するとディレクトリ名がそのまま使われる

label

必須

選択肢に表示されるテーマ名

description

-

テーマの説明文

image

-

サムネイル画像のファイル名(同じ bin/<名前>/ 配下に置いた画像を指す)。ファイルが実在しない場合はサムネイルなしで表示される

order

-

選択肢の並び順(数値が小さいほど先に表示。既定値は 100。コアテーマは 10〜60 を使用中)

hidden

-

true にすると一覧には出さない。true の間は select_theme に直接指定しても拒否される

comparison

-

「テーマ比較表」に載せる項目(属性名 → 値)。省略すると比較表には出ないが、選択肢自体は出る(最小構成の Blank テーマがこの例)

key は文字列として空でなければ何でもかまいませんが、label を欠く宣言は候補として成立しません(一覧に出ません)。keylabel さえあれば選択肢として成立し、他の項目はすべて省略可能です。

マルチブログ(子ブログ)としてインストールする

オリジナルテーマのデモサイトを「メインブログ+お知らせ用の子ブログ」のような複数ブログ構成でインストールしたい場合は、子ブログ用の bin を <子ブログ名>@<親 bin の名前> という名前で setup/bin/ 直下に並べて置きます。

setup/bin/
├── my-theme/                ← 親(ルートブログ)
│   ├── theme.yaml
│   ├── my-theme.yaml
│   └── ...
└── news@my-theme/           ← 子ブログ
    ├── news@my-theme.yaml   ← サイトデータ(ファイル名は必ず「<子 bin 名>.yaml」)
    └── config.yaml          ← 子ブログの名前・コード(任意)

親テーマ(この例では my-theme)がインストーラーで選ばれると、<子ブログ名>@my-theme というパターンに一致する bin が自動的に検出され、親ブログの子ブログとしてまとめてインストールされます。子ブログ用の bin に theme.yaml は不要です。テーマ選択肢の一覧には出さず、単体でも選べない(select_theme に直接指定しても拒否される)構成のため、宣言する必要がありません。

config.yaml(子ブログの名前・コード)

子ブログのブログ名・ブログコードは、子 bin 直下の config.yaml で指定します。

name: お知らせ
code: news

省略した場合は、bin 名の @ より前の部分(この例では news)がブログ名・ブログコードの両方にフォールバックします。

注意点

  • 対応するのは 1 階層のみです。@ が 2 個以上含まれる bin(孫ブログにあたる構成)は検出対象外です。

  • 子ブログの <子 bin 名>.yaml に書くデータは、親ブログとは別の blog_id に投入されます。テーブル内の blog_id は自分で確定させる必要はなく、インストール時に決まった子ブログの blog_id に自動的に書き換えられます。

仕組み・注意点

  • 収集はインストーラー起動のたびに setup/bin/ 配下を走査するだけなので、ファイルを置けば即座に選択肢へ反映されます(管理画面や DB への事前登録は不要です)。

  • 送信された選択値は、この宣言ファイルの一覧(許可リスト)と一致するものだけを受け付けます。宣言していない値(存在しないディレクトリ名など)を送っても拒否されます。

簡単セットアップで独自テーマを自動インストールする

a-blog cms が配布している「簡単セットアップ」スクリプトは、本体のダウンロード・展開・.htaccess 設定などをまとめて行う PHP ツールです。スクリプト冒頭の設定エリアに $theme_download_url / $theme_zip_file を指定しておくと、本体のセットアップと同時に、指定した独自テーマの ZIP も自動でダウンロード・展開・配置されます。制作者がオリジナルテーマを納品用に配布し、案件ごとに簡単セットアップだけでセットアップを終えたい場合などに使います。

// 特製テーマのインストール元を指定
$theme_download_url = "https://example.com/downloads/";
$theme_zip_file = "my-theme.zip";

配布 ZIP の作り方

配布する ZIP は、次の 2 つの形式のどちらでも作れます。どちらも拡張アプリ(プラグイン)を同梱できます。展開後の配置先は、テーマ本体が setup/bin/themes/、拡張アプリが extension/plugins/ です。

「bin / themes 直下」形式

ZIP のルート直下に bin/ themes/、必要なら plugins/ を並べて置く形式です。a-blog cms 本体の setup/bin/ themes/ 構成をそのまま ZIP 化したものにあたります。

(ZIP ルート)
├── bin/
│   └── my-theme/
│       ├── theme.yaml       ← インストーラーの選択肢として宣言
│       ├── my-theme.yaml
│       └── my-theme.png
├── themes/
│   └── my-theme/             ← テンプレート本体
└── plugins/                  ← 同梱したい拡張アプリ(任意)
    └── my-plugin/

展開後、bin/setup/bin/ へ、plugins/extension/plugins/ へそれぞれ移動され、config.server.phpHOOK_ENABLE が自動で 1 に設定されます。bin/<名前>/theme.yaml を同梱しておけば、この上の「theme.yaml の書き方」で説明した仕組みにそのまま乗り、インストール実行時にテーマ選択肢として表示されます。

「テーマ名ディレクトリ」形式

ZIP のルート直下にテーマ名のディレクトリを 1 つ置き、その中に bin/ themes/ plugins/ などをまとめる形式です。ディレクトリ名は ZIP ファイル名から決まります(拡張子と _ 以降を取り除いた部分。例: my-theme_1.0.zipmy-theme)。a-blogcms.jp が配布している既存テーマ(square@ec.zip など)はこの形式で配布されています。

(ZIP ルート)
└── my-theme/
    ├── bin/
    │   └── my-theme/
    │       ├── theme.yaml
    │       ├── my-theme.yaml
    │       └── my-theme.png
    ├── themes/
    │   └── my-theme/
    └── plugins/               ← 同梱したい拡張アプリ(任意)
        └── my-plugin/

挙動は「bin / themes 直下」形式と同じで、plugins/ を同梱すれば extension/plugins/ へ配置され HOOK_ENABLE が自動で 1 に設定されます。

注意点

  • スクリプトはセットアップ開始前に、指定した URL が実際に到達可能か(HTTP ステータス 200 を返すか)を確認します。到達できない場合はエラー表示でセットアップが止まるため、配布 URL・ファイル名に誤りがないか事前に確認してください。

  • GitHub Releases の releases/latest/download/... のようにリダイレクトを経由する URL も配布元として使えます(最終的なリダイレクト先のステータスで到達可否が判定されます)。