Yksi asia, jota en ymmärrä, on se, että WordPress ei vielä sisällä oletuksena yksinkertaista mutta täydellistä yhteydenottolomaketta.
Koska teen säännöllisesti WordPressin optimointityötä sekä täällä että kolmansien osapuolten sivustoilla, korvaan usein tarpeettomasti paisuneet laajennukset, joissa on vaihtoehtoja, lohkoja ja koristeita, joita ei koskaan käytetä tai joita ei tarvita koodilla kuorman keventämiseksi.
Tämä yhteydenottolomake on täydellinen ja muokattavissa oleva ratkaisu WordPressiin, joka on suunniteltu turvalliseksi, helppokäyttöiseksi ja käyttäjän yksityisyyttä kunnioittavaksi. Lisäksi voit lisätä tai poistaa vaihtoehtoja haluamallasi tavalla. Tätä lomaketta käytän täällä .
Nämä ovat sen tärkeimmät toiminnot ja ominaisuudet sekä ohjeet sen lisäämiseksi mihin tahansa blogisi sivuun tai viestiin lyhytkoodin avulla.
Rakenne ja vaihtoehdot 1. Lomakekentät Nimi : Pakollinen kenttä, johon käyttäjä voi syöttää nimensä.Sähköpostiosoite : Pakollinen kenttä, johon käyttäjä voi syöttää sähköpostiosoitteensa.Viesti : Pakollinen kenttä, johon käyttäjä voi kirjoittaa viestinsä. Sen on oltava vähintään 15 merkkiä pitkä.Sum captcha : Yksinkertainen captcha, jossa käyttäjää pyydetään ratkaisemaan kahden satunnaisen numeron summa välillä 1-9.Tietosuojaselosteen hyväksyminen : Pakollinen valintaruutu, jolla hyväksyt tietosuojaselosteen ennen lomakkeen lähettämistä.Validointi ja turvallisuus Pakollisten kenttien validointi : Kaikki kentät ovat pakollisia. Jos jokin puuttuu, näytetään virheilmoitus.Linkin validointi : Nimi- tai viestikentissä ei saa olla linkkejä (URL-osoitteita).Addition Captcha : Estää automaattisen roskapostin pyytämällä käyttäjää ratkaisemaan yksinkertaisen matemaattisen operaation.Google reCAPTCHA (valinnainen) : Jos Google reCAPTCHA -avaimet on määritetty, lisätään toinen turvallisuustaso bottien estämiseksi. Jos koodiin ei lisätä reCAPTCHA-avaimia, koodia ei lisätä lomakkeeseen.Kiellettyjen sanojen validointi : Vaihtoehtoisesti tietyt sanat voidaan estää viestissä, esimerkiksi: ananas, pizza, bitcoin (erotettuna pilkulla ja ilman välilyöntejä).Nonce-turva : Suojaa CSRF-hyökkäyksiltä (Cross-Site Request Forgery).3. Yksityisyys Ei tietojen tallennusta : Käyttäjätietoja ei tallenneta (ei sähköposteja, ei IP-osoitteita, ei viittaavia URL-osoitteita, ei mitään). Tämä lähestymistapa on GDPR:n kaltaisten tietosuojasäännösten mukainen, sillä henkilötietoja ei kerätä eikä tallenneta.Tietosuojakäytäntö : Sisältää linkin tietosuojakäytäntöön, joka käyttäjän on luettava ja hyväksyttävä ennen lomakkeen lähettämistä.4. Palauteviestit Virheilmoitukset : Näytetään lomakkeen yläosassa olevassa lohkossa, jos validoinnissa on virheitä.Onnistumisviesti : Kun lomakkeen lähettäminen on onnistunut, onnistumisviesti näytetään vihreänä, 14px:n kokoisena ja lihavoituna:"Kiitos!". Viestisi on lähetetty ". Voit muuttaa tätä tekstiä ja sen muotoilua koodissa. Muut tyylit, kuten keltainen tausta, lomakkeen sisältävän laatikon reunus ja varjo, jotka näet tässä , sekä muut ulkoiset elementit eivät sisälly koodiin, koska ne lisätään GenerateBlocks-säiliöllä .5. Henkilökohtaistaminen Captcha-teksti : Muokattavissa (oletus: "Oletko ihminen? Ratkaise tämä summa:").Kielletyt sanat : Voit lisätä pilkulla erotetun luettelon kielletyistä sanoista.Google reCAPTCHA : Vapaaehtoinen, lisätään vain, jos määrität ja lisäät koodiin captchan sivuston ja salaiset avaimet.6. Suorituskyky Koodi tarkistaa, onko lyhytkoodi olemassa, ja jos lyhytkoodia ei ole, se ei näytä mitään, joten se toimii vain sivulla tai viestissä, johon lyhytkoodi on lisätty.
Suorituskyky on optimaalinen siellä, missä se näkyy.
Asennus- ja konfigurointiohjeet 1. Kopioi ja lisää koodi Avaa WordPress-teemasi functions.php-tiedosto (tai luo mukautettu lisäosa, jos et halua muuttaa teemaa tai käyttää Code Snippets -ohjelmaa). Kopioi ja liitä koko lomakekoodi functions.php-tiedostoosi. 2. Määritä Google reCAPTCHA (Valinnainen) Siirry Googlen reCAPTCHA-sivulle . Valitse reCAPTCHA v2 ja valitse "En ole robotti" -valintaruutu . Rekisteröi verkkosivustosi ja hanki avaimet:Polylang placeholder älä muuta Korvaa lomakekoodissa 'YOUR_SITE_KEY
' ja 'YOUR_SECRET_KEY
' saamillasi avaimilla.Polylang placeholder älä muuta. 3. Aseta kielletyt sanat (valinnainen) 1 - Etsi lomakkeen koodista rivi:
$palabras_prohibidas = ' ';
2 - Lisää estettävät sanat pilkulla erotettuna. Esimerkiksi:
$palabras_prohibidas = 'caca,culo,pedo,pis';
Jos et halua estää sanoja, jätä muuttuja tyhjäksi.
4. Mukauta summan captcha-tekstiä (valinnainen). Etsi lomakkeen koodista tämä rivi:
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Vaihda teksti "Oletko ihminen? Ratkaise tämä summa:" haluamallasi tekstillä.
5. Lisää tietosuojakäytäntösi URL-osoite Korvaa esimerkin url tällä rivillä sivustosi tietosuojakäytännön URL-osoitteella:
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Shortcode Lisää lyhytkoodi sivulle tai viestiin, jossa haluat lomakkeen näkyvän.
[formulario_contacto]
Lopuksi sinun on vain testattava sitä varmistaaksesi, että sähköpostit lähetetään ja saapuvat, ja tarkkailtava käyttöä, jotta estät säälimättömiä roskapostittajia hiipimästä sisään monimutkaistamalla matemaattista captchaa ja/tai aktivoimalla molemmat captchat samaan aikaan. Koodia voidaan aina parantaa, sitä voidaan korjata ja optimoida. Voit myös kääntää sen, jos haluat käyttää sitä toisella kielellä.
Jos teen muutoksia tai parannuksia koodiin tulosten perusteella, lisään huomautukset tähän.
Koodi //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');