Я не розумію, чому WordPress досі не має простої, але повної контактної форми за замовчуванням.
Оскільки я регулярно займаюся оптимізацією WordPress , як тут, так і на сторонніх сайтах, я часто замінюю непотрібні роздуті плагіни з опціями, блоками і прикрасами, які ніколи не використовуються або не потрібні, кодом для полегшення навантаження.
Ця контактна форма є повним і настроюваним рішенням для WordPress, розробленим, щоб бути безпечним, простим у використанні і поважати конфіденційність користувачів. Крім того, ви можете додавати або видаляти опції за власним бажанням. Це форма, яку я використовую тут .
Ось його основні функції та можливості, а також інструкція, як додати його на будь-яку сторінку або допис вашого блогу за допомогою шорткоду.
Структура та опції 1. поля форми Ім 'я: обов'язкове поле для введення імені користувача.Адреса електронної пошти : Обов'язкове поле для введення користувачем адреси електронної пошти.Повідомлення : Обов'язкове поле для написання користувачем свого повідомлення. Воно повинно мати довжину не менше 15 символів.Сума капчі : Проста капча, яка просить користувача обчислити суму двох випадкових чисел від 1 до 9.Прийняття політики конфіденційності : Обов'язковий прапорець для прийняття політики конфіденційності перед відправкою форми.Перевірки та безпека Перевірка обов'язкових полів : Всі поля є обов'язковими. Якщо якесь з них відсутнє, з'явиться повідомлення про помилку.Перевірка посилань : Жодні посилання (URL) не допускаються в полях імені або повідомлення.Додавання Captcha : запобігає автоматизованому спаму, вимагаючи від користувача розв'язати просту математичну операцію.Google reCAPTCHA (необов'язково ): якщо ключі Google reCAPTCHA налаштовані, додається другий рівень захисту від ботів. Якщо ключі reCAPTCHA не додані до коду, код не буде додано до форми.Перевірка заборонених слів : За бажанням, певні слова можуть бути заблоковані в повідомленні, наприклад: ананас, піца, біткойн (через кому і без пробілів).Nonce security : захист від CSRF-атак (Cross-Site Request Forgery - підробка міжсайтових запитів).3. Конфіденційність Відсутністьзберігання даних : Жодні дані користувачів не зберігаються (ні електронні адреси, ні IP-адреси, ні URL-адреси, ніщо). Цей підхід відповідає правилам конфіденційності, таким як GDPR, оскільки ніяка особиста інформація не збирається і не зберігається. Політика конфіденційності : містить посилання на політику конфіденційності, яку користувач повинен прочитати і прийняти перед відправкою форми.4. Повідомлення зворотного зв'язку Повідомлення про помилки : Відображаються у блоці у верхній частині форми, якщо є помилки при валідації.Повідомлення про успіх : Після успішного відправлення форми відображається повідомлення про успіх зеленим кольором, розміром 14px і жирним шрифтом:"Дякуємо! Ваше повідомлення надіслано ". Ви можете змінити цей текст і його форматування в коді. Решта стилів, таких як жовтий фон, рамка і тінь поля з формою, які ви можете побачити тут , а також інші зовнішні елементи не включені в код, оскільки вони додаються за допомогою контейнера GenerateBlocks .5. Персоналізація Текст капчі : Налаштовується (за замовчуванням: "Ви людина? Розв'яжіть цю суму:").Заборонені слова : можна додати список заборонених слів через кому.Google reCAPTCHA : Необов'язково, додається тільки якщо ви налаштуєте і додасте в код сайт і секретні ключі вашої капчі.6. Перформанс Код перевіряє наявність шорткоду, і якщо його немає, він нічого не покаже, тобто буде виконуватися лише на тій сторінці або в тому дописі, де його було додано.
Продуктивність там, де вона показана, є оптимальною.
Інструкції з встановлення та налаштування 1. скопіюйте та додайте код Відкрийте файл functions.php вашої теми WordPress (або створіть власний плагін, якщо ви не хочете змінювати тему або використовувати фрагменти коду ). Скопіюйте та вставте повний код форми у ваш файл functions.php. 2. Налаштуйте Google reCAPTCHA (необов'язково) Перейдіть до Google reCAPTCHA . Виберіть reCAPTCHA v2 і встановіть прапорець "Я не робот ". Зареєструйте свій сайт та отримайте ключі:Заповнювач Polylang не змінювати У коді форми замініть 'YOUR_SITE_KEY
' і 'YOUR_SECRET_KEY
' на отримані вами ключі. Заповнювач Polylang не змінюйте 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');