WordPressでプラグインなしのお問い合わせフォームを作成する方法

WordPressでプラグインなしのお問い合わせフォーム(サニタイズ解説つき)

WordPressで「お問い合わせフォーム」を作るとき、プラグインを使う方法が定番ですが、自作テーマ内で完結したシンプルな方法もあります。

この記事では、プラグインを使わずにHTML+PHPでメール送信できるフォームの作り方と、セキュリティに重要なsanitize_xxx()関数の解説もあわせて紹介します。

まずはフォームをHTMLで作成

以下のコードを、お問い合わせページ用テンプレートなどに追加します:

<form method="post">
  <p>
    お名前:<br>
    <input type="text" name="your_name" required>
  </p>
  <p>
    メールアドレス:<br>
    <input type="email" name="your_email" required>
  </p>
  <p>
    お問い合わせ内容:<br>
    <textarea name="your_message" rows="5" required></textarea>
  </p>
  <p>
    <input type="submit" name="submit_form" value="送信">
  </p>
</form>

functions.phpに送信処理を追記

フォームが送信されたときにメールが送信されるよう、functions.phpに以下のコードを追加します。

function my_contact_form_handler() {
  if (isset($_POST['submit_form'])) {
    $name = sanitize_text_field($_POST['your_name']);
    $email = sanitize_email($_POST['your_email']);
    $message = sanitize_textarea_field($_POST['your_message']);

    $to = get_option('admin_email'); // 管理者宛に送信
    $subject = '【お問い合わせ】' . $name;
    $headers = 'From: ' . $email;

    wp_mail($to, $subject, $message, $headers);

    echo '<p>お問い合わせを受け付けました。</p>';
  }
}
add_action('wp_head', 'my_contact_form_handler');

sanitize_xxx()ってなに?

sanitize_xxx()とは、ユーザーが入力したデータを安全に処理するためのWordPress標準関数です。

フォームから送信されるデータには、意図的に不正なコード(JavaScriptやHTMLタグなど)が混入する可能性があります。

それを防ぐために、不要なタグや記号を削除・整形してくれるのがsanitize_xxx()シリーズです。

主なサニタイズ関数の例

  • sanitize_text_field() → 改行やタグ、余分な空白などを削除して、1行のテキストにする
  • sanitize_email() → 入力が正しいメール形式かチェック。不正なメールなら空文字に
  • sanitize_textarea_field() → 改行を含む複数行テキスト向け。悪意あるスクリプトを除去

これらはすべてのフォームに基本的に必須です!

送信先のメールアドレスはどこ?

以下の部分:

$to = get_option('admin_email');

ここで指定されている「admin_email」は、WordPress管理画面の:

設定 > 一般 > 管理者メールアドレスに登録されているものです。

自分で指定したい場合は:

$to = 'your@email.com';

のように直接書いてもOKです。

セキュリティ面の注意点

  • 必ずsanitize_xxx()で入力値を処理しましょう
  • HTMLメールにしたい場合はheadersを調整(text/html)
  • reCAPTCHA(Google)導入でスパム防止も可能

おわりに

このように、WordPressの機能を活かしてシンプルかつ安全なお問い合わせフォームを自作することができます。

プラグインなしで実現できるため、サイトの表示速度にも有利です。

今後は、自動返信メール入力確認画面の追加など、発展編も紹介していく予定です!