WordPress Gastenboek en spam

Een gastenboek is leuk, maar als je veel spam krijgt is het snel vervelend. Met WordPress instellingen kun je aangeven dat berichten niet zonder meer online verschijnen, maar eerst moeten worden goedgekeurd.

Dit helpt niet echt, online ziet je gastenboek er dan nog wel netjes uit, maar jij krijgt wel veel e-mail over al die berichten die je niet gaat plaatsen.

De oplossing ligt in het uitvoeren van een extra controle. De volgende wijziging maakt van het systeem geen Fort Knox maar voorkomt dat men een url gebruikt in het bericht.

Open het bestand functions.php en voeg de volgende regels toe:

<?php
function preprocess_comment_no_url( $commentdata ) {
    // Do not accept http in comment, remove comment-content
    if ( strpos($commentdata['comment_content'], "http") > 0 ) {
        $commentdata['comment_content'] = '';
        wp_die( __('Mislukt: I.v.m. spam is het niet toegestaan website vermeldingen in uw bericht te gebruiken.') );
    } else {
        return $commentdata;
    }
}
add_filter( 'preprocess_comment' , 'preprocess_comment_no_url' );
?>

Er wordt gecontroleerd op het voorkomen van “http” in het bericht. Je kunt dit uitbreiden met een controle op bv .nl of .com of www door het if-statement aan te passen. Een uitbreiding om ook te controleren op ‘www’ ziet er zo uit:

if ( strpos($commentdata['comment_content'], "http") > 0  || strpos($commentdata['comment_content'], "www") > 0 ) {

Wanneer je op veel termen wilt controleren is het handiger te werken met een array.
Plaast de termen in een array en gebruik een foreach()-loop om testen.

Een simpel voorbeeld:

// block spam comments
function my_preprocess_comment_handler( $commentdata ) {
    $error = false;
    $blocked = array( 'http');
    $url = $commentdata['comment_author_url'];
    if ( strpos( $url, '?') !== false || strlen($url) > 20 ) {
        $error = true;
        $commentdata['comment_author_url'] = '';
    }
    if ( ! $error ) {
        foreach ( $blocked as $key=>$value ) {
            if (strpos(strtolower($commentdata['comment_content']), $value) !== false) { 
                $commentdata['comment_content'] ='';
                $error = true;
                break;
            }
        }
    }
    if ( $error ) wp_die('<strong>ERROR</strong>: If you are not spamming, hit the BACK-button and try again.');
    return $commentdata;
}
add_filter( 'preprocess_comment' , 'my_preprocess_comment_handler' );

Het voordeel is nu dat wanneer je een term wilt toevoegen, je alleen de array hoeft aan te passen.