Une chose que je ne comprends pas, c'est que WordPress n'inclut pas encore par défaut un formulaire de contact simple mais complet.
Comme je travaille régulièrement à l'optimisation de WordPress , à la fois ici et sur des sites tiers, je remplace souvent des plugins inutilement gonflés avec des options, des blocs et des décorations qui ne sont jamais utilisés ou qui ne sont pas nécessaires par du code pour alléger la charge.
Ce formulaire de contact est une solution complète et personnalisable pour WordPress, conçue pour être sécurisée, facile à utiliser et respectueuse de la vie privée des utilisateurs. En outre, vous pouvez ajouter ou supprimer des options à votre guise. C'est le formulaire que j'utilise ici .
Voici ses principales fonctions et caractéristiques, ainsi que les instructions pour l'ajouter à n'importe quelle page ou article de votre blog à l'aide d'un shortcode.
Structure et options Nom : champ obligatoire dans lequel l'utilisateur doit saisir son nom.Adresse électronique : Champ obligatoire permettant à l'utilisateur de saisir son adresse électronique.Message : champ obligatoire pour que l'utilisateur puisse écrire son message. Il doit comporter au moins 15 caractères.Captcha de somme : un captcha simple qui demande à l'utilisateur de résoudre une somme de deux nombres aléatoires compris entre 1 et 9.Acceptation de la politique de confidentialité : case à cocher obligatoire pour accepter la politique de confidentialité avant de soumettre le formulaire.Validations et sécurité Validation des champs obligatoires : tous les champs sont obligatoires. Si l'un d'entre eux est manquant, un message d'erreur s'affiche.Validation des liens : Aucun lien (URL) n'est autorisé dans les champs nom et message.Addition Captcha : empêche le spam automatisé en demandant à l'utilisateur de résoudre une opération mathématique simple.Google reCAPTCHA (facultatif) : si les clés Google reCAPTCHA sont configurées, un deuxième niveau de sécurité est ajouté pour empêcher les robots. Si les clés reCAPTCHA ne sont pas ajoutées au code, le code ne sera pas ajouté au formulaire.Validation des mots interdits : il est possible de bloquer certains mots dans le message, par exemple : ananas, pizza, bitcoin (séparés par une virgule et sans espace).Sécurité nonce : protège contre les attaques CSRF (Cross-Site Request Forgery).3. Respect de la vie privée Pas de stockage de données : aucune donnée utilisateur n'est stockée (pas d'e-mails, pas d'IP, pas d'URL de référence, rien). Cette approche est conforme aux réglementations en matière de protection de la vie privée telles que le GDPR, car aucune information personnelle n'est collectée ou stockée.Politique de confidentialité : inclut un lien vers la politique de confidentialité que l'utilisateur doit lire et accepter avant de soumettre le formulaire.Messages d'erreur : affichés dans un bloc en haut du formulaire en cas d'erreur de validation.Message de réussite : après l'envoi du formulaire, un message de réussite s'affiche en vert, en taille 14px et en gras :"Thank you ! Votre message a été envoyé ". Vous pouvez modifier ce texte et sa mise en forme dans le code. Le reste des styles tels que le fond jaune, la bordure et l'ombre de la boîte contenant le formulaire que vous pouvez voir ici , ainsi que d'autres éléments externes ne sont pas inclus dans le code car ils sont ajoutés avec un conteneur GenerateBlocks .5. La personnalisation Texte du Captcha : personnalisable (par défaut : "Are you human ? Solve this sum :").Mots interdits : une liste de mots interdits séparés par des virgules peut être ajoutée.Google reCAPTCHA : Facultatif, ajouté uniquement si vous configurez et ajoutez le site et les clés secrètes de votre captcha au code.Le code vérifie si le shortcode est présent et si le shortcode n'est pas présent, il n'affichera rien, donc il ne fonctionnera que sur la page ou l'article où le shortcode a été ajouté.
Les performances sont optimales là où elles sont présentées.
Instructions d'installation et de configuration 1) Copier et ajouter le code Ouvrez le fichier functions.php de votre thème WordPress (ou créez un plugin personnalisé si vous préférez ne pas modifier le thème ou utiliser Code Snippets ). Copiez et collez le code complet du formulaire dans votre fichier functions.php. Allez sur Google reCAPTCHA . Sélectionnez reCAPTCHA v2 et cochez la case "Je ne suis pas un robot" . Enregistrez votre site web et obtenez les clés:Polylang placeholder do not modify Dans le code du formulaire, remplacez 'YOUR_SITE_KEY'
et 'YOUR_SECRET_KEY'
par les clés que vous avez obtenues. 3. Définir les mots interdits (facultatif) 1 - Dans le code du formulaire, trouvez la ligne :
$palabras_prohibidas = ' ';
2 - Ajoutez les mots que vous voulez bloquer, séparés par des virgules. Par exemple :
$palabras_prohibidas = 'caca,culo,pedo,pis';
Si vous ne souhaitez pas bloquer de mots, laissez la variable vide.
4. Personnaliser le texte captcha de la somme (Facultatif) Dans le code du formulaire, recherchez cette ligne :
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Remplacez le texte "Are you human ? Solve this sum :" par celui que vous souhaitez afficher.
5. Ajouter l'URL de votre politique de confidentialité Remplacez l'URL de l'exemple par l'URL de la politique de confidentialité de votre site sur cette ligne :
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Code court Ajoutez le shortcode à la page ou à l'article où vous souhaitez que le formulaire soit affiché.
[formulario_contacto]
Enfin, il vous suffira de le tester pour vérifier que les courriels sont envoyés et arrivent et d'observer l'utilisation pour empêcher les spammeurs acharnés de se faufiler en compliquant le captcha mathématique et/ou en activant les deux captchas en même temps. Le code peut toujours être amélioré, débogué et optimisé. Vous pouvez également le traduire si vous avez besoin de l'utiliser dans une autre langue.
Si j'apporte des modifications ou des améliorations au code en fonction des résultats, j'ajouterai les notes ici.
Code //Crea un shortcode que genera un formulario de contacto para añadir en cualquier página o post de tu blog. Código actualizado en https://jrmora.com/formulario-contacto-wordpress-sin-plugin/
// Shortcode para mostrar el formulario de contacto
function contacto_form_shortcode() {
// Verificar si el shortcode está presente en el contenido actual
if (!has_shortcode(get_the_content(), 'formulario_contacto')) {
return ''; // Si no está el shortcode, no mostrar nada
}
ob_start(); // Iniciar el buffer de salida
// Claves de Google reCAPTCHA (cambia estas por las tuyas)
$site_key = 'TU_CLAVE_DEL_SITIO'; // Clave del sitio de reCAPTCHA
$secret_key = 'TU_CLAVE_SECRETA'; // Clave secreta de reCAPTCHA
// Verificar si las claves son las predeterminadas
$recaptcha_enabled = ($site_key !== 'TU_CLAVE_DEL_SITIO' && $secret_key !== 'TU_CLAVE_SECRETA');
// Lista de palabras prohibidas (separadas por comas)
// Ejemplo: $palabras_prohibidas = 'spam,publicidad,oferta';
$palabras_prohibidas = ''; // No hay palabras prohibidas por defecto
// Convertir la lista de palabras prohibidas en un array
$palabras_prohibidas_array = !empty($palabras_prohibidas) ? explode(',', $palabras_prohibidas) : [];
// Variables para almacenar errores
$errors = [];
// Verificar si el formulario ha sido enviado
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['contacto_nonce'])) {
// Verificar el nonce para seguridad
if (!wp_verify_nonce($_POST['contacto_nonce'], 'contacto_form_nonce')) {
$errors[] = 'Error de seguridad. Inténtalo de nuevo.';
} else {
// Validar el captcha de suma
$captcha = sanitize_text_field($_POST['captcha']);
$captcha_correct = sanitize_text_field($_POST['captcha_correct']);
if ($captcha !== $captcha_correct) {
$errors[] = 'El resultado de la operación es incorrecto. Inténtalo de nuevo.';
} else {
// Validar la aceptación de la política de privacidad
if (!isset($_POST['aceptar_privacidad'])) {
$errors[] = 'Debes aceptar la política de privacidad para enviar el formulario.';
} else {
// Validar Google reCAPTCHA (solo si está habilitado)
if ($recaptcha_enabled) {
if (isset($_POST['g-recaptcha-response'])) {
$recaptcha_response = sanitize_text_field($_POST['g-recaptcha-response']);
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_data = [
'secret' => $secret_key,
'response' => $recaptcha_response,
];
$recaptcha_options = [
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => http_build_query($recaptcha_data),
],
];
$recaptcha_context = stream_context_create($recaptcha_options);
$recaptcha_result = file_get_contents($recaptcha_url, false, $recaptcha_context);
$recaptcha_json = json_decode($recaptcha_result);
if (!$recaptcha_json->success) {
$errors[] = 'Por favor, verifica que no eres un robot.';
}
} else {
$errors[] = 'Por favor, completa el reCAPTCHA.';
}
}
// Si no hay errores, procesar el formulario
if (empty($errors)) {
$nombre = sanitize_text_field($_POST['nombre']);
$email = sanitize_email($_POST['email']);
$mensaje = sanitize_textarea_field($_POST['mensaje']);
// Validar campos obligatorios
if (empty($nombre)) {
$errors[] = 'El campo nombre es obligatorio.';
}
if (empty($email)) {
$errors[] = 'El campo email es obligatorio.';
}
if (empty($mensaje)) {
$errors[] = 'El campo mensaje es obligatorio.';
}
// Validar que no se hayan añadido enlaces en los campos
if (preg_match('/http|www|\[url|\[link|href=/i', $nombre . $mensaje)) {
$errors[] = 'No se permiten enlaces en los campos del formulario.';
}
// Validar que el mensaje tenga al menos 15 caracteres
if (strlen($mensaje) < 15) {
$errors[] = 'El mensaje debe tener al menos 15 caracteres.';
}
// Validar palabras prohibidas (solo si hay palabras en la lista)
if (!empty($palabras_prohibidas_array)) {
foreach ($palabras_prohibidas_array as $palabra) {
if (stripos($mensaje, $palabra) !== false) {
$errors[] = 'El mensaje contiene palabras no permitidas.';
break; // Detener la validación al encontrar una palabra prohibida
}
}
}
// Si no hay errores, enviar el correo
if (empty($errors)) {
$to = get_option('admin_email'); // Correo del administrador
$subject = 'Nuevo mensaje de contacto desde el sitio web';
$headers = array('Content-Type: text/html; charset=UTF-8', 'From: ' . $nombre . ' <' . $email . '>');
$body = "<p><strong>Nombre:</strong> $nombre</p>";
$body .= "<p><strong>Email:</strong> $email</p>";
$body .= "<p><strong>Mensaje:</strong> $mensaje</p>";
if (wp_mail($to, $subject, $body, $headers)) {
// Redirigir para evitar reenvío al refrescar la página
wp_redirect(add_query_arg('contacto', 'success', wp_get_referer()));
exit;
} else {
$errors[] = 'Hubo un error al enviar el mensaje. Inténtalo de nuevo.';
}
}
}
}
}
}
}
// Mostrar mensaje de éxito después de la redirección
if (isset($_GET['contacto']) && $_GET['contacto'] === 'success') {
echo '<p style="font-size: 14px; font-weight: bold; color: green;">¡Gracias! Tu mensaje ha sido enviado.</p>';
}
// Generar un captcha de suma de dos números aleatorios entre 1 y 9
$num1 = rand(1, 9); // Primer número aleatorio entre 1 y 9
$num2 = rand(1, 9); // Segundo número aleatorio entre 1 y 9
$captcha_result = $num1 + $num2; // Resultado de la suma
// URL de la política de privacidad
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
// Mostrar el formulario
?>
<?php if (!empty($errors)) : ?>
<div style="color: red; margin-bottom: 20px;">
<?php foreach ($errors as $error) : ?>
<p><?php echo esc_html($error); ?></p>
<?php endforeach; ?>
</div>
<?php endif; ?>
<form action="" method="post">
<p>
<label for="nombre">Nombre:</label><br>
<input type="text" name="nombre" id="nombre" value="<?php echo isset($nombre) ? esc_attr($nombre) : ''; ?>" required>
</p>
<p>
<label for="email">Email:</label><br>
<input type="email" name="email" id="email" value="<?php echo isset($email) ? esc_attr($email) : ''; ?>" required>
</p>
<p>
<label for="mensaje">Mensaje:</label><br>
<textarea name="mensaje" id="mensaje" rows="5" required><?php echo isset($mensaje) ? esc_textarea($mensaje) : ''; ?></textarea>
</p>
<p>
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label><br>
<input type="text" name="captcha" id="captcha" required>
<input type="hidden" name="captcha_correct" value="<?php echo $captcha_result; ?>">
</p>
<?php if ($recaptcha_enabled) : ?>
<p>
<div class="g-recaptcha" data-sitekey="<?php echo esc_attr($site_key); ?>"></div>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</p>
<?php endif; ?>
<p>
<input type="checkbox" name="aceptar_privacidad" id="aceptar_privacidad" required>
<label for="aceptar_privacidad">He leído y acepto la <a href="<?php echo esc_url($politica_privacidad_url); ?>" target="_blank">política de privacidad</a>.</label>
</p>
<p>
<?php wp_nonce_field('contacto_form_nonce', 'contacto_nonce'); ?>
<input type="submit" value="Enviar">
</p>
</form>
<?php
return ob_get_clean(); // Devolver el contenido del buffer
}
add_shortcode('formulario_contacto', 'contacto_form_shortcode');