WordPress: einfacher Honeypot für die Kommentarfunktion

Ich habe hier im Blog jahrelang auf das Plugin Antispam Bee zur Spamabwehr gesetzt. In den Einstellungen hatte ich die Funktion „Aus bestimmten Gründen sofort löschen“ aktiviert. Einziger ausgewählter Grund war „Honeypot“. Diese Einstellung hat hier 100% aller Spamkommentare abgefangen. Doch „Honeypot“ geht auch ohne das Plugin.

Ein „Honeypot“ ist schnell erklärt. Man nehme ein zusätzliches Kommentarfeld und verstecke es per CSS vor dem Leser. Der Leser, der das Feld nicht sieht, wird es nicht ausfüllen. Der Spambot dagegen schon. Denn der sieht die Seite anders. Fehlt nur noch eine einfache Abfrage die klärt ob das versteckte Feld ausgefüllt ist und den Kommentar dann als Spam behandelt.

Und jetzt kommt meine einfache und außergewöhnliche Interpretation dieses „Honeypots“. Anstatt jetzt hier ein zusätzliches Feld rein zu basteln nutze ich ein vorhandenes Feld. Das einzig nutzbare Feld ist „Website“. Die muss man nicht ausfüllen, sondern man kann sie ausfüllen. Meine Erfahrungen hier im Blog sagen dass nur ganz wenige diese Möglichkeit nutzen. Also habe ich es mit nachfolgendem CSS ausgeblendet.

.comment-form-url,
.comment-form-url label,
.comment-form-url input {
  opacity: 0;
  position: absolute;
  top: 0;
  left: 0;
  height: 0;
  width: 0;
  z-index: -1;
}

Fehlt noch die Abfrage ob das Feld ausgefüllt ist. Das erledigt diese einfache, sehr kleine Funktion. Die markiert alle Kommentare bei denen die Website angegeben ist als Spam.

function check_honeypot( $approved ) {
  return empty( $_POST['url'] ) ? $approved : 'spam';
}
add_filter('pre_comment_approved', 'check_honeypot', 9999, 1);

Update: Ich habe die Funktion nochmals geändert. Anstatt wie oben die Spams auch als „Spam“ zu markieren speichere ich diese jetzt gar nicht mehr. Es sind die Tage einfach zu viele geworden.

function check_honeypot ( $commentdata ) {
  if ( !empty($_POST['url'] ) ) {  
    wp_die( '<p><strong>Fehler:</strong> Beim Speichern ist ein Fehler aufgetreten.</p><p><a href="javascript:history.back()">&laquo; Zurück</a></p>' );
  } 
  
  return $commentdata;
}
add_filter( 'preprocess_comment', 'check_honeypot' );

Ich nutze hier ein Child-Theme. Deshalb ist das ganze schnell eingebaut. Der CSS-Code kommt in die Datei styles.css und die Funktion in die functions.php des Child-Themes. Als Grundlage des ganzen dient hier ein ganz einfaches Plugin, dessen Code man auf GitHub findet. Ich denke mal diese Funktion leistet hier im Blog ähnliches wie Antispam Bee.