En ting, jeg ikke forstår, er, at WordPress endnu ikke indeholder en enkel, men komplet kontaktformular som standard.
Da jeg jævnligt arbejder med WordPress-optimering , både her og på tredjepartssider, erstatter jeg ofte unødvendigt oppustede plugins med indstillinger, blokke og dekorationer, som aldrig bruges eller ikke er nødvendige, med kode for at lette belastningen.
Denne kontaktformular er en komplet løsning til WordPress, der kan tilpasses, og som er designet til at være sikker, nem at bruge og respektere brugernes privatliv. Derudover kan du tilføje eller fjerne indstillinger, som du ønsker. Det er den formular, jeg bruger her.
Her er dens vigtigste funktioner og egenskaber og en vejledning i, hvordan du tilføjer den til en hvilken som helst side eller et hvilket som helst indlæg på din blog med en kortkode.
Struktur og muligheder Navn : Obligatorisk felt, hvor brugeren kan indtaste sit navn.E-mail-adresse : Påkrævet felt, hvor brugeren kan indtaste sin e-mailadresse.Besked : Obligatorisk felt, hvor brugeren kan skrive sin besked. Den skal være mindst 15 tegn lang.Sum captcha : En simpel captcha, der beder brugeren om at løse en sum af to tilfældige tal mellem 1 og 9.Accept af privatlivspolitik : Obligatorisk afkrydsningsfelt for at acceptere privatlivspolitikken, før formularen indsendes.Valideringer og sikkerhed Validering af obligatoriske felter : Alle felter er obligatoriske. Hvis nogle af dem mangler, vises en fejlmeddelelse.Validering af links : Ingen links (URL'er) er tilladt i navne- eller beskedfelterne.Addition Captcha : Forhindrer automatiseret spam ved at kræve, at brugeren løser en simpel matematisk opgave.Google reCAPTCHA (valgfrit) : Hvis Google reCAPTCHA-nøgler er konfigureret, tilføjes et ekstra sikkerhedsniveau for at forhindre bots. Hvis der ikke tilføjes reCAPTCHA-nøgler til koden, vil koden ikke blive tilføjet til formularen.Validering af forbudte ord: Eventuelt kan specifikke ord blokeres i beskeden, f.eks. ananas, pizza, bitcoin (adskilt med komma og uden mellemrum).Nonce-sikkerhed : Beskytter mod CSRF-angreb (Cross-Site Request Forgery).3. Privatlivets fred Ingen datalagring : Ingen brugerdata lagres (ingen e-mails, ingen IP'er, ingen henvisende URL'er, ingenting). Denne tilgang er i overensstemmelse med regler om beskyttelse af personlige oplysninger som GDPR, da der ikke indsamles eller gemmes nogen personlige oplysninger.Privatlivspolitik : Indeholder et link til den privatlivspolitik, som brugeren skal læse og acceptere, før han/hun sender formularen.4. Feedback-beskeder Fejlmeddelelser : Vises i en blok i toppen af formularen, hvis der er fejl i valideringen.Succesbesked : Når formularen er sendt, vises en succesbesked i grønt, 14px i størrelse og med fed skrift:"Tak! Din besked er blevet sendt ". Du kan ændre denne tekst og dens formatering i koden. Resten af stilarterne, f.eks. den gule baggrund, rammen og skyggen på boksen med formularen, som du kan se her , samt andre eksterne elementer er ikke inkluderet i koden, da de tilføjes med en GenerateBlocks-container .5. Personliggørelse Captcha-tekst : Kan tilpasses (standard: "Er du et menneske? Løs dette regnestykke:").Forbudte ord : En kommasepareret liste over forbudte ord kan tilføjes.Google reCAPTCHA : Valgfrit, tilføjes kun, hvis du konfigurerer og tilføjer webstedet og de hemmelige nøgler til din captcha til koden.6. Præstationer Koden tjekker, om kortkoden er til stede, og hvis den ikke er til stede, viser den ikke noget, så den kører kun på den side eller det indlæg, hvor kortkoden er tilføjet.
Ydelsen, hvor den vises, er optimal.
Installations- og konfigurationsinstruktioner 1. Kopier og tilføj koden Åbn filen functions.php i dit WordPress-tema (eller opret et brugerdefineret plugin, hvis du foretrækker ikke at ændre temaet eller bruge Code Snippets ). Kopier og indsæt hele formularens kode i din functions.php-fil. 2. Opsæt Google reCAPTCHA (valgfrit) Gå til Google reCAPTCHA . Vælg reCAPTCHA v2 , og marker afkrydsningsfeltet "Jeg er ikke en robot". Registrer din hjemmeside og få nøglerne:Polylang placeholder do not modify I formularens kode skal du erstatte 'YOUR_SITE_KEY'
og 'YOUR_SECRET_KEY'
med de nøgler, du har fået.Polylang pladsholder må ikke ændres 3. Indstil forbudte ord (valgfrit) 1 - Find linjen i formularens kode:
$palabras_prohibidas = ' ';
2 - Tilføj de ord, du vil blokere, adskilt af kommaer. For eksempel
$palabras_prohibidas = 'caca,culo,pedo,pis';
Hvis du ikke vil blokere nogen ord, skal du lade variablen være tom.
4. Tilpas summens captcha-tekst (valgfrit) Se efter denne linje i formularens kode:
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Skift teksten "Er du et menneske? Solve this sum:" med den, du vil vise.
5. Tilføj URL'en til din privatlivspolitik Erstat eksempel-URL'en med URL'en til dit websteds privatlivspolitik på denne linje:
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Kortkode Tilføj kortkoden til den side eller det indlæg, hvor du vil have formularen vist.
[formulario_contacto]
Endelig skal du bare teste den for at kontrollere, at e-mails sendes og kommer frem, og observere brugen for at forhindre ubarmhjertige spammere i at snige deres lort ind ved at komplicere den matematiske captcha og/eller aktivere begge captchas på samme tid. Koden kan altid forbedres og kan fejlsøges og optimeres. Du kan også oversætte den, hvis du har brug for at bruge den på et andet sprog.
Hvis jeg foretager ændringer eller forbedringer af koden afhængigt af resultatet, vil jeg tilføje noterne her.
Kode //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');