Wat ik niet begrijp is dat WordPress standaard nog geen eenvoudig maar compleet contactformulier heeft.
Omdat ik regelmatig WordPress optimalisatiewerk doe, zowel hier als op sites van derden, vervang ik vaak onnodig opgeblazen plugins met opties, blokken en versieringen die nooit worden gebruikt of niet nodig zijn met code om de belasting te verlichten.
Dit contactformulier is een complete en aanpasbare oplossing voor WordPress, ontworpen voor veiligheid, gebruiksgemak en respect voor de privacy van gebruikers. Bovendien kun je naar wens opties toevoegen of verwijderen. Dit is het formulier dat ik hier gebruik .
Dit zijn de belangrijkste functies en mogelijkheden en de instructies om het aan elke pagina of post van je blog toe te voegen met een shortcode.
Structuur en opties Naam : Verplicht veld voor de gebruiker om zijn of haar naam in te voeren.E-mailadres : Verplicht veld voor de gebruiker om zijn e-mailadres in te voeren.Bericht : Verplicht veld waarin de gebruiker zijn bericht kan schrijven. Het moet minstens 15 tekens lang zijn.Optel captcha : Een eenvoudige captcha die de gebruiker vraagt om een som van twee willekeurige getallen tussen 1 en 9 op te lossen.Accepteren van privacybeleid : Verplicht selectievakje om het privacybeleid te accepteren voordat het formulier wordt verzonden.Validaties en beveiliging Validatie van verplichte velden : Alle velden zijn verplicht. Als er velden ontbreken, wordt er een foutbericht weergegeven.Linkvalidatie : Links (URL's) zijn niet toegestaan in de velden Naam of Bericht.Toevoeging Captcha : Voorkomt geautomatiseerde spam door de gebruiker te vragen een eenvoudige wiskundige bewerking op te lossen.Google reCAPTCHA (optioneel) : Als Google reCAPTCHA-sleutels zijn geconfigureerd, wordt een tweede beveiligingsniveau toegevoegd om bots te voorkomen. Als er geen reCAPTCHA-sleutels zijn toegevoegd aan de code, wordt de code niet toegevoegd aan het formulier.Validatie van verboden woorden : Optioneel kunnen specifieke woorden worden geblokkeerd in het bericht, bijv.: ananas, pizza, bitcoin (gescheiden met komma en geen spaties).Nonce-beveiliging : Beschermt tegen CSRF-aanvallen (Cross-Site Request Forgery).3. Privacy Geen gegevensopslag : Er worden geen gebruikersgegevens opgeslagen (geen e-mails, geen IP's, geen verwijzende URL's, niets). Deze aanpak voldoet aan privacyregels zoals de GDPR, omdat er geen persoonlijke gegevens worden verzameld of opgeslagen.Privacybeleid : Bevat een link naar het privacybeleid dat de gebruiker moet lezen en accepteren voordat het formulier wordt verzonden.4. Feedbackberichten Foutmeldingen : Worden weergegeven in een blok bovenaan het formulier als er fouten zijn opgetreden bij de validatie.Succesbericht : Na het succesvol verzenden van het formulier wordt een succesbericht weergegeven in groen, 14px groot en vetgedrukt:"Bedankt! Uw bericht is verzonden ". Je kunt deze tekst en de opmaak ervan wijzigen in de code. De rest van de stijlen, zoals de gele achtergrond, de rand en schaduw van het vak met het formulier dat je hier kunt zien , en andere externe elementen zijn niet opgenomen in de code omdat ze worden toegevoegd met een GenerateBlocks-container .5. Personalisatie Captcha-tekst : Aanpasbaar (standaard: "Ben jij een mens? Los deze som op:").Verboden woorden : Een door komma's gescheiden lijst van verboden woorden kan worden toegevoegd.Google reCAPTCHA : Optioneel, alleen toegevoegd als je de site en geheime sleutels van je captcha configureert en toevoegt aan de code.6. Prestaties De code controleert of de shortcode aanwezig is en als de shortcode niet aanwezig is, wordt er niets weergegeven. De code wordt dus alleen uitgevoerd op de pagina of post waar de shortcode is toegevoegd.
De prestaties waar deze worden getoond zijn optimaal.
Installatie- en configuratie-instructies 1. Kopieer en voeg de code toe Open het bestand functions.php van je WordPress-thema (of maak een aangepaste plugin als je liever niet het thema aanpast of Code Snippets gebruikt). Kopieer en plak de volledige formuliercode in je functions.php bestand. 2. Google reCAPTCHA instellen (optioneel) Ga naar Google reCAPTCHA . Selecteer reCAPTCHA v2 en schakel het selectievakje "Ik ben geen robot" in. Registreer je website en krijg de sleutels:Polylang placeholder niet wijzigen Vervang in de formuliercode 'YOUR_SITE_KEY'
en 'YOUR_SECRET_KEY'
door de sleutels die je hebt verkregen.Polylang placeholder niet wijzigen 3. Verboden woorden instellen (optioneel) 1 - Zoek de regel in de formuliercode:
$palabras_prohibidas = ' ';
2 - Voeg de woorden toe die je wilt blokkeren, gescheiden door komma's. Bijvoorbeeld:
$palabras_prohibidas = 'caca,culo,pedo,pis';
Als je geen woorden wilt blokkeren, laat je de variabele leeg.
4. Pas de captcha-tekst van de som aan (optioneel) Zoek in de formuliercode naar deze regel:
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Verander de tekst "Ben jij een mens? Los deze som op:" met degene die je wilt laten zien.
5. Voeg de URL van uw privacybeleid toe Vervang op deze regel de voorbeeld-url door de URL van het privacybeleid van uw site:
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Shortcode Voeg de shortcode toe aan de pagina of het bericht waar je het formulier wilt weergeven.
[formulario_contacto]
Tot slot moet je het gewoon testen om te controleren of de e-mails worden verzonden en aankomen en het gebruik observeren om te voorkomen dat meedogenloze spammers hun shit binnensmokkelen door de wiskundige captcha te compliceren en/of beide captcha's tegelijk te activeren. De code kan altijd worden verbeterd en kan worden gedebugged en geoptimaliseerd. Je kunt het ook vertalen als je het in een andere taal wilt gebruiken.
Als ik wijzigingen of verbeteringen aanbreng aan de code afhankelijk van het resultaat, zal ik de opmerkingen hier toevoegen.
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');