Hugo テーマ 9. Pagefind でサイト内検索機能を付ける
2026-06-07 15:27:06 Hugo内容が古くなっている可能性があるのでご注意ください。
静的なインデックスを使った検索 UI を提供する Pagefind 組み込んでみます。
Pagefind ☐↗ は HTML の内容からインデックスを作成し、それを使ったサイト内検索機能を提供してくれます。
インデックスの作成は Node.js もしくは Python を使って行い、検索 UI は HTML や JS, CSS としてサイト内に組み込みます。
利用までの基本的な流れ
Note
まずは、Hugo 関係なく、HTML で構成された静的サイトに組み込む流れを簡単に紹介します。
hugo build
HTML ファイルを生成しておきます。
Note
テーマとしては、この際に生成される HTML に対して、Pagefind 向けのインデックスに関する指定や検索 UI の定義を生成することになります。
npx -y pagefind --site public
public/pagefind にインデックスファイルや検索 UI 用の JS, CSS が生成されます。
基本的な手順は以上です。
ただし、これだけでは、当然ながらサイト上には検索 UI は出てきません。
検索 UI の追加
Pagefind Component UI #Quick Start ☐↗ に記載があります。
- JS, CSS は上記のドキュメントに書いてある内容そのままを転記
- 検索 UI は 2 種類あるうちの好きな方を選んで、そのタグを記述
検索対象の指定、除外の指定
Configuring what content is indexed ☐↗ にある内容を押さえておけば、そこそこ満足できる結果が出てきます。
HTML 要素の属性に特定の内容を記載することで、検索インデックスの作成対象を指定したり、逆に除外したりすることができます。
data-pagefind-body- この属性を持つ要素以下をインデックス作成対象とする。
- これを記述すると、サイト内のページでこの属性がないものはインデックス作成されない。
data-pagefind-ignore- この属性を持つ要素以下をインデックス作成対象外とする。
data-pagefind-index-attrs- この属性を持つ要素については、属性値もインデックス対象とする。
テーマ側の対応
ここからは、主に検索 UI やインデックス対象を、テーマ側の観点でサイトに盛り込んでいきます。
このサイト向けのテーマ derty では…
- 検索 UI
- 画面にモーダルダイアログを出す方式にしました。(pagefind-modal-trigger と pagefind-modal の組み合わせ)
- 理由1: スクロールして検索 UI が見えなくなったときに検索 UI にたどり着くのは大変。
- 理由2: もう一つの方式では検索 UI に入力内容が表示されるが、別のページに移動したら消えてしまうので、検索した文字列の表示は不要。
- 理由3: ショートカットを入力すると検索 UI までスクロールしてしまうため、検索することを思い立った (と思われる) 記事の部分が見えなくなってしまう。その点で、いま画面に表示されている位置にモーダルダイアログが出た方が良い。
- スタイル (CSS関連)
- ダークモードに対応したい。
- derty 側で用意したスタイルに
--pf-text等のカスタムプロパティーを定義することで、一貫した表現にしたい。
- テンプレート (レイアウト定義)
- 記事本文を対象とする。
- 記事本文に付随してテーマが生成している内容 (前後の記事、古い記事の警告) が検索インデックスに含まれることがあったため、個別に除外。
検索 UI
search.html
| |
meta.html
こちらは部分的に記載。
| |
プロジェクト側の設定で $.Site.Params.derty.pagefind に falsy でない値 (go-template / if ☐↗ ) が指定されている場合に有効になるようにしています。
テーマとしてはプロジェクトの設定に以下を記載することができることをドキュメントとして伝える必要が出てきます。
[params]
[params.derty]
pagefind = true
スタイル
スタイルについてはこれまでコードを掲載していない&細かすぎてあまり伝えるものでもないため、引き続き掲載は控えます。
Pagefind 側が生成する CSS の詳細度が高いため、derty としては !import へ無理やり適用させるようにしています。
あまりお行儀はよくないと思いますが…
テンプレート (レイアウト定義)
baseof.html
部分的に掲載。
| |
$.Site.Params.derty.pagefind の条件に加えて、baseof.html での処理対象が page (コンテンツ) の場合に、その main-area 以下を検索インデックスの作成対象としています。
page.html
baseof.html で IsPage な場合に data-pagefind-body を指定しているためコンテンツページの内容そのままインデックスの作成対象としてよいかと思いきや、
このテーマ derty では記事の冒頭と末尾に追加の情報を出しており、それが検索の結果に混在してしまっていたため、個別に除外することにしました。
部分的に掲載。 期限切れについての除外設定。
| |
- 📄 Hugo テーマ 9. Pagefind でサイト内検索機能を付ける2026-06-07 15:27:06静的なインデックスを使った検索 UI を提供する Pagefind 組み込んでみます。
- 📄 vvin2026-05-30 16:58:07Windows のウィンドウサイズを操作する CLI アプリ
- 📄 Hugo テーマ 8. Shortcodes と Render hooks2026-05-28 21:26:15Markdown で記述したコンテンツ (テーマの利用側) に対して Hugo が用意した HTML 変換の仕組みを見ていきます。
- 📄 Hugo テーマ 7. layouts/baseof.html をいじる2026-05-28 21:26:15サイト全体に共通する、ページのレイアウト定義をいじります。
- 📄 Hugo テーマ 6. layouts/home.html をいじる2026-05-28 21:26:15トップページのレイアウト定義をいじります。
- 📄 Hugo テーマ 5. layouts/section.html をいじる2026-05-28 21:26:15content 内のディレクトリーに対応するレイアウト定義をいじります。
- 📄 Hugo テーマ 4. layouts/page.html をいじる2026-05-28 21:26:15コンテンツに対応するページのレイアウトをいじります。
- 📄 Hugo テーマ 3. 作られたファイル2026-05-28 21:26:15前回作ったテーマを構成するファイルを確認します。
- 📄 Hugo テーマ 2. まずは作ってみる2026-05-28 21:26:15テーマを作りプロジェクトに適用してみます。
- 📄 Hugo テーマ 1. はじめに2026-05-28 21:26:15背景と方針について。