Un lucru pe care nu îl înțeleg este că WordPress nu include încă în mod implicit un formular de contact simplu, dar complet.
Deoarece mă ocup în mod regulat de optimizarea WordPress , atât aici, cât și pe site-uri terțe, înlocuiesc adesea pluginurile umflate inutil cu opțiuni, blocuri și decorațiuni care nu sunt niciodată utilizate sau nu sunt necesare cu cod pentru a ușura sarcina.
Acest formular de contact este o soluție completă și personalizabilă pentru WordPress, proiectată să fie sigură, ușor de utilizat și să respecte confidențialitatea utilizatorului. În plus, puteți adăuga sau elimina opțiuni după cum doriți. Acesta este formularul pe care îl folosesc aici .
Acestea sunt principalele sale funcții și caracteristici, precum și instrucțiunile de adăugare la orice pagină sau post al blogului dvs. cu un cod scurt.
Structură și opțiuni Nume : Câmp obligatoriu pentru ca utilizatorul să își introducă numele.Adresa de e-mail : Câmp obligatoriu pentru ca utilizatorul să își introducă adresa de e-mail.Mesaj : câmp obligatoriu pentru ca utilizatorul să își scrie mesajul. Acesta trebuie să aibă cel puțin 15 caractere.Sum captcha : Un captcha simplu care cere utilizatorului să rezolve o sumă de două numere aleatorii între 1 și 9.Acceptarea politicii de confidențialitate : Casetă de selectare obligatorie pentru acceptarea politicii de confidențialitate înainte de trimiterea formularului.Validări și securitate Validarea câmpurilor obligatorii : Toate câmpurile sunt obligatorii. Dacă lipsește vreunul, se afișează un mesaj de eroare.Validarea linkurilor : Nu sunt permise link-uri (URL-uri) în câmpurile de nume sau mesaj.Addition Captcha : previne spam-ul automat solicitând utilizatorului să rezolve o operație matematică simplă.Google reCAPTCHA (opțional) : Dacă sunt configurate cheile Google reCAPTCHA, este adăugat un al doilea nivel de securitate pentru a preveni roboții. Dacă cheile reCAPTCHA nu sunt adăugate la cod, codul nu va fi adăugat la formular.Validarea cuvintelor interzise : Opțional, anumite cuvinte pot fi blocate în mesaj, de exemplu: ananas, pizza, bitcoin (separate cu virgulă și fără spații).Securitate Nonce : protejează împotriva atacurilor CSRF (Cross-Site Request Forgery).3. Confidențialitate Nicio stocare de date : Nu se stochează date despre utilizatori (niciun e-mail, niciun IP, niciun URL de trimitere, nimic). Această abordare respectă reglementările privind confidențialitatea, cum ar fi GDPR, deoarece nu sunt colectate sau stocate informații personale.Politica de confidențialitate : include un link către politica de confidențialitate pe care utilizatorul trebuie să o citească și să o accepte înainte de a trimite formularul.4. Mesaje de feedback Mesaje de eroare : Afișate într-un bloc în partea de sus a formularului dacă există erori în validare.Mesaj de succes : După trimiterea cu succes a formularului, se afișează un mesaj de succes de culoare verde, cu dimensiunea de 14px și cu caractere îngroșate:"Thank you! Mesajul dvs. a fost trimis ". Puteți modifica acest text și formatarea sa în cod. Restul stilurilor, cum ar fi fundalul galben, marginea și umbra casetei care conține formularul, pe care le puteți vedea aici , precum și alte elemente externe nu sunt incluse în cod, deoarece sunt adăugate cu un container GenerateBlocks .5. Personalizarea Text Captcha : Personalizabil (implicit: "Ești om? Rezolvă această sumă:").Cuvinte interzise : Se poate adăuga o listă de cuvinte interzise, separate prin virgulă.Google reCAPTCHA : Opțional, adăugat numai dacă configurați și adăugați site-ul și cheile secrete ale captcha dvs. la cod.Codul verifică dacă codul scurt este prezent, iar dacă acesta nu este prezent, nu va afișa nimic, deci va rula numai pe pagina sau postarea în care a fost adăugat codul scurt.
Performanța acolo unde este prezentată este optimă.
Instrucțiuni de instalare și configurare 1. Copiați și adăugați codul Deschideți fișierul functions.php din tema WordPress (sau creați un plugin personalizat dacă preferați să nu modificați tema sau să nu utilizați Code Snippets ). Copiați și lipiți codul complet al formularului în fișierul functions.php. 2. Configurați Google reCAPTCHA (opțional) Mergeți la Google reCAPTCHA . Selectați reCAPTCHA v2 și bifați caseta de selectare "I'm not a robot" . Înregistrați-vă site-ul web și obțineți cheile:Polylang placeholder do not modify În codul formularului, înlocuiți "YOUR_SITE_KEY"
și "YOUR_SECRET_KEY"
cu cheile obținute.Polylang placeholder do not modify 3. Setați cuvintele interzise (opțional) 1 - În codul formularului, găsiți linia:
$palabras_prohibidas = ' ';
2 - Adăugați cuvintele pe care doriți să le blocați, separate prin virgulă. De exemplu:
$palabras_prohibidas = 'caca,culo,pedo,pis';
Dacă nu doriți să blocați niciun cuvânt, lăsați variabila goală.
4. Personalizați textul captcha al sumei (opțional) În codul formularului, căutați această linie:
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Schimbați textul "Are you human? Rezolvă această sumă:" cu cel pe care doriți să îl afișați.
5. Adăugați adresa URL a politicii dvs. de confidențialitate Înlocuiți url-ul de exemplu cu URL-ul politicii de confidențialitate a site-ului dvs. pe această linie:
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Cod scurt Adăugați codul scurt la pagina sau postarea în care doriți ca formularul să fie afișat.
[formulario_contacto]
În cele din urmă, va trebui doar să îl testați pentru a verifica dacă e-mailurile sunt trimise și sosesc și să observați utilizarea pentru a preveni spamerii necruțători să își strecoare rahatul prin complicarea captcha matematic și/sau activarea ambelor captcha în același timp. Codul poate fi întotdeauna îmbunătățit și poate fi depanat și optimizat. De asemenea, îl puteți traduce dacă trebuie să îl utilizați în altă limbă.
Dacă fac modificări sau îmbunătățiri ale codului în funcție de rezultat, voi adăuga notele aici.
Cod //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');