Hugo
サイトのパラメーターから Ikiform のフォームを描画する Hugo のパーシャルとショートコード。レイアウトでも Markdown のコンテンツでも使えます。
Hugo はプレーンな HTML を生成し、Ikiform に必要なのはプレーンなフォームの送信だけなので、追加する JavaScript はありません。Hugo 特有の落とし穴は Markdown だけです。Hugo のレンダラーは markup.goldmark.renderer.unsafe をオンにしない限りコンテンツファイルの生の HTML を削除し、貼り付けたフォームは <!-- raw HTML omitted --> になってしまいます。ショートコードなら HTML をテンプレートの中に置けます。
セットアップ
設定ファイルにフォーム ID を追加する
hugo.toml baseURL = "https://example.com/" [params.ikiform] formId = "frm_xxxxxxxxxxxxxxxx" thanks = "/thanks/"baseURLは本物のhttps:のアドレスにする必要があります。パーシャルはこれを使ってthanksを絶対 URL にし、Ikiform はhttps:のリダイレクトにしか従いません。パーシャルを作成する
layouts/_partials/ikiform-form.html {{ $id := .id | default site.Params.ikiform.formId }} {{ $thanks := .thanks | default site.Params.ikiform.thanks }} <form class="ikiform" action="https://ikiform.com/f/{{ $id }}" method="post"> <label>Email <input name="email" type="email" autocomplete="email" required></label> <label>Message <textarea name="message" rows="5"></textarea></label> {{ with .subject }}<input type="hidden" name="_subject" value="{{ . }}">{{ end }} {{ with $thanks }}<input type="hidden" name="_redirect" value="{{ . | absURL }}">{{ end }} <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden> <button type="submit">{{ .button | default "Send" }}</button> </form>空でも、必ず
dictを付けて呼び出してください。キーはすべて任意で、省略するとサイトのパラメーターが使われます。ショートコードで包む
layouts/_shortcodes/ikiform.html {{ partial "ikiform-form.html" (dict "id" (.Get "id") "subject" (.Get "subject") "button" (.Get "button")) }}Hugo 0.146 でテンプレートの場所が
layouts/_partialsとlayouts/_shortcodesに変わりました。それより古いバージョンではlayouts/partialsとlayouts/shortcodesを使ってください。使う
任意のコンテンツファイルで:
content/contact.md --- title: Contact --- Questions about pricing? Write to us. {{< ikiform subject="Pricing question" >}}または、すべてのページにフォームを置くならレイアウトで:
layouts/_partials/footer.html <footer> {{ partial "ikiform-form.html" (dict "subject" "Footer enquiry") }} </footer>
リダイレクト用に content/thanks.md ページを追加します。Ikiform が _redirect に従うのは、フォームの許可ドメインに自分のサイトが含まれている場合だけです。含まれていない場合、訪問者には Ikiform のサンクスページが表示されます。_redirect のルールを参照してください。
許可ドメイン
本番のドメインに加えて、ビルドしたサイトをプレビューするすべての場所を登録します。
| フォームが動く場所 | 許可ドメインに追加するもの |
|---|---|
hugo server | localhost。http://localhost:1313 に一致します。Ikiform が比較するのはホスト名だけで、ポートは比較しません。 |
| 自分のドメイン | example.com(www.example.com も含まれます) |
| Netlify | your-site.netlify.app。デプロイプレビュー(deploy-preview-12--your-site.netlify.app)やブランチデプロイ(branch--your-site.netlify.app)はそのサブドメインではないので、テストする間はプレビューの正確なホストを追加してください。 |
| Cloudflare Pages | your-project.pages.dev。abc123.your-project.pages.dev のようなプレビュー URL はそのサブドメインなので、すでに一致します。 |
| GitHub Pages | username.github.io。username.github.io/repo のプロジェクトサイトも同じホストを使うので、1 つの登録ですべてカバーできます。 |
netlify.app、pages.dev、github.ioだけを追加しないでください。他の人のサイトも含め、そのホスト上のすべてのサイトが一致してしまいます。
テストのチェックリスト
hugo serverを実行してページを開き、ソースを表示します。<!-- raw HTML omitted -->ではなく<form>が表示されるはずです。- 許可ドメインに
localhostを入れて、ローカルで送信します。absURLはhttp://localhostのアドレスを返し、https:のリダイレクトにしか従わないため、Ikiform のサンクスページに移動します。 - プレビューをデプロイしてそこから送信し、送信データが Ikiform に表示され、スパムになっていないことを確認します。
- 本番のドメインで送信し、
/thanks/に移動することを確認します。
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
フォームがあるべき場所に <!-- raw HTML omitted --> が表示される | フォームを Markdown に直接貼り付けた | ショートコードを使います。 |
Hugo が template for shortcode "ikiform" not found で失敗する | ショートコードのファイルが、使っている Hugo のバージョンが読まないフォルダーにある | 0.146 以降は layouts/_shortcodes、それより前は layouts/shortcodes を使います。 |
本番で /thanks/ ではなく Ikiform のサンクスページが表示される | 許可ドメインがない、または baseURL が http: | ドメインを追加し、baseURL を https: のアドレスにします。 |
送信後に 404 not_found が表示される | params.ikiform.formId がないため、action が /f/ で終わっている | hugo.toml にフォーム ID を設定します。 |
送信データが origin_mismatch でスパムフィルターの下に届く | 送信したページが、フォームの許可ドメインに含まれていない | 上の表のホストを追加します。Reject を選んでいる場合、同じ送信には代わりに 403 origin_not_allowed が返ります。 |