Adventskalender Tag 21 – Mini-Plugin: Die dazulernende WordPress-Blacklist

MarketPress Adventskalender 21

Wer kennt das nicht? Gerade erst ist der neue Beitrag draußen und schon kommen die ersten Spam-Bots an und möchten dich ärgern. Heutzutage gibt es unzählige Plugins um Spam zu verhindern und die gute Arbeit leisten. Allerdings kommt es immer mal wieder vor, dass sich dennoch ein unerwünschter Kommentar durchschleicht.

Auch WordPress bietet schon seit der Version 1.2.0 intern mit der Funktion check_comments eine Überprüfung auf Spam. Diese Funktion überprüft anhand einer sogenannten “Blacklist” ob Teile von den Kommentarfeldern Name, E-Mail, URL, Kommentartext, IP und User-Agent mit dieser Liste übereinstimmen. Wenn dies der Fall ist, wird er Kommentar direkt als “Spam” markiert.

Doch wer pflegt heutzutage diese Liste noch von Hand? Wäre es dann nicht schön, wenn diese Liste automatisiert dazulernt? Hier kommt unser heutiges Mini-Plugin ins Spiel!

Aktivierung Mini-Plugin

Unser Mini-Plugin befüllt nach der Aktivierung erst einmal die Blacklist mit vorhanden Spam-Kommentaren. Dazu registrieren wir einen Callback in den Aktivierungs-Hook von Plugins:

Unsere Funktion holt sich nun alle Kommentare die als “Spam” markiert sind und ruft intern unsere “Füge zur Blacklist hinzu”-Funktion auf (mehr dazu unten).

[/crayon]

Achtung: Es kann durchaus sein, wenn Ihr viele Spam-Kommentare habt, dass die Aktivierung eine zu lange Laufzeit hat und ins Timeout läuft.

Blacklist up to date halten

Als nächstes wollen wir, dass unsere Blacklist dazu lernt. Hierfür bietet uns WordPress einen sehr nüztlich Hook: transition_comment_status. Dieser wird jedesmal aufgerufen, wenn sich ein Kommentar-Status ändern und übergibt uns den alten Status, neuen Status und Kommentar selbst. Da wir alle 3 Parameter intern benötigen, müssen wir das auch mit angeben:

[/crayon]

Unser Callback sieht dann wie folgt aus:

[/crayon]

Blacklist laden

Zuerst laden wir unsere Blacklist, welche in der Options-Tabelle gespeichert ist. Diese Liste beinhaltet in jeder Zeile ein Keyword, welches unerwünscht ist. Um damit vernünftig arbeiten zu können, benutzen wir die PHP-Funktion explode() um die Zeilenumbrüche (n) zu splitten und in ein Array zu konvertieren. Intern kopieren wir die Original-Blacklist um später überprüfen zu können, ob diese sich von der Neuen unterscheidet. Somit können wir verhindern, dass unnötige Queries an die Datenbank abgesetzt werden.

Blacklist erweitern

Um die Blacklist zu erweitern, überpüfen wir ob der neue gesetzte Status “Spam” und ob die IP-Adresse noch nicht in der Blacklist vorhanden ist. Wenn dies zutrifft, fügen wir die Adresse in die Liste hinzu. Zusätzlich habe ich einen Filter chrico_comment_blacklist_add eingefügt, welcher die Blacklist, den alte und neuen Status, sowie den Kommentar übergeben bekommt. Somit verfügt das Plugin über eine einfache Schnittstelle um die Blacklist um noch weitere Felder zu erweitern.

Blacklist bereinigen

Da es durchaus einmal vorkommen kann, dass mal ein Kommentar als Spam gekennzeichnet wird, aber gar keiner ist, müssen wir natürlich auch das ganz Spiel noch einmal umdrehen. Hier habe ich den Filter chrico_comment_blacklist_add hinzugefügt um das Plugin flexibel zu halten.

Die Überprüfung hierfür ist allerdings etwas aufwändiger:

  1. Zuerst schauen wir, ob der alte Status “spam” war.
  2. Wenn dies zutrifft schauen wir, ob der Kommentar nicht endgültig gelöscht oder in den Papierkorb verschoben wird.
  3. Zu guter Letzte prüfen wir, ob es dieses Adresse in der Blacklist existiert und nicht schon manuell gelöscht worden ist.

Blacklist speichern

Wenn eine der Überprüfungen (Erweitern/Bereinigen) ausgeführt worden ist, unterscheidet sich die Größe der Original-Blacklist zu neuen Blacklist führen auch anschließend das Update aus. Hierzu konvertieren wir unser Array wieder zurück in die ursprüngliche Liste und speichern diese ab.

Fazit

Mit diesen Mini-Plugin haben wir eine einfache Möglichkeit geschaffen, dass unsere Blacklist dazulernt und zukünftig noch effektiver Spam von unseren Kommentaren fern hält. Ich habe mich bewusst nur auf die IP-Adresse beschränkt, es wäre aber durchaus aus möglich, dass man z.B. noch den Host oder die E-Mail mit in die Blacklist mit aufnimmt.

Das Mini-Plugin findet Ihr auf Gihtub: Comment Blacklist.

Beitrag teilen

Author Avatar

Hi! Mein Name ist Chris und ich arbeite als leidenschaftlicher Webentwickler im X-Team der Inpsyde GmbH. Meine Spezialgebiete sind die Backend- und Frontendentwicklung. Wenn ich nicht gerade über Barrierefreiheit und Usability diskutiere, bin ich auf Google+ unterwegs. In meiner Freizeit absolviere ich ein Informatikfernstudium, treibe gern und viel Sport, verschlinge ein Buch nach dem Anderen und blogge auf www.chrico.info.

Auch interessant:

woonews19

WooCommerce Wochenrückblick #19: Google Analytics, kostenlose Themes und neue Kennzeichnungspflicht

von Michael Firnkes

Die Shop-Analyse ist wichtig, muss aber rechtlich abgesichert werden. Für WooCommerce gibt es neue Theme-Inspirationen und ein neues German Market. Dies u ...

Weiterlesen
slack-blog

Neues Plugin: Slack Connector - Verbinde WordPress, WooCommerce und Slack

von Michael Firnkes

Anfangs wollten wir lediglich unsere eigenen Slack-Prozesse optimieren. Mit automatisierten Benachrichtigungen aus dem MarketPress-Shop, dem Blog und unser ...

Weiterlesen
woo26

WooCommerce 2.6: Deutlich mehr Versandoptionen, bessere Bestellübersicht

von Michael Firnkes

WooCommerce 2.6 "Zipping Zebra" steht kurz vor der Veröffentlichung, das Release ist für kommenden Dienstag geplant. Wir zeigen dir, was sich für dich ...

Weiterlesen
wp-geburtstag

13 Jahre WordPress - 13 Mal ein WooCommerce- oder Blog-Theme gewinnen

von Michael Firnkes

WordPress wird 13. Und wiederholt seine Erfolgsgeschichte: Mit WooCommerce. Feiere mit und gewinne eines unserer Top-Themes. WordPress hat einen rasante ...

Weiterlesen

Kommentare

2 Kommentare

  1. #1

    Dankeschön für dieses Geschenk. Werde ich gleich in meine Installation mit aufnehmen 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">