Elementor Forms Widget uitbreiden met Akismet ondersteuning

Spam via mijn contactformulier voorkomen:

Elementor Forms Widget uitbreiden met Akismet ondersteuning.In mijn eerder verschenen blog “Ik ontvang spam via mijn website terwijl het contactformulier verwijderd is” kon je lezen dat ik slachtoffer was geworden van een grootte spam aanval. Dit gebeurde via het contactformulier dat ik niet van spam bescherming voorzien had.

Om toekomstige spam zoveel mogelijk te voorkomen wilde ik Akismet bescherming toevoegen aan mijn contactformulier gemaakt met een Elementor Forms Widget. Ik heb al een betaalde abonnement voor Akismet die ik gebruik om reacties onder mijn blogs te filteren.

Akismet is een externe dienst die kan bepalen of en ingevuld formulier spam is of niet.

Advertentie:

Akismet ondersteuning niet voor Elementor Pro Essential:

Elementor Pro heeft ondersteuning voor Akismet zodat je deze gemakkelijk toe kan voegen aan een Elementor Forms Widget. Alleen werkt dit niet voor mijn oude Elementor Pro Essential abonnement. Als ik toch Akismet ondersteuning wil moet ik upgraden en dus meer betalen.

Eigen implementatie gemaakt:

Ik ben PHP developer en heb dus mijn eigen PHP oplossing gemaakt. De code heb ik toegevoegd aan het functions.php bestand van mijn child theme.

Mijn oplossing is gebaseerd op de volgende documentatie van Akismet:

Je hebt een Akismet abonnement nodig:

Om onderstaand script te kunnen gebruiken heb je wel een Akismet abonnement nodig. Met dit abonnement kan je een API key registreren.

Heb je geen commerciële website? Dan kan je gebruik maken van de gratis dienst.

Toelichting:

Mijn oplossing hookt in op ‘elementor_pro/forms/validation’ action van Elementor. Zodra mijn contactformulier wordt verstuurd wordt mijn script uitgevoerd. Is het spam dan wordt er een foutmelding getoond. Zo niet dan wordt het formulier verstuurd.

Je kan dit script niet 1op1 gebruiken, je moet onderstaande dingen aanpassen:

  1. Voeg bij AKISMET_API_KEY jouw eigen key toe
  2. Pas de naam van het formulier aan in custom_check_contactform()
    1. Dit heb je bovenin ingesteld in Elementor Forms Widget
  3. Pas $data[‘naam’], $data[‘emailadres’], $data[‘bericht’] en $data[‘onderwerp’] aan
    1. De juiste ids vind je in Elemetor op het tabblad Geavanceerd bij ieder veld
  4. Pas Jouwdomein.nl aan naar jouw eigen domeinnaam
  5. Upload jouw wijzigingen
  6. Test het formulier

Code:

const AKISMET_API_KEY = 'JOUW SLEUTEL';

function custom_check_contactform( $record, $handler ) {
    if ('contact' !== strtolower($record->get_form_settings('form_name'))) {
        return false;
    }

    $data = array_map(function ($field) {
        return sanitize_text_field($field['value']);
    }, $record->get('fields'));

    // Check if we have a valid connection to Akismet servers.
    if (custom_akismet_verify_key(AKISMET_API_KEY, get_site_url())) {
        $dataToValidate = array(
            'blog'                  => get_site_url(),
            'user_ip'               => sanitize_text_field($_SERVER['REMOTE_ADDR']) ?? '',
            'user_agent'            => sanitize_text_field($_SERVER['HTTP_USER_AGENT']) ?? '',
            'referrer'              => wp_get_referer(),
            'permalink'             => get_permalink(),
            'commentType'           => 'contact-form',
            'commentAuthor'         => $data['naam'],
            'commentAuthorEmail'    => $data['emailadres'],
            //'commentAuthorUrl'      => 'http://www.example.com',
            'commentContent'        => $data['onderwerp'] . ' - ' . $data['bericht'],
        );

        if (true === custom_is_formdata_spam(AKISMET_API_KEY, $dataToValidate)) {
	    // Needed to prevent that Elementor will sent the form even when it is SPAM.
            $handler->add_error('field_id', '<div class="dummy-error" style="display:none">error message</div>');
            $handler->is_success = false;
            return false;
        } else {
            return true;
        }
    }

    return true;
}
add_action('elementor_pro/forms/validation', 'custom_check_contactform', 10, 2);

// Authenticates your Akismet API key
function custom_akismet_verify_key(string $key, string $blog) : bool
{
    global $wp_version;

    $request            = 'api_key=' . $key . '&blog=' . urlencode($blog);
    $host = $httpHost   = 'rest.akismet.com';
    $path               = '/1.1/verify-key';
    $port               = 443;
    $akismetUA          = "WordPress/{$wp_version} | Jouwdomein.nl/" . wp_get_theme()->get('Version');
    $contentLength      = strlen($request);

    $httpRequest        = "POST $path HTTP/1.0\r\n";
    $httpRequest       .= "Host: $host\r\n";
    $httpRequest       .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $httpRequest       .= "Content-Length: {$contentLength}\r\n";
    $httpRequest       .= "User-Agent: {$akismetUA}\r\n";
    $httpRequest       .= "\r\n";
    $httpRequest       .= $request;

    $response = '';

    if(($fs = @fsockopen('ssl://' . $httpHost, $port, $errno, $errstr, 10))) {
        fwrite( $fs, $httpRequest );
        while( !feof( $fs ) ) {
            $response .= fgets( $fs, 1160 ); // One TCP-IP packet
        }

        fclose( $fs );

        $response = explode( "\r\n\r\n", $response, 2 );
    }

    if ('valid' == $response[1]) {
        return true;
    } else {
        return false;
    }
}

// Passes back true (it's spam) or false (it's ham).
function custom_is_formdata_spam(string $api_key, array $data) : bool
{
    global $wp_version;

    $request = 'api_key=' . urlencode($api_key)
             . '&blog=' . urlencode($data['blog'])
             . '&user_ip=' . urlencode($data['user_ip'])
             . '&user_agent=' . urlencode($data['user_agent'])
             . '&referrer=' . urlencode($data['referrer'])
             . '&permalink=' . urlencode($data['permalink'])
             . '&comment_type=' . urlencode($data['commentType'])
             . '&comment_author=' . urlencode($data['commentAuthor'])
             . '&comment_author_email=' . urlencode($data['commentAuthorEmail'])
             // '&comment_author_url=' . urlencode($data['comment_author_url'])
             . '&comment_content=' . urlencode($data['commentContent']);

    $host = $httpHost   = 'rest.akismet.com';
    $path               = '/1.1/comment-check';
    $port               = 443;
    $akismetUA          = "WordPress/{$wp_version} | Jouwdomein.nl/" . wp_get_theme()->get('Version');
    $contentLength      = strlen( $request );

    $httpRequest        = "POST $path HTTP/1.0\r\n";
    $httpRequest       .= "Host: $host\r\n";
    $httpRequest       .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $httpRequest       .= "Content-Length: {$contentLength}\r\n";
    $httpRequest       .= "User-Agent: {$akismetUA}\r\n";
    $httpRequest       .= "\r\n";
    $httpRequest       .= $request;

    $response = '';
    if(($fs = @fsockopen('ssl://' . $httpHost, $port, $errno, $errstr, 10))) {
        fwrite( $fs, $httpRequest );
        while (!feof( $fs)) {
            $response .= fgets( $fs, 1160 ); // One TCP-IP packet
        }
        fclose($fs);

        $response = explode( "\r\n\r\n", $response, 2 );
    }

    if ('true' == $response[1] ) {
        return true;
    } else {
        return false;
    }
}
Advertentie:

Laat een reactie achter

Je e-mailadres zal niet worden gepubliceerd. vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie gegevens worden verwerkt.