【告知】メールフォームが自作タイプに戻りました【WordPress】

メール
さっそく修正版😅💦

昨晩アップしたコードは問題があったため差し替えました。

PHP8になってから、しばらくメールフォームが動かなくなっていたのですが。

スポンサーリンク

自作メールフォームの運用再開

WordPressで。
プラグインなしで。
スパム対策折込済。※Cloudflare
作るのはファイルひとつだけで(後述のCSSは適当に追加してください)。

検索したりとかいろいろと調べて、JavaScript使ったものとか、function.phpをいじったものとか本当にさまざまあったのですが、結局原点回帰と言いますか…。

Cloudflareを使ったスパム対策を盛り込む

スパム対策でreCAPTCHAを使っていたものを、Cloudflareに切り替えてあります。
まあ、その辺も追々記事にできたらとは思うのですけどもね?いらないですかね()

Cloudflareのメールフォームスパム対策は、かなり簡単ですし記事も出回っていますので、調べればすぐに実装できると思います。

コードとCSSも共有します、参考までに。

自作PHPメールフォームのコード

ファイル名はcontact-form.phpで作成しています。
フォーム幅は狭い。

<?php
/* Template Name: お問い合わせフォーム */

// Cloudflare Turnstile のシークレットキー
$secretKey = '【ここにシークレットキーを入れる】';

// 変数の初期化
$nameError = '';
$emailError = '';
$messageError = '';
$hasError = false;
$emailSent = false;

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submitted'])) {
    // Turnstile の検証
    if (!empty($_POST['cf-turnstile-response'])) {
        $token = $_POST['cf-turnstile-response'];
        $url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
        
        $data = [
            'secret' => $secretKey,
            'response' => $token,
            'remoteip' => $_SERVER['REMOTE_ADDR'] ?? ''
        ];
        
        $options = [
            'http' => [
                'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                'method'  => 'POST',
                'content' => http_build_query($data)
            ]
        ];
        
        $context = stream_context_create($options);
        $response = file_get_contents($url, false, $context);
        $result = json_decode($response, true);
        
        if ($result['success'] === true) {
            // フォームデータの検証
            if(trim($_POST['contactName'] ?? '') === '') {
                $nameError = '名前が入力されていません';
                $hasError = true;
            } else {
                $name = trim($_POST['contactName']);
            }

            if(trim($_POST['email'] ?? '') === '') {
                $emailError = 'メールアドレスが入力されていません';
                $hasError = true;
            } else if (!preg_match('|^[0-9a-z_./?-]+@([0-9a-z-]+.)+[0-9a-z-]+$|', trim($_POST['email']))) {
                $emailError = 'メールアドレスが正しくありません';
                $hasError = true;
            } else {
                $email = trim($_POST['email']);
            }

            if(trim($_POST['comments'] ?? '') === '') {
                $messageError = 'お問い合わせ内容が入力されていません';
                $hasError = true;
            } else {
                $comments = function_exists('stripslashes') ? 
                    stripslashes(trim($_POST['comments'])) : 
                    trim($_POST['comments']);
            }

            // メール送信処理
            if(!$hasError) {
                mb_language("japanese");
                mb_internal_encoding("UTF-8");
                $emailTo = get_option('admin_email');
                $title = get_bloginfo('name');

                // 管理者へのメール
                $subject = 'お問い合わせ';
                $body = "名前: $name\r\n";
		$body .= "メールアドレス: $email\r\n";
		$body .= "お問い合わせ内容:\r\n$comments";
                $from = mb_encode_mimeheader(mb_convert_encoding("$title のお問い合わせ","UTF-8"));
                $headers = 'From: '.$from.' <'.$emailTo.'>';
                
                if(mb_send_mail($emailTo, $subject, $body, $headers)) {
                    // 自動返信メール
                    $subject = 'お問い合わせ受付のお知らせ';
                    $from = mb_encode_mimeheader(mb_convert_encoding("$title","UTF-8"));
                    $headers = 'From: '.$from.' <'.$emailTo.'>';
                    $body = "$name 様 \n\nお問い合わせありがとうございます。\n返信が必要な場合には管理者よりご連絡をさせていただきます。\n\n"
      			  . "お名前: $name \n\n"
		          . "メールアドレス: $email \n\n"
		          . "お問い合わせ内容: $comments";

                    mb_send_mail($email, $subject, $body, $headers);
                    $emailSent = true;
                }
            }
        } else {
            echo '<div class="error">認証に失敗しました。</div>';
        }
    }
}

get_header();
?>
<main>
    <?php if(isset($emailSent) && $emailSent == true) { ?>
        <h1 class="entry-title archive-title"><?php echo esc_html($name); ?>様、お問い合わせありがとうございます。</h1>
        メールを確認し、必要と判断した場合にはご連絡いたします。
    <?php } else { ?>
        <?php if (have_posts()) : ?>
            <?php while (have_posts()) : the_post(); ?>
                <h1 class="entry-title archive-title"><?php the_title(); ?></h1>
                <?php the_content(); ?>
                <form action="<?php the_permalink(); ?>" id="contactForm" method="post">
                    <ol class="forms">
                        <li>
                            <label for="contactName">お名前</label>
                            <input type="text" name="contactName" id="contactName" value="<?php echo esc_attr(isset($_POST['contactName']) ? $_POST['contactName'] : ''); ?>" class="requiredField" />
                            <?php if($nameError != '') { ?>
                                <span class="error"><?php echo esc_html($nameError); ?></span>
                            <?php } ?>
                        </li>
                        <li>
                            <label for="email">メールアドレス</label>
                            <input type="text" name="email" id="email" value="<?php echo esc_attr(isset($_POST['email']) ? $_POST['email'] : ''); ?>" class="requiredField email" />
                            <?php if($emailError != '') { ?>
                                <span class="error"><?php echo esc_html($emailError); ?></span>
                            <?php } ?>
                        </li>
                        <li class="textarea">
                            <label for="commentsText">お問い合わせ内容</label>
                            <textarea name="comments" id="commentsText" rows="20" cols="30" class="requiredField"><?php echo esc_textarea(isset($_POST['comments']) ? (function_exists('stripslashes') ? stripslashes($_POST['comments']) : $_POST['comments']) : ''); ?></textarea>
                            <?php if($messageError != '') { ?>
    				<span class="error"><?php echo esc_html($messageError); ?></span>
			    <?php } ?>

                        </li>
                        <li>
                            <div class="cf-turnstile" data-sitekey="【ここにサイトキーを入れる】"></div>
                        </li>
                        <li class="buttons">
                            <input type="hidden" name="submitted" id="submitted" value="true" />
                            <button type="submit">送信する</button>
                        </li>
                    </ol>
                </form>
            <?php endwhile; ?>
        <?php endif; ?>
    <?php } ?>
</main>

<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<?php get_footer(); ?>

自作PHPメールフォームのCSS

見た目は各自、セレクタ含め適宜調整してください。

/*コンタクトフォーム*/
 .main {min-height: 400px;}
 .forms {
 margin:16px
 }
.forms li {
 margin:16px;
 list-style:none
 }
.forms label {
 cursor:pointer;
 display:block;
 font-weight:800
 }
.forms input,.forms textarea {
 border:1px solid #7E8AA2;
 border-radius:8px;
 padding:8px;
 width:240px;
 font-size:100%
 }
.forms li .error {
 font-size:80%;
 color:red
 }
.forms li.textarea .error {
 display:block;
 /*position:absolute;*/
 right:0;
 top:0
 }
.forms li.formbuttons button {
 cursor:pointer;
 padding:8px
 }
.contact-form-container {
    max-width: 600px;
    margin: 0 auto;
    padding: 20px;
}

.contact-form .form-group {
    margin-bottom: 20px;
}

.contact-form label {
    display: block;
    margin-bottom: 5px;
}

.contact-form input[type="text"],
.contact-form input[type="email"],
.contact-form textarea {
    width: 100%;
    padding: 8px;
    border: 1px solid #ddd;
    border-radius: 4px;
}

.contact-form textarea {
    height: 150px;
}

.error {
    color: red;
    font-size: 0.9em;
    margin-top: 5px;
}

.success-message {
    background-color: #dff0d8;
    color: #3c763d;
    padding: 15px;
    margin-bottom: 20px;
    border-radius: 4px;
}

.required {
    color: red;
}

.submit-button {
    background-color: #4CAF50;
    color: white;
    padding: 10px 20px;
    border: none;
    border-radius: 4px;
    cursor: pointer;
}

.submit-button:hover {
    background-color: #45a049;
}
修正必須箇所
  • Cloudflareのシークレットキー
  • Cloudflareのサイトキー

このメールフォームは、Wordpressの管理画面→設定で入力しているメールアドレス宛に内容を送信します。

保存してサーバーにアップしたら、

固定ページを新規に作成→テンプレート「お問い合わせフォーム」を選択して保存します。
お好きなアドレスにして、メニューに追加するなどして完了です。

エックスサーバーのメール→Gmailでテスト

問題なくメールが届くので、このまま様子見&運用再開とします。
Google Formとはおサラダバーだ!(サムい)

メッセージが空欄でも届いちゃう

現状、メールと名前は入力必須。
メッセージ欄は空欄でも届いてしまいます。

その辺はスクリプト内の文言も含めて、ご自身でお調べになるなどして微調整してください。

スパム対策は入れてますし、イタズラはさほど来ないでしょう。
人徳が問われます(待)。

Special Thanks

プラグインを使わないメールフォームの作り方は、に掲載されている外部サイト様の提供コードをもとに、AIにちまちま尋ねながら警告メッセージを潰していってPHP8.2あたりに対応させたものです。

プラグインレスでPHPメールフォーム作るサイト様をリンクしてる記事

改めて訪問したらだいぶ見づらくなってた()

お手伝いしてくれたAIたち

ChatGPT-4oとか。
Mistral AIとか。
Claude Sonnetとか。
DeepSeekくんは使っていたところバズりだして、人気大爆発からのビジービジーになってしまって離脱中!

GPTはすぐ制限かかってしまうので、Mistralと天秤AI(経由のClaude)がメインだったかも。

\ ブログ支援お待ちしております☆ /

OFUSEで応援を送る

スポンサーリンク