Anlamadığım bir şey de WordPress'in henüz varsayılan olarak basit ama eksiksiz bir iletişim formu içermemesi.
Hem burada hem de üçüncü taraf sitelerde düzenli olarak WordPress optimizasyon çalışmaları yaptığımdan, yükü hafifletmek için genellikle gereksiz yere şişirilmiş eklentileri, hiç kullanılmayan veya ihtiyaç duyulmayan seçenekleri, blokları ve süslemeleri kodla değiştiriyorum.
Bu iletişim formu, WordPress için güvenli, kullanımı kolay ve kullanıcı gizliliğine saygılı olacak şekilde tasarlanmış eksiksiz ve özelleştirilebilir bir çözümdür. Ayrıca dilediğiniz gibi seçenek ekleyip çıkarabilirsiniz. Burada kullandığım form bu.
Bunlar, ana işlevleri ve özellikleri ile bir kısa kodla blogunuzun herhangi bir sayfasına veya gönderisine ekleme talimatlarıdır.
Yapı ve seçenekler Ad : Kullanıcının adını girmesi için zorunlu alan.E-posta adresi : Kullanıcının e-posta adresini girmesi için gerekli alan.Mesaj : Kullanıcının mesajını yazması için zorunlu alan. En az 15 karakter uzunluğunda olmalıdır.Toplam captcha : Kullanıcıdan 1 ile 9 arasında iki rastgele sayının toplamını çözmesini isteyen basit bir captcha.Gizlilik politikasınınkabulü : Formu göndermeden önce gizlilik politikasını kabul etmek için zorunlu onay kutusu. Doğrulamalar ve güvenlik Zorunlu alanların doğrulanması: Tümalanlar zorunludur . Herhangi biri eksikse, bir hata mesajı görüntülenir.Bağlantı doğrulama : Ad veya mesaj alanlarında hiçbir bağlantıya (URL) izin verilmez.Addition Captcha : Kullanıcının basit bir matematiksel işlemi çözmesini gerektirerek otomatik spam'i önler.Google reCAPTCHA(isteğe bağlı) : Google reCAPTCHA anahtarları yapılandırılırsa, botları önlemek için ikinci bir güvenlik düzeyi eklenir. Koda reCAPTCHA anahtarları eklenmezse, kod forma eklenmeyecektir. Yasaklı kelimelerin doğrulanması: İsteğe bağlı olarak, mesajda belirli kelimeler engellenebilir, örneğin: ananas, pizza, bitcoin (virgülle ayrılmış ve boşluksuz).Nonce güvenliği : CSRF (Cross-Site Request Forgery) saldırılarına karşı koruma sağlar.3. Gizlilik Veri depolama yok : Hiçbir kullanıcı verisi depolanmaz (e-posta yok, IP yok, yönlendiren URL yok, hiçbir şey yok). Bu yaklaşım, hiçbir kişisel bilgi toplanmadığı veya saklanmadığı için GDPR gibi gizlilik düzenlemelerine uygundur.Gizlilik politikası : Kullanıcının formu göndermeden önce okuması ve kabul etmesi gereken gizlilik politikasına bir bağlantı içerir.4. Geri bildirim mesajları Hata mesajları : Doğrulamada hatalar varsa formun üst kısmında bir blok halinde görüntülenir.Başarı mesajı : Form başarıyla gönderildikten sonra, yeşil renkte, 14 piksel boyutunda ve kalın bir başarı mesajı görüntülenir:"Teşekkürler! Mesajınız gönderildi ". Bu metni ve biçimlendirmesini kod içinde değiştirebilirsiniz. Sarı arka plan, burada görebileceğiniz formu içeren kutunun kenarlığı ve gölgesi gibi stillerin geri kalanı ve diğer harici öğeler, GenerateBlocks konteyneri ile eklendikleri için koda dahil edilmemiştir.5. Kişiselleştirme Captcha metni : Özelleştirilebilir (varsayılan: "İnsan mısınız? Bu toplamı çözün:").Yasaklıkelimeler : Virgülle ayrılmış bir yasaklı kelimeler listesi eklenebilir. Google reCAPTCHA : İsteğe bağlıdır, yalnızca captcha'nızın site ve gizli anahtarlarını yapılandırıp koda eklerseniz eklenir.Kod, kısa kodun mevcut olup olmadığını kontrol eder ve kısa kod mevcut değilse hiçbir şey göstermez, bu nedenle yalnızca kısa kodun eklendiği sayfada veya gönderide çalışır.
Gösterildiği yerde performans optimumdur.
Kurulum ve yapılandırma talimatları 1. Kodu kopyalayın ve ekleyin WordPress temanızın functions.php dosyasını açın (veya temayı değiştirmeyi veya Code Snippets kullanmayı tercih etmiyorsanız özel bir eklenti oluşturun). Form kodunun tamamını kopyalayıp functions.php dosyanıza yapıştırın. 2. Google reCAPTCHA'yı ayarlayın (İsteğe bağlı) Google reCAPTCHA 'ya gidin.reCAPTCHA v2 'yi seçin ve "Ben robot değilim" onay kutusunu işaretleyin.Web sitenizi kaydedin ve anahtarları alın:Polylang yer tutucusu değiştirmeyin Form kodunda, 'YOUR_SITE_KEY'
ve 'YOUR_SECRET_KEY'
ifadelerini elde ettiğiniz anahtarlarla değiştirin.Polylang yer tutucusunu değiştirmeyin 3. Yasaklı kelimeleri ayarlayın (İsteğe bağlı) 1 - Form kodunda şu satırı bulun:
$palabras_prohibidas = ' ';
2 - Engellemek istediğiniz kelimeleri virgülle ayırarak ekleyin. Örneğin:
$palabras_prohibidas = 'caca,culo,pedo,pis';
Herhangi bir kelimeyi engellemek istemiyorsanız, değişkeni boş bırakın.
4. Toplamın captcha metnini özelleştirin (İsteğe bağlı) Form kodunda bu satırı arayın:
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Metni değiştirin "İnsan mısınız? Bu toplamı çözün:" metnini göstermek istediğiniz metinle değiştirin.
5. Gizlilik politikanızın URL'sini ekleyin Bu satırdaki örnek url'yi sitenizin gizlilik politikasının URL'si ile değiştirin:
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Kısa kod Kısa kodu, formun görüntülenmesini istediğiniz sayfaya veya gönderiye ekleyin.
[formulario_contacto]
Son olarak, e-postaların gönderildiğini ve ulaştığını doğrulamak için test etmeniz ve acımasız spam göndericilerin matematiksel captcha'yı karmaşıklaştırarak ve/veya her iki captcha'yı aynı anda etkinleştirerek gizlice girmelerini önlemek için kullanımı gözlemlemeniz gerekecektir. Kod her zaman geliştirilebilir, hata ayıklanabilir ve optimize edilebilir. Ayrıca başka bir dilde kullanmanız gerekiyorsa çevirebilirsiniz.
Sonuca bağlı olarak kodda değişiklik veya iyileştirme yaparsam, notları buraya ekleyeceğim.
Kod //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');