Eine Sache, die ich nicht verstehe, ist, dass WordPress standardmäßig noch kein einfaches, aber vollständiges Kontaktformular enthält.
Da ich regelmäßig WordPress-Optimierungsarbeiten durchführe, sowohl hier als auch auf Websites von Drittanbietern, ersetze ich oft unnötig aufgeblähte Plugins mit Optionen, Blöcken und Dekorationen, die nie verwendet oder nicht benötigt werden, durch Code, um die Last zu verringern.
Dieses Kontaktformular ist eine vollständige und anpassbare Lösung für WordPress, die sicher und einfach zu verwenden ist und die Privatsphäre der Nutzer respektiert. Darüber hinaus können Sie Optionen hinzufügen oder entfernen, wie Sie möchten. Dies ist das Formular, das ich hier verwende .
Dies sind die wichtigsten Funktionen und Merkmale sowie die Anweisungen zum Hinzufügen zu jeder Seite oder jedem Beitrag Ihres Blogs mit einem Shortcode.
Struktur und Optionen Name : Obligatorisches Feld für die Eingabe des Namens des Benutzers.E-Mail Adresse : Erforderliches Feld für die Eingabe der E-Mail-Adresse des Benutzers.Nachricht : Obligatorisches Feld, in das der Nutzer seine Nachricht schreiben kann. Sie muss mindestens 15 Zeichen lang sein.Summen-Captcha : Ein einfaches Captcha, das den Benutzer auffordert, eine Summe aus zwei Zufallszahlen zwischen 1 und 9 zu bilden.Akzeptanz der Datenschutzrichtlinie : Obligatorisches Kontrollkästchen zur Annahme der Datenschutzrichtlinie vor dem Absenden des Formulars.Validierungen und Sicherheit Validierung von Pflichtfeldern : Alle Felder sind Pflichtfelder. Wenn eines fehlt, wird eine Fehlermeldung angezeigt.Link-Überprüfung : Es sind keine Links (URLs) in den Namens- oder Nachrichtenfeldern erlaubt.Additions-Captcha : Verhindert automatisierten Spam, indem es den Benutzer auffordert, eine einfache mathematische Aufgabe zu lösen.Google reCAPTCHA (optional) : Wenn Google reCAPTCHA-Schlüssel konfiguriert sind, wird eine zweite Sicherheitsebene hinzugefügt, um Bots zu verhindern. Wenn reCAPTCHA-Schlüssel nicht zum Code hinzugefügt werden, wird der Code nicht zum Formular hinzugefügt.Validierung von verbotenen Wörtern : Optional können bestimmte Wörter in der Nachricht blockiert werden, z. B.: Ananas, Pizza, Bitcoin (mit Komma und ohne Leerzeichen getrennt).Nonce-Sicherheit : Schützt vor CSRF-Angriffen (Cross-Site Request Forgery).3. Datenschutz Keine Datenspeicherung : Es werden keine Nutzerdaten gespeichert (keine E-Mails, keine IPs, keine verweisenden URLs, nichts). Dieser Ansatz entspricht den Datenschutzbestimmungen wie der GDPR, da keine persönlichen Informationen gesammelt oder gespeichert werden.Datenschutz : Enthält einen Link zu den Datenschutzbestimmungen, die der Nutzer vor dem Absenden des Formulars lesen und akzeptieren muss.4. Rückmeldungen Fehlermeldungen : Werden in einem Block am oberen Rand des Formulars angezeigt, wenn bei der Validierung Fehler aufgetreten sind.Erfolgsmeldung : Nach erfolgreichem Absenden des Formulars wird eine Erfolgsmeldung in grüner Farbe, 14px Größe und fett gedruckt angezeigt:"Danke! Ihre Nachricht wurde abgeschickt ". Sie können diesen Text und seine Formatierung im Code ändern. Die übrigen Stile wie der gelbe Hintergrund, der Rahmen und der Schatten des Feldes, das das Formular enthält, das Sie hier sehen können , sowie andere externe Elemente sind nicht im Code enthalten, da sie mit einem GenerateBlocks-Container hinzugefügt werden.5. Personalisierung Captcha-Text : Anpassbar (Standard: "Sind Sie ein Mensch? Lösen Sie diese Summe:").Verbotene Wörter : Es kann eine durch Komma getrennte Liste mit verbotenen Wörtern hinzugefügt werden.Google reCAPTCHA : Optional, nur hinzugefügt, wenn Sie die Website und die geheimen Schlüssel Ihres Captchas konfigurieren und zum Code hinzufügen.6. Leistung Der Code prüft, ob der Shortcode vorhanden ist. Wenn der Shortcode nicht vorhanden ist, wird er nicht angezeigt, d. h. er wird nur auf der Seite oder dem Beitrag ausgeführt, auf der/dem der Shortcode hinzugefügt wurde.
Die Leistung ist dort, wo sie angezeigt wird, optimal.
Installations- und Konfigurationsanweisungen 1. kopieren Sie den Code und fügen Sie ihn hinzu Öffnen Sie die Datei functions.php Ihres WordPress-Themes (oder erstellen Sie ein benutzerdefiniertes Plugin, wenn Sie das Theme nicht ändern oder Code Snippets verwenden möchten). Kopieren Sie den vollständigen Formularcode und fügen Sie ihn in Ihre functions.php-Datei ein. 2. Google reCAPTCHA einrichten (optional) Gehen Sie zu Google reCAPTCHA . Wählen Sie reCAPTCHA v2 und aktivieren Sie das Kontrollkästchen "Ich bin kein Roboter" . Registrieren Sie Ihre Website und erhalten Sie die Schlüssel:Polylang Platzhalter nicht ändern Ersetzen Sie im Code des Formulars 'YOUR_SITE_KEY'
und 'YOUR_SECRET_KEY'
durch die Schlüssel, die Sie erhalten haben.Polylang-Platzhalter nicht ändern 3. Verbotene Wörter festlegen (optional) 1 - Suchen Sie im Code des Formulars die Zeile:
$palabras_prohibidas = ' ';
2 - Fügen Sie die Wörter, die Sie blockieren möchten, durch Kommata getrennt ein. Zum Beispiel:
$palabras_prohibidas = 'caca,culo,pedo,pis';
Wenn Sie keine Wörter blockieren wollen, lassen Sie die Variable leer.
4. Anpassen des Captcha-Textes für die Summe (optional) Suchen Sie im Code des Formulars nach dieser Zeile:
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Ändern Sie den Text "Are you human? Lösen Sie diese Summe:" mit dem Text, den Sie anzeigen möchten.
5. Fügen Sie die URL Ihrer Datenschutzrichtlinie hinzu Ersetzen Sie in dieser Zeile die Beispiel-URL durch die URL der Datenschutzrichtlinie Ihrer Website:
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Kurzcode Fügen Sie den Shortcode zu der Seite oder dem Beitrag hinzu, auf der das Formular angezeigt werden soll.
[formulario_contacto]
Schließlich müssen Sie nur noch testen, ob die E-Mails gesendet werden und ankommen, und die Nutzung beobachten, um zu verhindern, dass sich unerbittliche Spammer einschleusen, indem sie das mathematische Captcha verkomplizieren und/oder beide Captchas gleichzeitig aktivieren. Der Code kann immer noch verbessert werden, er kann debuggt und optimiert werden. Sie können ihn auch übersetzen, wenn Sie ihn in einer anderen Sprache verwenden möchten.
Wenn ich je nach Ergebnis Änderungen oder Verbesserungen am Code vornehme, werde ich die Anmerkungen hier hinzufügen.
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');