ブログ
On this page
ブログ
ブログもまた、バージョン/i18n や
タグ索引 と同じ形の、規約ベースの機能です -
docs/blog/posts/ の下に投稿を置くだけで、BX Sites は /blog/
(ページネーション付き)、カテゴリごとのページ、暦年ごとのアーカイブページ、
著者ごとのページ、カテゴリごとの RSS フィードとブログ全体用のフィード、
そして /blog/stats/ ページを、設定ゼロで構築します。docs/blog/posts/
フォルダがないプロジェクトには単にブログがありません - それ以外は何も
変わりません。
投稿を書く
docs/blog/posts/ の下にある、どんな深さの .md ファイルもすべて投稿です -
サブフォルダは完全に任意で、あくまで自分の編集の利便性のためのものです。
投稿が数件のうちはフラットなフォルダで問題なく、数百件になってきたら
docs/blog/posts/2026/(あるいは docs/blog/posts/2026/03/、好きな方式で)
の下にファイルを収めることで、何もリネームしたりフロントマターの日付
プレフィックス規約に触れたりすることなく、エディタのファイルツリーを
見やすく保てます。これはビルド済みサイトには一切影響しません - 投稿の
並び順、年次アーカイブ、URL(blog/<slug>/)はすべてフロントマターのみから
導出され、ファイルが実際にどこに置かれているかからは決して導出されません。
そのため、投稿のフォルダと実際の date は常に食い違っていて構いません:
docs/blog/posts/
├── hello-world.md (フラットでも問題ありません)
├── 2026/
│ ├── announcing-2-0.md
│ └── 03/
│ └── a-deep-dive.md
どこに置かれた投稿であっても、フロントマターは次の通りです:
---
title: Announcing BoxLang 2.0
date: 2026-08-15
authors: [lmajano]
categories: [Releases]
tags: [boxlang, release]
summary: A faster runtime, a smaller footprint, and a few surprises.
image: assets/blog/boxlang-2-cover.png
---
A short intro paragraph or two.
<!-- more -->
The rest of the post - everything below the `<!-- more -->` marker is left
out of the excerpt shown on `/blog/` and category pages, but still renders
in full on the post's own page.
date(必須)- BX Sites が解析できる任意の形式(2026-08-15、または完全な 日時)。投稿自身の並び順(新しい順)と<pubDate>/article:published_timeを決めます。authors-docs/blog/authors.ymlのエントリに対応する id の リスト、またはエントリと一致しないプレーンな名前(リンクされないテキスト としてレンダリングされ、ビルドは失敗しません - ゲスト投稿単発時に便利です)。categories- 投稿自身の分類法で、それぞれが独自の/blog/category/<slug>/ページ(と独自の/blog/category/<slug>/feed.xmlRSS フィード - フィード を参照)を持ちます。以下のtagsとは無関係です。tags- 他のすべてのページがすでに持つ、サイト全体共通のtagsフロントマターと同じもの(はじめに を 参照)- 投稿のタグはバッジとしてレンダリングされ、他のタグ付きページと 並んでメインの/tags/索引に統合されます。summary-/blog//カテゴリページと RSS フィードに表示される一行の抜粋。 投稿に<!-- more -->マーカーがない場合に使われます。どちらもない場合、 BX Sites は投稿本文のプレーンテキストの切り詰めにフォールバックします。image- フィーチャー画像(docs/assets/相対パス、または完全な URL)- 投稿の先頭と、すべてのリスト/カテゴリカードのサムネイルとして表示されます。ogImageが個別に上書きしない限り、投稿自身のog:image/Twitter カードにも なります。docs/assets/相対の画像(および下記の著者自身のavatar)は、docs/assets/配下の他の画像と同じレスポンシブな<picture>/srcset/WebP 処理を受けます - 画像 を参照してください。slug- URL セグメント(/blog/<slug>/)を上書きします - デフォルトでは ファイル名から導出されます。draft: true- 実際のbxSites buildから投稿を完全に除外します。bxSites serveはそれでもプレビューします(投稿自身に目立つ「🚧 Draft」 バナー、リストされる場所には破線ボーダーのカード付きで)。これにより、 準備が整う前にドラフトをローカルで校正できます - ドラフトのプレビュー を参照してください。
はじめに ですでに解説した他のすべての
ページレベルのフロントマターキー(icon、description、ogImage、toc)は、
投稿でもそのまま機能します。
フィーチャー画像とその他のブログアセット
docs/assets/blog/ は、docs/assets/ の普通のサブフォルダである
(すでにまるごと site/assets/ にコピーされる)以上の特別な扱いはありません -
このガイド(と下記の規約ベースの著者アバター検索)が、投稿のカバー画像や
著者の写真が置かれることを期待する場所というだけです。こうしておくことで、
プロジェクト自身の docs/assets/ が他の図表やアイコンとブログ画像で
ごちゃ混ぜにならずに済みます。この場所を強制するものは何もありません -
image/avatar にはどんな docs/assets/** パスでも使えます。
著者
docs/blog/authors.yml は任意で、著者 id ごとに 1 エントリを持ち、投稿自身の
authors リストから参照されます:
lmajano:
name: Luis Majano
title: CEO, Ortus Solutions
bio: >
Founder of Ortus Solutions and creator of ColdBox, WireBox, and
BoxLang. Building developer tools since 2005.
url: https://github.com/lmajano
email: lmajano@ortussolutions.com
socials:
github: https://github.com/lmajano
twitter: https://x.com/lmajano
必須なのは name だけです。少なくとも 1 件の投稿から参照された著者は、
それぞれ独自の /blog/authors/<id>/ ページ(略歴、ソーシャルリンク、
執筆したすべての投稿)を持ちます - まだ誰の投稿からもクレジットされていない
著者は、名簿にいてもページを持ちません。
アバターは規約ベースです -
docs/assets/blog/authors/<id>.{jpg,jpeg,png,webp,svg} にファイルを置けば、
avatar: キーなしで自動的に検出されます。authors.yml の明示的な avatar
(URL または docs/assets/ 相対パス)は、常に規約ベースの検索より優先されます。
カテゴリ、アーカイブ、ページネーション、そして「ブログ」のナビ項目
すべての投稿を通じて異なる categories の値は、それぞれ独自の
/blog/category/<slug>/ ページを持ち、そのカテゴリ自身の投稿だけを
一覧表示します。少なくとも 1 件の投稿がある暦年もそれぞれ独自の
/blog/archive/<year>/ ページ(/blog/archive/2026/、
/blog/archive/2025/、...)を持ち、これは各投稿の date フロントマター
だけから導出されます - フォルダ構造やファイル名の規約は一切不要なので、
投稿の .md ファイルが docs/blog/posts/ の下で実際にどこにあるか
(フラット、または編集しやすいように独自のサブフォルダに分割)は、その
date と一致している必要はありません。メインの /blog/ 一覧には、投稿が
複数の年/カテゴリにまたがるようになった時点で自動的に「年別で見る」/
「カテゴリ別で見る」のリンクブロックが、年/カテゴリごとの投稿数とともに
追加されます - 単一の年やカテゴリしかない場合はリンクブロックを出す価値が
ないため、どちらの場合も省かれます。
メインの /blog/ 一覧、すべてのカテゴリページ、すべての年次アーカイブ
ページは同じ方法でページネーションされます - サイト設定の
blog.postsPerPage が 1 ページあたりの投稿数を制御し(デフォルト 10)、
2 ページ目以降は .../page/2/、.../page/3/ などに進みます。
docs/blog/posts/ にドラフトでない投稿が 1 件でもあると、メインナビに
「Blog」エントリが自動的に追加されます - nav/docs/nav.json の変更は
不要です。デフォルトでは他のすべての後、最後に追加されます。特定の場所に
置きたい場合は、明示的な url を持つ独自のエントリ(ブログは docs/
ページではないため、通常の「path が実在するページと一致していなければ
ならない」ルールを回避します)を nav 配列または docs/nav.json に
追加してください - そうすると自動追加分が完全に抑制されるため、重複が
発生することはありません:
{ "nav": [
{ "path": "index.md" },
{ "title": "Blog", "url": "blog/index.html", "icon": "lucide:newspaper" },
{ "path": "about.md" }
] }
個々の投稿自体はナビには追加されません(タグ索引と同様)- それらは
/blog/、自分のカテゴリページ、自分の年次アーカイブページ、著者ページ、
検索、そして互いの前後リンク(通常のナビ自体の前後チェーンとは独立した、
時系列で隣り合う投稿同士のリンク)から到達できます。
すべての投稿のメタ行(カード上と詳細ページ上の両方)には、日付の横に 推定読了時間も表示されます - おおよその単語数 ÷ 200wpm という、ほとんどの 読了時間機能が使うのと同じざっくりした見積もりで、設定はできません。
フィード
/blog/feed.xml - 最新の投稿を新しい順に並べた標準の RSS 2.0 フィードで、
サイト設定が絶対 URL の baseURL を解決でき(sitemap.xml と同じ要件)、
かつ blog.feed が false に設定されていない場合に書き出されます。
各カテゴリもそれぞれ独自のフィルタ済みフィード
/blog/category/<slug>/feed.xml を持ちます。どちらも blog.feedLimit
件の投稿数(デフォルト 25)を上限とします - ほとんどのフィードリーダーは
新着にしか関心がないため、大きなブログで無制限のフィードを出すのは
ポーリングのたびに帯域を無駄にするだけです。すべての投稿を無制限にするには
0 を設定します:
{ "blog": { "postsPerPage": 10, "feed": true, "feedLimit": 25 } }
ドラフトのプレビュー
draft: true は投稿を実際の bxSites build から完全に除外しますが、
bxSites serve はそれでも含めるため、公開前にドラフトを一通り読み
(すべてのリンクをクリックし、フィーチャー画像を確認し、/blog/ での
表示を見て)確認できます。プレビューされたドラフトには常に目立つ
「🚧 Draft」バナーが表示されます - 自身の詳細ページと、リストされる
あらゆる場所(メインの /blog/ 一覧、自分のカテゴリ/アーカイブ/著者
ページ)での破線ボーダーカードとして。これにより、実際に公開されている
ものが何かについて曖昧さが生じることはありません。bxSites serve を
止めて bxSites build を実行すれば、そのドラフトはまるで存在しなかった
かのように消えます。
統計
/blog/stats/ - ブログ全体についての集計カードのひとまとまりです:
総投稿数、総執筆単語数、平均読了時間、カテゴリ/寄稿者/年ごとの件数、
そして 3 つの「スポットライト」カード(最長投稿、最も活発なカテゴリ、
最も活発な著者)で、それぞれ実際の該当ページにリンクされています。
このビルドですでに読み込まれた投稿だけから純粋に計算されます - 別途の
アナリティクスもトラッキングもなく、ビルド間で永続化されるものも何も
ありません - そして投稿がまだゼロ件の真新しいブログでも常にビルド
されます。メインの /blog/ 一覧の下部からリンクされています。
SEO とソーシャル
すべての投稿は通常のページと同じもの(<meta name="description">、
og:description、画像が設定されていれば og:image+twitter:card -
設定: ogImage を参照)に加えて、すべての
組み込みテーマが自動的に追加する投稿固有のタグをいくつか受け取ります:
og:type は "website" の代わりに "article" になり、
article:published_time/article:author(authors.yml に url を
設定しているクレジット済み著者ごとに 1 つ)がページの <head> に
含まれます。
検索
投稿は他のすべてのページと同じ search-index.json にインデックスされます
(モジュール仕様セクション 7)- 別のブログ検索 UI はなく、既存の検索ボックスが
そのままドキュメントページと並んで投稿も見つけます。
ブログの見た目をカスタマイズする
書くべき別個の「ブログテーマ」はありません - すべてのブログページ
(メインの /blog/ 一覧、カテゴリ/アーカイブ/著者ページ、/blog/stats/、
各投稿自身の詳細ページ)は、サイトの他のページとまったく同じ
layout.bxm/page.bxm を通してレンダリングされます。そのため、ブログは
自動的にドキュメントの他の部分と同じ見た目になり、すでに行った
テーマオーバーライド(テーマ を参照)が
追加配線なしでそのまま適用されます。
ブログ固有のマークアップ自体(投稿カード、日付/著者/読了時間のメタ行、
ページャー、著者のプロフィールブロック、「年別で見る」/「カテゴリ別で
見る」のリンクリスト)は、固定のクラス名をいくつか持つプレーンな HTML
として構築され、変換済み Markdown ページとまったく同じように
page.contentHtml に流し込まれます:
| クラス | 表示される場所 |
|---|---|
blog-post-card / blog-post-card--draft | /blog/、カテゴリページ、またはアーカイブページ上の各投稿のカード |
blog-post-meta | カード上と投稿自身のページ上の、日付/著者/読了時間の行 |
blog-post-featured-image | 投稿の image フロントマター、投稿自身の詳細ページ上 |
blog-draft-badge | 「🚧 Draft」バナー(bxSites serve のみ) |
blog-pager | ページネーションされた一覧上の前/次ページネーションリンク |
blog-author-profile | /blog/authors/<id>/ ページ上の著者の略歴/ソーシャルブロック |
blog-archive-links / blog-category-links | /blog/ 上の「年別で見る」/「カテゴリ別で見る」のリンクブロック |
他のページと同様、再スタイリングする方法は 2 つあります:
- 手早い見た目の調整 - 自分自身の
extraCssからこれらの クラスをターゲットにします。テーマの色をカスタマイズする のと同じ方法です。組み込みテーマ自身のこれらのクラス向けルールは、 そのassets/style.css(例:resources/themes/bootstrap/assets/style.css) にあります。出発点として上書きしたい場合はそちらを参照してください。 - 構造的な変更 - ブログページは他のすべてと
layout.bxm/page.bxmを共有しているため、テーマをオーバーライドする (またはゼロからテーマを書く)ことで、他のすべてのページと同じくブログのクロム(ヘッダー、ナビ、 フッター、記事ラッパー)も変わります - コピーすべき別個のブログ テンプレートはありません。
できないのは、投稿カード/ページャー/著者プロフィールのマークアップ自体を
独自のものに差し替えることです - これは theme/ 内のテンプレート
ファイルから読み込まれるのではなく、BlogBuilder.bx によって一度だけ
生成されるため、(上記の)CSS による再スタイリングがサポートされている
方法であり、コンポーネントごとの上書きではありません。