Ένα πράγμα που δεν καταλαβαίνω είναι ότι το WordPress δεν περιλαμβάνει ακόμη μια απλή αλλά πλήρη φόρμα επικοινωνίας από προεπιλογή.
Καθώς κάνω τακτικά εργασίες βελτιστοποίησης του WordPress , τόσο εδώ όσο και σε ιστότοπους τρίτων, συχνά αντικαθιστώ τα περιττά διογκωμένα πρόσθετα με επιλογές, μπλοκ και διακοσμήσεις που δεν χρησιμοποιούνται ποτέ ή δεν χρειάζονται με κώδικα για να ελαφρύνω το φορτίο.
Αυτή η φόρμα επικοινωνίας είναι μια πλήρης και προσαρμόσιμη λύση για το WordPress, σχεδιασμένη να είναι ασφαλής, εύκολη στη χρήση και να σέβεται την ιδιωτικότητα των χρηστών. Επιπλέον, μπορείτε να προσθέσετε ή να αφαιρέσετε επιλογές όπως επιθυμείτε. Αυτή είναι η φόρμα που χρησιμοποιώ εδώ .
Αυτές είναι οι κύριες λειτουργίες και τα χαρακτηριστικά του και οι οδηγίες για να το προσθέσετε σε οποιαδήποτε σελίδα ή ανάρτηση του ιστολογίου σας με έναν σύντομο κωδικό.
Δομή και επιλογές 1. Πεδία φόρμας Όνομα : Υποχρεωτικό πεδίο για την εισαγωγή του ονόματος του χρήστη.Διεύθυνση ηλεκτρονικού ταχυδρομείου : Υποχρεωτικό πεδίο για να εισάγει ο χρήστης τη διεύθυνση ηλεκτρονικού ταχυδρομείου του.Μήνυμα : Υποχρεωτικό πεδίο για να γράψει ο χρήστης το μήνυμά του. Πρέπει να είναι τουλάχιστον 15 χαρακτήρες.Captcha πρόσθεσης : Ένα απλό captcha που ζητά από τον χρήστη να λύσει ένα άθροισμα δύο τυχαίων αριθμών μεταξύ 1 και 9.Αποδοχή της πολιτικής απορρήτου : Υποχρεωτικό πλαίσιο ελέγχου για την αποδοχή της πολιτικής απορρήτου πριν από την υποβολή της φόρμας.Επικυρώσεις και ασφάλεια Επικύρωση υποχρεωτικών πεδίων : Όλα τα πεδία είναι υποχρεωτικά. Εάν κάποιο από αυτά λείπει, εμφανίζεται μήνυμα σφάλματος.Επικύρωση συνδέσμου : Δεν επιτρέπονται σύνδεσμοι (URL) στα πεδία όνομα ή μήνυμα.Captcha πρόσθεσης : Αποτρέπει την αυτοματοποιημένη ανεπιθύμητη αλληλογραφία, απαιτώντας από τον χρήστη να λύσει μια απλή μαθηματική πράξη.Google reCAPTCHA (προαιρετικό) : Εάν έχουν ρυθμιστεί τα κλειδιά Google reCAPTCHA, προστίθεται ένα δεύτερο επίπεδο ασφάλειας για την αποτροπή των bots. Εάν τα κλειδιά reCAPTCHA δεν προστεθούν στον κώδικα, ο κώδικας δεν θα προστεθεί στη φόρμα.Επικύρωση απαγορευμένων λέξεων : Προαιρετικά, μπορούν να αποκλειστούν συγκεκριμένες λέξεις στο μήνυμα, π.χ.: ανανάς, πίτσα, bitcoin (διαχωρισμένες με κόμμα και χωρίς κενά).Ασφάλεια Nonce : Προστατεύει από επιθέσεις CSRF (Cross-Site Request Forgery).3. Απόρρητο Καμία αποθήκευση δεδομένων : Δεν αποθηκεύονται δεδομένα χρήστη (ούτε emails, ούτε IPs, ούτε URL παραπομπής, τίποτα). Αυτή η προσέγγιση συμμορφώνεται με τους κανονισμούς προστασίας της ιδιωτικής ζωής, όπως ο ΓΚΠΔ, καθώς δεν συλλέγονται ούτε αποθηκεύονται προσωπικές πληροφορίες.Πολιτική απορρήτου : Περιλαμβάνει σύνδεσμο προς την πολιτική απορρήτου την οποία ο χρήστης πρέπει να διαβάσει και να αποδεχθεί πριν από την υποβολή της φόρμας.4. Μηνύματα ανατροφοδότησης Μηνύματα σφάλματος : Εμφανίζονται σε ένα μπλοκ στο επάνω μέρος της φόρμας, εάν υπάρχουν σφάλματα στην επικύρωση.Μήνυμα επιτυχίας : Μετά την επιτυχή υποβολή της φόρμας, εμφανίζεται ένα μήνυμα επιτυχίας με πράσινο χρώμα, μέγεθος 14px και έντονη γραφή:"Σας ευχαριστούμε! Το μήνυμά σας στάλθηκε ". Μπορείτε να αλλάξετε αυτό το κείμενο και τη μορφοποίησή του στον κώδικα. Τα υπόλοιπα στυλ, όπως το κίτρινο φόντο, το περίγραμμα και η σκιά του πλαισίου που περιέχει τη φόρμα που μπορείτε να δείτε εδώ , καθώς και άλλα εξωτερικά στοιχεία δεν περιλαμβάνονται στον κώδικα, καθώς προστίθενται με ένα δοχείο GenerateBlocks .5. Εξατομίκευση Κείμενο Captcha : Προσαρμόσιμο (προεπιλογή: "Are you human? Solve this sum:").Απαγορευμένες λέξεις : Μπορεί να προστεθεί ένας κατάλογος απαγορευμένων λέξεων χωρισμένος με κόμμα.Google reCAPTCHA : Προαιρετικό, προστίθεται μόνο αν ρυθμίσετε και προσθέσετε στον κώδικα το site και τα μυστικά κλειδιά του captcha σας.6. Απόδοση Ο κώδικας ελέγχει αν ο σύντομος κωδικός είναι παρών και αν ο σύντομος κωδικός δεν είναι παρών, δεν θα εμφανίσει τίποτα, οπότε θα εκτελεστεί μόνο στη σελίδα ή τη δημοσίευση όπου έχει προστεθεί ο σύντομος κωδικός.
Η απόδοση όπου εμφανίζεται είναι βέλτιστη.
Οδηγίες εγκατάστασης και διαμόρφωσης 1. Αντιγράψτε και προσθέστε τον κώδικα Ανοίξτε το αρχείο functions.php του θέματος WordPress σας (ή δημιουργήστε ένα προσαρμοσμένο πρόσθετο αν προτιμάτε να μην τροποποιήσετε το θέμα ή να μην χρησιμοποιήσετε τα Code Snippets ). Αντιγράψτε και επικολλήστε τον πλήρη κώδικα της φόρμας στο αρχείο functions.php. 2. Ρύθμιση του Google reCAPTCHA (Προαιρετικά) Μεταβείτε στο Google reCAPTCHA . Επιλέξτε reCAPTCHA v2 και επιλέξτε το πλαίσιο ελέγχου "Δεν είμαι ρομπότ" . Καταχωρήστε τον ιστότοπό σας και λάβετε τα κλειδιά:Polylang placeholder do not modify Στον κώδικα της φόρμας, αντικαταστήστε το 'YOUR_SITE_KEY'
και το 'YOUR_SECRET_KEY'
με τα κλειδιά που αποκτήσατε. 3. Ορισμός απαγορευμένων λέξεων (προαιρετικά) 1 - Στον κώδικα της φόρμας, βρείτε τη γραμμή:
$palabras_prohibidas = ' ';
2 - Προσθέστε τις λέξεις που θέλετε να μπλοκάρετε, χωρισμένες με κόμματα. Για παράδειγμα:
$palabras_prohibidas = 'caca,culo,pedo,pis';
Αν δεν θέλετε να μπλοκάρετε καμία λέξη, αφήστε τη μεταβλητή κενή.
4. Προσαρμόστε το κείμενο captcha του ποσού (Προαιρετικά) Στον κώδικα της φόρμας, αναζητήστε αυτή τη γραμμή:
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Αλλάξτε το κείμενο "Είστε άνθρωπος; Λύστε αυτό το άθροισμα:" με αυτό που θέλετε να εμφανίσετε.
5. Προσθέστε τη διεύθυνση URL της πολιτικής απορρήτου σας Αντικαταστήστε το url του παραδείγματος με τη διεύθυνση URL της πολιτικής απορρήτου του ιστότοπού σας σε αυτή τη γραμμή:
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Shortcode Προσθέστε τον σύντομο κωδικό στη σελίδα ή τη δημοσίευση όπου θέλετε να εμφανίζεται η φόρμα.
[formulario_contacto]
Τέλος, θα πρέπει απλώς να το δοκιμάσετε για να επαληθεύσετε ότι τα μηνύματα ηλεκτρονικού ταχυδρομείου αποστέλλονται και φτάνουν και να παρατηρήσετε τη χρήση για να αποτρέψετε τους αδυσώπητους spammers από το να βάλουν κρυφά τα σκατά τους, περιπλέκοντας το μαθηματικό captcha ή/και ενεργοποιώντας και τα δύο captcha ταυτόχρονα. Ο κώδικας μπορεί πάντα να βελτιωθεί και να αποσφαλματωθεί και να βελτιστοποιηθεί. Μπορείτε επίσης να τον μεταφράσετε αν χρειαστεί να τον χρησιμοποιήσετε σε άλλη γλώσσα.
Αν κάνω αλλαγές ή βελτιώσεις στον κώδικα ανάλογα με το αποτέλεσμα, θα προσθέσω τις σημειώσεις εδώ.
Κωδικός //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');