Kontaktinė forma WordPress be įskiepio

No comments

 
Kontaktinė forma WordPress be įskiepio

Nesuprantu vieno dalyko - "WordPress" pagal nutylėjimą dar neturi paprastos, bet išsamios kontaktų formos.

Kadangi reguliariai atlieku "WordPress" optimizavimo darbus tiek čia, tiek trečiųjų šalių svetainėse, dažnai pakeičiu nereikalingus išpūstus įskiepius su parinktimis, blokais ir dekoracijomis, kurie niekada nenaudojami arba nereikalingi, kodu, kad sumažintų apkrovą.

Ši kontaktų forma yra išbaigtas ir pritaikomas "WordPress" sprendimas, sukurtas taip, kad būtų saugus, paprastas naudoti ir gerbtų naudotojų privatumą. Be to, galite pridėti arba pašalinti parinktis, kaip norite. Šią formą naudoju čia.

Tai yra jo pagrindinės funkcijos ir savybės bei instrukcijos, kaip pridėti jį į bet kurį tinklaraščio puslapį ar įrašą su trumpuoju kodu.

Struktūra ir parinktys

1. Formos laukai

  • Vardas: privalomas laukas, kuriame naudotojas turi įvesti savo vardą ir pavardę.
  • El. pašto adresas: El. pašto adresas: privalomas laukas, kuriame naudotojas turi įvesti savo el. pašto adresą.
  • Pranešimas: privalomas laukas, kuriame naudotojas gali įrašyti savo pranešimą. Jis turi būti ne trumpesnis kaip 15 simbolių.
  • Suminė captcha: paprasta captcha, kurioje naudotojo prašoma išspręsti dviejų atsitiktinių skaičių nuo 1 iki 9 sumą.
  • Privatumo politikos patvirtinimas: privalomas žymimasis langelis, kuriuo prieš pateikiant formą patvirtinama privatumo politika.

Patvirtinimai ir saugumas

  • Privalomų laukų patvirtinimas: visi laukai yra privalomi. Jei kurio nors trūksta, rodomas klaidos pranešimas.
  • Nuorodos patvirtinimas: Pavadinimo ir pranešimo laukuose neleidžiama pateikti nuorodų (URL).
  • Papildymas Captcha: apsaugo nuo automatinio nepageidaujamų laiškų siuntimo reikalaujant, kad naudotojas išspręstų paprastą matematinį veiksmą.
  • "Google reCAPTCHA" (neprivaloma): jei sukonfigūruoti "Google reCAPTCHA" raktai, pridedamas antras saugumo lygis, kad būtų išvengta botų. Jei reCAPTCHA raktai nepridėti prie kodo, kodas nebus pridėtas prie formos.
  • Draudžiamų žodžių patvirtinimas: pasirinktinai pranešime galima blokuoti tam tikrus žodžius, pvz.: ananasas, pica, bitkoinas (atskirti kableliu ir be tarpų).
  • Nonce saugumas: apsaugo nuo CSRF (Cross-Site Request Forgery) atakų.

3. Privatumas

  • Jokių duomenų saugojimo: jokie naudotojo duomenys nėra saugomi (nei el. laiškai, nei IP adresai, nei nukreipiamieji URL adresai, nieko). Šis metodas atitinka privatumo taisykles, pavyzdžiui, BDAR, nes jokia asmeninė informacija nerenkama ir nesaugoma.
  • Privatumo politika: pateikiama nuoroda į privatumo politiką, kurią naudotojas turi perskaityti ir priimti prieš pateikdamas formą.

4. Grįžtamojo ryšio pranešimai

  • Klaidų pranešimai: rodomi formos viršuje esančiame bloke, jei atliekant patvirtinimą yra klaidų.
  • Sėkmės pranešimas: Sėkmingai pateikus formą, žalias, 14px dydžio ir paryškintas rodomas sėkmės pranešimas:"Ačiū! Jūsų pranešimas išsiųstas". Šį tekstą ir jo formatavimą galite pakeisti kode. Kiti stiliai, pavyzdžiui, geltonas fonas, dėžutės, kurioje yra forma, apvadas ir šešėlis, kuriuos matote čia, taip pat kiti išoriniai elementai, į kodą neįtraukti, nes jie pridedami su GenerateBlocks konteineriu.

5. Personalizavimas

  • Captcha tekstas: pritaikomas (pagal numatytuosius nustatymus: "Are you human? Solve this sum:").
  • Draudžiami žodžiai: galima pridėti kableliais atskirtą draudžiamų žodžių sąrašą.
  • "Google" reCAPTCHA: Neprivaloma, pridedama tik tada, jei sukonfigūruojate ir į kodą įtraukiate svetainės ir slaptus captcha raktus.

6. Veiklos rezultatai

Kodas tikrina, ar yra trumpasis kodas, o jei jo nėra, jis nieko nerodys, todėl bus paleistas tik tame puslapyje arba įraše, kuriame buvo pridėtas trumpasis kodas.

Veikimas ten, kur jis parodytas, yra optimalus.

Puslapio veikimas su kontaktų forma

Diegimo ir konfigūravimo instrukcijos

1. Nukopijuokite ir pridėkite kodą

  1. Atidarykite "WordPress" temos functions.php failą (arba sukurkite pasirinktinį įskiepį, jei nenorite keisti temos ar naudoti " Code Snippets").
  2. Nukopijuokite ir įklijuokite visą formos kodą į functions.php failą.

2. Nustatykite "Google reCAPTCHA" (pasirinktinai)

  1. Eikite į "Google" reCAPTCHA.
  2. Pasirinkite reCAPTCHA v2 ir pažymėkite žymimąjį langelį "Aš nesu robotas".
  3. Užregistruokite savo svetainę ir gaukite raktus
    :Polylang placeholder do not modify
  4. Formos kode pakeiskite "YOUR_SITE_KEY" ir "YOUR_SECRET_KEY" gautais raktais
    .Daugiakalbės vietos žymos nekeiskite
    .

3. Nustatyti draudžiamus žodžius (pasirinktinai)

1 - Formos kode raskite eilutę:

$palabras_prohibidas = ' ';

2 - Įrašykite žodžius, kuriuos norite blokuoti, atskirtus kableliais. Pavyzdžiui:

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

Jei nenorite blokuoti jokių žodžių, palikite šį kintamąjį tuščią.

4. Pritaikykite sumos captcha tekstą (pasirinktinai)

Formos kode ieškokite šios eilutės:

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

Pakeiskite tekstą "Ar esate žmogus? Išspręskite šią sumą:" į tą, kurį norite rodyti.

5. Įrašykite savo privatumo politikos URL adresą

Šioje eilutėje pakeiskite pavyzdžio url savo svetainės privatumo politikos URL:

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

6. Trumpasis kodas

Pridėkite trumpąjį kodą į puslapį arba įrašą, kuriame norite, kad būtų rodoma forma.

[formulario_contacto]

Galiausiai jums tereikės jį išbandyti, kad patikrintumėte, ar laiškai siunčiami ir atkeliauja, ir stebėti, kaip jie naudojami, kad nenuilstantys šiukšlintojai neįsilaužtų savo šūdo, apsunkindami matematinę captcha ir (arba) vienu metu įjungdami abi captcha. Kodą visada galima tobulinti, jį galima derinti ir optimizuoti. Taip pat galite jį išversti, jei reikia naudoti kita kalba.

Jei, atsižvelgdamas į rezultatus, pakeisiu ar patobulinsiu kodą, čia pridėsiu pastabas.

Kodas

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

Suscripción por email

Susiję straipsniai

Parašykite komentarą

Este blog se aloja en LucusHost

LucusHost, el mejor hosting