フォーム ID

Hugo

サイトのパラメーターから Ikiform のフォームを描画する Hugo のパーシャルとショートコード。レイアウトでも Markdown のコンテンツでも使えます。

Hugo はプレーンな HTML を生成し、Ikiform に必要なのはプレーンなフォームの送信だけなので、追加する JavaScript はありません。Hugo 特有の落とし穴は Markdown だけです。Hugo のレンダラーは markup.goldmark.renderer.unsafe をオンにしない限りコンテンツファイルの生の HTML を削除し、貼り付けたフォームは <!-- raw HTML omitted --> になってしまいます。ショートコードなら HTML をテンプレートの中に置けます。

セットアップ

  1. 設定ファイルにフォーム ID を追加する

    hugo.toml
    baseURL = "https://example.com/"
    
    [params.ikiform]
    formId = "frm_xxxxxxxxxxxxxxxx"
    thanks = "/thanks/"

    baseURL は本物の https: のアドレスにする必要があります。パーシャルはこれを使って thanks を絶対 URL にし、Ikiform は https: のリダイレクトにしか従いません。

  2. パーシャルを作成する

    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 を付けて呼び出してください。キーはすべて任意で、省略するとサイトのパラメーターが使われます。

  3. ショートコードで包む

    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 を使ってください。

  4. 使う

    任意のコンテンツファイルで:

    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 serverlocalhost。http://localhost:1313 に一致します。Ikiform が比較するのはホスト名だけで、ポートは比較しません。
自分のドメインexample.com(www.example.com も含まれます)
Netlifyyour-site.netlify.app。デプロイプレビュー(deploy-preview-12--your-site.netlify.app)やブランチデプロイ(branch--your-site.netlify.app)はそのサブドメインではないので、テストする間はプレビューの正確なホストを追加してください。
Cloudflare Pagesyour-project.pages.dev。abc123.your-project.pages.dev のようなプレビュー URL はそのサブドメインなので、すでに一致します。
GitHub Pagesusername.github.io。username.github.io/repo のプロジェクトサイトも同じホストを使うので、1 つの登録ですべてカバーできます。
  • netlify.app、pages.dev、github.io だけを追加しないでください。他の人のサイトも含め、そのホスト上のすべてのサイトが一致してしまいます。

テストのチェックリスト

  1. hugo server を実行してページを開き、ソースを表示します。<!-- raw HTML omitted --> ではなく <form> が表示されるはずです。
  2. 許可ドメインに localhost を入れて、ローカルで送信します。absURL は http://localhost のアドレスを返し、https: のリダイレクトにしか従わないため、Ikiform のサンクスページに移動します。
  3. プレビューをデプロイしてそこから送信し、送信データが Ikiform に表示され、スパムになっていないことを確認します。
  4. 本番のドメインで送信し、/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 が返ります。