WordPress自定义联系表单无法提交 邮件发送功能持续报错求解
问题根源与修复方案
你的代码存在4处核心错误导致邮件发送失败,以下是具体修复步骤:
- 未定义邮件主题变量
wp_mail()函数的第二个参数为必填的邮件主题,你的代码中直接使用了未赋值的$subject变量,参数校验不通过直接返回发送失败。修复方式:在$headers定义前添加主题赋值即可。 - 消息文本域缺少name属性
HTML中的<textarea>标签未添加name="cf-message"属性,提交表单时消息内容不会被POST到后端,$_POST["cf-message"]为空值,也会导致发送参数错误。 - 复选框value赋值逻辑错误
复选框的value属性应为固定值,你当前的逻辑是把历史提交值作为value,首次加载时所有复选框value为空,就算用户勾选也只会提交空字符串,无法正确收集选项。修复方式:把每个复选框的value改为固定值,选中状态用checked属性判断即可。 - 输入框value存在多余空格
所有输入框的value拼接时前后都加了多余的空格,会导致用户提交的数据前后自动带上空格,比如邮箱末尾多空格会被sanitize_email判定为无效地址,导致发件人参数错误。修复方式:删除所有value属性值前后的多余空格即可。
完整修复后代码
<?php // FORMULAIRE DE CONTACT HTML // ########################## function html_form_code() { echo (' <section class="section-form d-flex flex-column justify-content-center align-items-center"> <div class="container text-center mt-5"> <h2 class="fs-3">Une question, une demande de devis ?</h2> <p>Remplissez le formulaire ci-dessous, nous vous recontacterons rapidement !</p> </div> <form action="'. esc_url( $_SERVER['REQUEST_URI'] ) .'" method="post" class="container mt-3 p-4"> <div class="form-floating mb-3"> <input type="text" class="form-control" name="cf-name" pattern="[a-zA-Z0-9 ]+" value="' . ( isset( $_POST["cf-name"] ) ? esc_attr( $_POST["cf-name"] ) : '' ) . '" size="40"/> <label for="cf-name">Nom</label> </div> <div class="form-floating mb-3"> <input type="text" class="form-control" name="cf-firstname" value="' . ( isset( $_POST["cf-firstname"] ) ? esc_attr( $_POST["cf-firstname"] ) : '' ) . '" size="40" > <label for="cf-firstname">Prénom</label> </div> <div class="form-floating mb-3"> <input type="email" class="form-control" name="cf-email" value="' . ( isset( $_POST["cf-email"] ) ? esc_attr( $_POST["cf-email"] ) : '' ) .'" size="40" > <label for="cf-email">Email</label> </div> <div class="form-floating mb-3"> <input type="tel" class="form-control" name="cf-tel" value="' . ( isset( $_POST["cf-tel"] ) ? esc_attr( $_POST["cf-tel"] ) : '' ) . '" size="40" > <label for="cf-tel">Téléphone</label> </div> <div class="form-floating mb-3"> <input type="text" class="form-control" name="cf-address" value="' . ( isset( $_POST["cf-address"] ) ? esc_attr( $_POST["cf-address"] ) : '' ) . '" size="250" > <label for="cf-address">Adresse</label> </div> <div class="form-floating mb-3"> <input type="text" class="form-control" name="cf-postal" value="' . ( isset( $_POST["cf-postal"] ) ? esc_attr( $_POST["cf-postal"] ) : '' ) . '" size="10" > <label for="cf-postal">Code postal</label> </div> <div class="form-floating mb-3"> <input type="text" class="form-control"name="cf-city" value="' . ( isset( $_POST["cf-city"] ) ? esc_attr( $_POST["cf-city"] ) : '' ) . '" size="250" > <label for="cf-city">Ville</label> </div> <div> <p class="fs-5 mt-4">Votre demande concerne :</p> <div class="form-check"> <input class="form-check-input" type="checkbox" name="cf-help" value="Les Aides de l\'État" ' . checked( isset($_POST['cf-help']), true, false ) . '/> <label class="form-check-label" for="cf-help"> Les Aides de l\'État </label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" name="cf-contract" value="Nos Contrats d\'Entretien" ' . checked( isset($_POST['cf-contract']), true, false ) . '> <label class="form-check-label" for="cf-contract"> Nos Contrats d\'Entretien </label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" name="cf-quote" value="Une Demande de Devis" ' . checked( isset($_POST['cf-quote']), true, false ) . '/> <label class="form-check-label" for="cf-quote"> Une Demande de Devis </label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" name="cf-other" value="Autre" ' . checked( isset($_POST['cf-other']), true, false ) . '/> <label class="form-check-label mb-4" for="cf-other"> Autre </label> </div> </div> <div class="form-floating mb-3"> <textarea class="form-control" name="cf-message">' . ( isset( $_POST["cf-message"] ) ? esc_textarea( $_POST["cf-message"] ) : '' ) . '</textarea> <label for="cf-message">Votre message</label> </div> <button type="submit" class="btn button-primary mt-3" name="cf-submitted">Envoyer</button> </form> </section>') ; } // ENVOYER LES DONNEES A L ADMIN // ############################## function deliver_mail() { // if the submit button is clicked, send the email if ( isset( $_POST['cf-submitted'] ) ) { // sanitize form values $name = sanitize_text_field( $_POST["cf-name"] ); $firstname = sanitize_text_field( $_POST["cf-firstname"] ); $email = sanitize_email( $_POST["cf-email"] ); $tel = sanitize_text_field( $_POST["cf-tel"] ); $address = sanitize_text_field( $_POST["cf-address"] ); $postal = sanitize_text_field( $_POST["cf-postal"] ); $city = sanitize_text_field( $_POST["cf-city"] ); $message = esc_textarea( $_POST["cf-message"] ); // 拼接用户选择的咨询类型 $request_type = []; if(isset($_POST['cf-help'])) $request_type[] = "Les Aides de l'État"; if(isset($_POST['cf-contract'])) $request_type[] = "Nos Contrats d'Entretien"; if(isset($_POST['cf-quote'])) $request_type[] = "Une Demande de Devis"; if(isset($_POST['cf-other'])) $request_type[] = "Autre"; $request_type_str = implode("、", $request_type); // 拼接完整邮件内容 $full_message = "姓名:{$name} {$firstname}\n"; $full_message .= "邮箱:{$email}\n"; $full_message .= "电话:{$tel}\n"; $full_message .= "地址:{$address},{$postal} {$city}\n"; $full_message .= "咨询类型:{$request_type_str}\n"; $full_message .= "消息内容:\n{$message}"; // get the blog administrator's email address $to = get_option( 'admin_email' ); // 定义邮件主题 $subject = "站点联系表单提交:来自{$name}的咨询"; $headers = "From: $name <$email>" . "\r\n"; // If email has been process for sending, display a success message if ( wp_mail( $to, $subject, $full_message, $headers ) ) { echo '<div>'; echo '<p>Merci de votre envoi, nous vous recontacterons très vite !</p>'; echo '</div>'; } else { echo 'Echec lors de la validation du formulaire'; } } } // APPELLEE LORSQUE LE SHORTCODE EST ACTIF // ####################################### function cf_shortcode() { ob_start(); deliver_mail(); html_form_code(); return ob_get_clean(); } add_shortcode( 'sitepoint_contact_form', 'cf_shortcode' );
额外调试建议
如果修改后仍然发送失败,可以在主题的functions.php中临时添加以下代码查看wp_mail的具体错误信息:
add_action('wp_mail_failed', function($wp_error){ var_dump($wp_error->get_error_messages()); die; });
发送测试表单即可看到具体错误原因,排查完成后记得删除这段调试代码。
内容的提问来源于stack exchange,提问作者Alice Mim
相关产品推荐
相关产品推荐

