الشيء الوحيد الذي لا أفهمه هو أن ووردبريس لا يتضمن حتى الآن نموذج اتصال بسيط ولكن كامل بشكل افتراضي.
بما أنني أقوم بعمل تحسينات ووردبريس بانتظام، سواء هنا أو على مواقع الطرف الثالث، غالبًا ما أستبدل الإضافات المتضخمة غير الضرورية بالخيارات والكتل والزخارف التي لا تُستخدم أبدًا أو لا حاجة إليها برمز لتخفيف الحمل.
نموذج الاتصال هذا هو حل كامل وقابل للتخصيص لـ WordPress، مصمم ليكون آمنًا وسهل الاستخدام ويحترم خصوصية المستخدم. بالإضافة إلى ذلك، يمكنك إضافة أو إزالة الخيارات كما يحلو لك. هذا هو النموذج الذي أستخدمه هنا .
هذه هي وظائفه وخصائصه الرئيسية وإرشادات إضافته إلى أي صفحة أو مقالة في مدونتك باستخدام كود قصير.
الهيكل والخيارات 1 - حقول النموذج الاسم : حقل إلزامي للمستخدم لإدخال اسمه أو اسمها.عنوان البريد الإلكتروني : حقل مطلوب للمستخدم لإدخال عنوان بريده الإلكتروني.الرسالة : حقل إلزامي للمستخدم لكتابة رسالته. يجب ألا يقل طولها عن 15 حرفاً.مجموع اختبار CAPTCHA : اختبار CAPTCHA بسيط يطلب من المستخدم حل مجموع رقمين عشوائيين بين 1 و9.قبول سياسة الخصوصية : خانة اختيار إلزامية لقبول سياسة الخصوصية قبل إرسال النموذج.عمليات التحقق والأمان التحقق من صحة الحقول الإلزامية : جميع الحقول إلزامية. إذا كان أي منها ناقصًا، يتم عرض رسالة خطأ.التحقق من صحة الروابط : لا يُسمح بوجود روابط (عناوين URL) في حقلي الاسم أو الرسالة.إضافة Captcha : تمنع الرسائل غير المرغوب فيها الآلية من خلال مطالبة المستخدم بحل عملية حسابية بسيطة.Google reCAPTCHA من Google (اختياري) : إذا تم تكوين مفاتيح Google reCAPTCHA، فسيتم إضافة مستوى ثانٍ من الأمان لمنع الروبوتات. إذا لم تتم إضافة مفاتيح reCAPTCHA إلى الرمز، فلن تتم إضافة الرمز إلى النموذج.التحقق من صحة الكلمات المحظورة : اختياريًا، يمكن حظر كلمات محددة في الرسالة، على سبيل المثال: أناناس، بيتزا، بيتكوين (مفصولة بفاصلة وبدون مسافات).أمان Nonce : يحمي من هجمات CSRF (تزوير الطلبات عبر المواقع).3. الخصوصية عدم تخزين البيانات : لا يتم تخزين أي بيانات للمستخدمين (لا توجد رسائل بريد إلكتروني، ولا عناوين IP، ولا عناوين URL للإحالة، ولا أي شيء). يتوافق هذا النهج مع لوائح الخصوصية مثل اللائحة العامة لحماية البيانات، حيث لا يتم جمع أي معلومات شخصية أو تخزينها.سياسة الخصوصية : تتضمن رابطًا لسياسة الخصوصية التي يجب على المستخدم قراءتها وقبولها قبل إرسال النموذج.4. رسائل الملاحظات رسائل الخطأ : تُعرض في كتلة أعلى النموذج في حالة وجود أخطاء في التحقق من الصحة.رسالة النجاح : بعد إرسال النموذج بنجاح، يتم عرض رسالة نجاح باللون الأخضر، بحجم 14 بكسل وبخط عريض:"شكرًا لك! تم إرسال رسالتك ". يمكنك تغيير هذا النص وتنسيقه في الكود. لا يتم تضمين بقية الأنماط مثل الخلفية الصفراء وحدود وظل المربع الذي يحتوي على النموذج الذي يمكنك رؤيته هنا، بالإضافة إلى العناصر الخارجية الأخرى في الكود حيث تتم إضافتها باستخدام حاوية GenerateBlocks .5. التخصيص نص كلمة التحقق : قابل للتخصيص (افتراضي: "هل أنت إنسان؟ حل هذا المجموع:").الكلمات المحظورة : يمكن إضافة قائمة مفصولة بفاصلة من الكلمات المحظورة.Google reCAPTCHA من Google : اختياري، يُضاف فقط إذا قمت بتكوين وإضافة الموقع والمفاتيح السرية للـ captcha إلى الكود.6. الأداء يتحقق الرمز القصير مما إذا كان الرمز القصير موجودًا، وإذا لم يكن الرمز القصير موجودًا، فلن يعرض أي شيء، لذا لن يعمل إلا على الصفحة أو المقالة التي تمت إضافة الرمز القصير إليها.
الأداء في المكان الذي يظهر فيه هو الأمثل.
تعليمات التثبيت والتهيئة 1 - انسخ الرمز وأضفه افتح ملف functions.php الخاص بقالب ووردبريس الخاص بك (أو أنشئ إضافة مخصصة إذا كنتَ تفضِّل عدم تعديل القالب أو استخدام مقتطفات التعليمات البرمجية ). انسخ كود النموذج الكامل والصقه في ملف function.php الخاص بك. 2. إعداد Google reCAPTCHA (اختياري) انتقل إلى Google reCAPTCHA . حدد reCAPTCHA v2 وحدد خانة الاختيار "أنا لست روبوتًا" . قم بتسجيل موقع الويب الخاص بك واحصل على المفاتيح: لا تعدل العنصر النائب Polylang في كود النموذج، استبدل "Your_SITE_KEY"
و "YOUR_SECRET_KEY
" بالمفاتيح التي حصلت عليها. 3. تعيين الكلمات المحظورة (اختياري) 1 - في رمز النموذج، ابحث عن السطر:
$palabras_prohibidas = ' ';
2 - أضف الكلمات التي تريد حظرها، مفصولة بفواصل. على سبيل المثال:
$palabras_prohibidas = 'caca,culo,pedo,pis';
إذا كنت لا تريد حظر أي كلمات، فاترك المتغير فارغًا.
4. تخصيص نص كلمة التحقق من المجموع (اختياري) في كود النموذج، ابحث عن هذا السطر:
<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. الرمز القصير أضف الرمز القصير إلى الصفحة أو المقالة التي تريد عرض النموذج فيها.
[formulario_contacto]
أخيرًا، سيكون عليك فقط اختباره للتحقق من إرسال رسائل البريد الإلكتروني ووصولها ومراقبة الاستخدام لمنع مرسلي البريد العشوائي المتصلبين من التسلل إلى الداخل عن طريق تعقيد الكابتشا الرياضية و/أو تفعيل كلا الكابتشين في نفس الوقت. يمكن تحسين الكود دائمًا ويمكن تصحيحه وتحسينه. يمكنك أيضًا ترجمته إذا كنت بحاجة إلى استخدامه بلغة أخرى.
إذا أجريت تغييرات أو تحسينات على الكود بناءً على النتيجة، سأضيف الملاحظات هنا.
الكود //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');