Formularz kontaktowy dla WordPress bez wtyczki

Seleccionar idioma
Formularz kontaktowy dla WordPress bez wtyczki

Jedną rzeczą, której nie rozumiem, jest to, że WordPress nie zawiera jeszcze domyślnie prostego, ale kompletnego formularza kontaktowego.

Ponieważ regularnie zajmuję się optymalizacją WordPressa, zarówno tutaj, jak i w witrynach innych firm, często zastępuję niepotrzebnie rozdęte wtyczki opcjami, blokami i dekoracjami, które nigdy nie są używane lub nie są potrzebne, kodem, aby zmniejszyć obciążenie.

Ten formularz kontaktowy jest kompletnym i konfigurowalnym rozwiązaniem dla WordPress, zaprojektowanym tak, aby był bezpieczny, łatwy w użyciu i szanował prywatność użytkowników. Ponadto możesz dodawać lub usuwać opcje według własnego uznania. To jest formularz, którego używam tutaj.

Oto jego główne funkcje i cechy oraz instrukcje dodawania go do dowolnej strony lub postu na blogu za pomocą krótkiego kodu.

Struktura i opcje

1) Pola formularza

  • Nazwa: Obowiązkowe pole, w którym użytkownik może wprowadzić swoją nazwę.
  • Adres e-mail: Wymagane pole do wprowadzenia adresu e-mail użytkownika.
  • Wiadomość: Obowiązkowe pole, w którym użytkownik może wpisać swoją wiadomość. Musi mieć co najmniej 15 znaków.
  • Suma captcha: Prosta captcha, która prosi użytkownika o rozwiązanie sumy dwóch losowych liczb od 1 do 9.
  • Akceptacja polityki prywatności: Obowiązkowe pole wyboru umożliwiające zaakceptowanie polityki prywatności przed wysłaniem formularza.

Walidacje i bezpieczeństwo

  • Walidacja pól obowiązkowych: Wszystkie pola są obowiązkowe. Brak któregokolwiek z nich spowoduje wyświetlenie komunikatu o błędzie.
  • Weryfikacja linków: Żadne linki (adresy URL) nie są dozwolone w polach nazwy lub wiadomości.
  • Addition Captcha: Zapobiega automatycznemu spamowi, wymagając od użytkownika rozwiązania prostego działania matematycznego.
  • Google reCAPTCHA (opcjonalnie): Jeśli klucze Google reCAPTCHA są skonfigurowane, dodawany jest drugi poziom zabezpieczeń, aby zapobiec botom. Jeśli klucze reCAPTCHA nie zostaną dodane do kodu, kod nie zostanie dodany do formularza.
  • Zatwierdzanie zabronionych słów: Opcjonalnie można zablokować określone słowa w wiadomości, np. ananas, pizza, bitcoin (oddzielone przecinkami i bez spacji).
  • Bezpieczeństwo Nonce: Chroni przed atakami CSRF (Cross-Site Request Forgery).

3. Prywatność

  • Brak przechowywania danych: Żadne dane użytkownika nie są przechowywane (żadne e-maile, adresy IP, odsyłające adresy URL, nic). Takie podejście jest zgodne z przepisami dotyczącymi prywatności, takimi jak RODO, ponieważ żadne dane osobowe nie są gromadzone ani przechowywane.
  • Polityka prywatności: Zawiera link do polityki prywatności, którą użytkownik musi przeczytać i zaakceptować przed wysłaniem formularza.

4. Komunikaty zwrotne

  • Komunikaty o błędach: wyświetlane w bloku u góry formularza, jeśli wystąpią błędy w walidacji.
  • Komunikat o powodzeniu: Po pomyślnym przesłaniu formularza komunikat o powodzeniu jest wyświetlany w kolorze zielonym, w rozmiarze 14px i pogrubioną czcionką:"Dziękujemy! Twoja wiadomość została wysłana". Możesz zmienić ten tekst i jego formatowanie w kodzie. Reszta stylów, takich jak żółte tło, obramowanie i cień pola zawierającego formularz, który można zobaczyć tutaj, a także inne elementy zewnętrzne nie są zawarte w kodzie, ponieważ są dodawane za pomocą kontenera GenerateBlocks.

5. Personalizacja

  • Tekst Captcha: Możliwość dostosowania (domyślnie: "Czy jesteś człowiekiem? Rozwiąż tę sumę:").
  • Zakazane słowa: Można dodać oddzieloną przecinkami listę zakazanych słów.
  • Google reCAPTCHA: Opcjonalne, dodawane tylko po skonfigurowaniu i dodaniu do kodu witryny i tajnych kluczy captcha.

6. Wydajność

Kod sprawdza, czy shortcode jest obecny, a jeśli shortcode nie jest obecny, nic nie wyświetli, więc będzie działał tylko na stronie lub w poście, w którym shortcode został dodany.

Wydajność tam, gdzie jest pokazana, jest optymalna.

Wydajność strony z formularzem kontaktowym

Instrukcje instalacji i konfiguracji

1. skopiuj i dodaj kod

  1. Otwórz plik functions.php swojego motywu WordPress (lub utwórz niestandardową wtyczkę, jeśli wolisz nie modyfikować motywu lub używać fragmentów kodu).
  2. Skopiuj i wklej pełny kod formularza do pliku functions.php.

2. Skonfiguruj Google reCAPTCHA (opcjonalnie)

  1. Przejdź do Google reCAPTCHA.
  2. Wybierz reCAPTCHA v2 i zaznacz pole wyboru "Nie jestem robotem".
  3. Zarejestruj swoją stronę i uzyskaj klucze
    :Polylang placeholder do not modify
  4. W kodzie formularza zastąp " YOUR_SITE_KEY " i "YOUR_SECRET_KEY " kluczami, które uzyskałeś
    .Polylang placeholder nie modyfikuj

3. Ustaw zakazane słowa (opcjonalnie)

1 - W kodzie formularza znajdź linię:

$palabras_prohibidas = ' ';

2 - Dodaj słowa, które chcesz zablokować, oddzielając je przecinkami. Na przykład:

$palabras_prohibidas = 'caca,culo,pedo,pis';

Jeśli nie chcesz blokować żadnych słów, pozostaw zmienną pustą.

4. Dostosuj tekst captcha sumy (opcjonalnie)

W kodzie formularza poszukaj tej linii:

<label for="captcha">¿Eres humano? Resuelve esta suma: <strong><?php echo $num1; ?> + <?php echo $num2; ?> = </strong></label>

Zmień tekst "Jesteś człowiekiem? Rozwiąż tę sumę:" na ten, który chcesz wyświetlić.

5. Dodaj adres URL swojej polityki prywatności

Zastąp przykładowy adres url adresem URL polityki prywatności swojej witryny w tym wierszu:

$politica_privacidad_url = 'https://tuweb.com/declaracion-de-privacidad/';

6. Shortcode

Dodaj krótki kod do strony lub postu, w którym ma być wyświetlany formularz.

[formulario_contacto]

Na koniec będziesz musiał tylko przetestować go, aby sprawdzić, czy e-maile są wysyłane i docierają oraz obserwować ich użycie, aby zapobiec niestrudzonym spamerom przed wkradaniem się ich gówna poprzez komplikowanie matematycznej captcha i / lub aktywowanie obu captcha w tym samym czasie. Kod zawsze można ulepszyć, debugować i optymalizować. Można go również przetłumaczyć, jeśli zajdzie potrzeba użycia go w innym języku.

Jeśli wprowadzę zmiany lub ulepszenia w kodzie w zależności od wyników, dodam tutaj notatki.

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');

Powiązane artykuły