Satu hal yang tidak saya pahami adalah bahwa WordPress belum menyertakan formulir kontak yang sederhana namun lengkap secara default.
Karena saya secara teratur melakukan pekerjaan pengoptimalan WordPress , baik di sini maupun di situs pihak ketiga, saya sering mengganti plugin yang membengkak yang tidak perlu dengan opsi, blok, dan dekorasi yang tidak pernah digunakan atau tidak diperlukan dengan kode untuk meringankan beban.
Formulir kontak ini merupakan solusi lengkap dan dapat disesuaikan untuk WordPress, dirancang agar aman, mudah digunakan, dan menghormati privasi pengguna. Selain itu, Anda dapat menambahkan atau menghapus opsi sesuai keinginan. Ini adalah formulir yang saya gunakan di sini .
Berikut ini adalah fungsi dan fitur utamanya serta petunjuk untuk menambahkannya ke halaman atau postingan mana pun di blog Anda dengan kode pendek.
Struktur dan opsi Nama : Bidang wajib bagi pengguna untuk memasukkan namanya.Alamat email : Bidang yang harus diisi oleh pengguna untuk memasukkan alamat email mereka.Pesan : Bidang wajib bagi pengguna untuk menulis pesan mereka. Panjangnya minimal 15 karakter.Captcha penjumlahan : Captcha sederhana yang meminta pengguna untuk memecahkan jumlah dua angka acak antara 1 dan 9.Penerimaan kebijakan privasi : Kotak centang wajib untuk menerima kebijakan privasi sebelum mengirimkan formulir.Validasi dan keamanan Validasi bidang wajib : Semua bidang wajib diisi. Jika ada yang tidak diisi, pesan kesalahan akan ditampilkan.Validasi tautan : Tautan (URL) tidak diperbolehkan dalam kolom nama atau pesan.Captcha Penambahan : Mencegah spam otomatis dengan meminta pengguna menyelesaikan operasi matematika sederhana.Google reCAPTCHA (opsional) : Jika kunci Google reCAPTCHA dikonfigurasi, tingkat keamanan kedua ditambahkan untuk mencegah bot. Jika kunci reCAPTCHA tidak ditambahkan ke kode, kode tidak akan ditambahkan ke formulir.Validasi kata-kata terlarang : Secara opsional, kata-kata tertentu dapat diblokir dalam pesan, misalnya: nanas, pizza, bitcoin (dipisahkan dengan koma dan tanpa spasi).Keamanan Nonce : Melindungi dari serangan CSRF (Pemalsuan Permintaan Lintas Situs).3. Privasi Tanpa penyimpanan data : Tidak ada data pengguna yang disimpan (tidak ada email, tidak ada IP, tidak ada URL rujukan, tidak ada apa pun). Pendekatan ini mematuhi peraturan privasi seperti GDPR, karena tidak ada informasi pribadi yang dikumpulkan atau disimpan.Kebijakan privasi : Mencantumkan tautan ke kebijakan privasi yang harus dibaca dan disetujui oleh pengguna sebelum mengirimkan formulir.4. Pesan umpan balik Pesan kesalahan : Ditampilkan dalam sebuah blok di bagian atas formulir jika ada kesalahan dalam validasi.Pesan sukses : Setelah berhasil mengirimkan formulir, pesan sukses akan ditampilkan dalam warna hijau, berukuran 14px dan dicetak tebal:"Terima kasih! Pesan Anda telah terkirim ". Anda dapat mengubah teks ini dan formatnya di dalam kode. Gaya lainnya seperti latar belakang kuning, batas dan bayangan kotak yang berisi formulir yang dapat Anda lihat di sini , serta elemen eksternal lainnya tidak disertakan dalam kode karena ditambahkan dengan wadah GenerateBlocks .5. Personalisasi Teks captcha : Dapat disesuaikan (default: "Apakah Anda manusia? Selesaikan jumlah ini:").Kata-kata yang dilarang: Daftar kata-kata yang dilarang yang dipisahkan dengan koma dapat ditambahkan.Google reCAPTCHA : Opsional, hanya ditambahkan jika Anda mengonfigurasi dan menambahkan kunci situs dan kunci rahasia captcha Anda ke dalam kode.6. Kinerja Kode ini akan memeriksa apakah kode pendek ada dan jika kode pendek tidak ada, kode ini tidak akan menampilkan apa pun, jadi kode ini hanya akan berjalan di halaman atau postingan di mana kode pendek telah ditambahkan.
Performa yang ditampilkan adalah optimal.
Petunjuk pemasangan dan konfigurasi 1. Salin dan tambahkan kode Buka file functions.php dari tema WordPress Anda (atau buat plugin khusus jika Anda memilih untuk tidak memodifikasi tema atau menggunakan Cuplikan Kode ). Salin dan tempelkan kode formulir lengkap ke dalam file functions.php Anda. 2. Siapkan Google reCAPTCHA (Opsional) Buka Google reCAPTCHA . Pilih reCAPTCHA v2 dan pilih kotak centang "Saya bukan robot" . Daftarkan situs web Anda dan dapatkan kuncinya: Placeholder Polylang jangan dimodifikasi Pada kode formulir, ganti 'YOUR_SITE_KEY'
dan 'YOUR_SECRET_KEY
' dengan kunci yang Anda peroleh. 3. Mengatur kata-kata yang dilarang (Opsional) 1 - Dalam kode formulir, temukan baris tersebut:
$palabras_prohibidas = ' ';
2 - Tambahkan kata-kata yang ingin Anda blokir, dipisahkan dengan koma. Sebagai contoh:
$palabras_prohibidas = 'caca,culo,pedo,pis';
Jika Anda tidak ingin memblokir kata apa pun, biarkan variabelnya kosong.
4. Sesuaikan teks captcha dari jumlah tersebut (Opsional) Dalam kode formulir, cari baris ini:
<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>
Ubah teks "Apakah Anda manusia? Selesaikan jumlah ini:" dengan yang ingin Anda tampilkan.
5. Tambahkan URL kebijakan privasi Anda Ganti url contoh dengan URL kebijakan privasi situs Anda pada baris ini:
$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';
6. Kode pendek Tambahkan kode pendek ke halaman atau postingan di mana Anda ingin formulir ditampilkan.
[formulario_contacto]
Terakhir, Anda hanya perlu mengujinya untuk memverifikasi bahwa email terkirim dan sampai serta mengamati penggunaannya untuk mencegah spammer yang tak henti-hentinya menyelinap masuk dengan memperumit captcha matematis dan/atau mengaktifkan kedua captcha secara bersamaan. Kode ini selalu dapat ditingkatkan dan dapat di-debug serta dioptimalkan. Anda juga bisa menerjemahkannya jika Anda perlu menggunakannya dalam bahasa lain.
Jika saya membuat perubahan atau perbaikan pada kode tergantung pada hasilnya, saya akan menambahkan catatan di sini.
Kode //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');