Artikel vom 23. Februar 2010
PHP-Script: Alte WordPress-Trackbacks auf Gültigkeit prüfen
Mit Pingbacks und Trackbacks stehen Autoren zwei äußerst praktische Mechanismen zur Verfügung, welche die Kommunikation zwischen den Blogs übernehmen und für automatische Benachrichtigungen über eingehende Links sorgen. Thematische Verweise zum Artikel, auch Backlinks genannt, steigern die Popularität einer Seite und sind nur von Vorteil (zumindest auf den ersten Blick) – je mehr von der Sorte, desto besser.
Schneller weg als man denkt
In der Regel werden eingetroffene Trackbacks mit einem Link zur Quelle versehen und als Kommentar – bestenfalls separiert – dargestellt. Soweit nichts Neues an der Materie.
Die aus der Praxis gewonnene Erkenntnis zeigt, dass Artikel mit gesetzten Pingbacks nicht selten über eine sehr kurze Lebensdauer verfügen und im Laufe der Zeit oft und gern offline gehen. Mögliche Gründe dafür: Blog eingestellt, Domain gewechselt, Artikelseiten entfernt etc. Die Folge: Man linkt im Kommentarbereich auf eine Blogseite, die es aktuell gar nicht mehr gibt. Nicht wirklich schön und ruft jeden passionierten Blogger zu Taten auf.

Referenzseiten landen im Nirvana
Miese Techniken: Redirects auf Schrott
Unangenehm dreist wird es, wenn scheinbar freundlich und gut gemeinte Referenzseiten mit funktionierenden Pingbacks plötzlich (meist nach einem Zeitfenster von 3 – 4 Monaten) auf Projekte mit pornographischen Inhalten umgeleitet werden, so dass man als normalsterblicher Blogger unbewusst auf nackte Tatsachen verweist, ohne davon jegliche Kenntnis zu nehmen. Auch Google sieht es nicht gern, wenn eine solide Blogseite mit unseriösen Angeboten verknüpft ist – Zack, Ranking runter. Da muss sich also etwas ändern!
Kontrolle der existenten Blogverknüpfungen
Nachfolgend stellt sich ein ausführbares PHP-Skript als eine der tauglichen Lösungen vor: Der Code untersucht die in der Datenbank aufbewahrten Trackbacks auf ihre momentane Erreichbarkeit und fahndet im eingelesenen Artikeltext nach dem Link zum Blog. Auf diese Weise können nicht nur “Leichen”, sondern auch “Betrüger” (= haben den Link zum Blog entfernt oder die Seite umgeleitet) im Nu ausfindig gemacht und aus dem Blog manuell entfernt werden.
Beobachtungen bestätigen: Bei circa 500 Pingbacks innerhalb eines Blogs sind alle 6 Monate grob überschlagen 5 – 7 % davon nicht mehr brauchbar, weil nicht existent.
Funktionsweise im Schnelldurchlauf
Um an die Auswahl der Pings (= Trackbacks und Pingbacks) heranzukommen, generiert ein SQL-Kommando die Liste mit URLs der Quellen, die wiederum vom Script nach und nach zwecks Check angesteuert werden. Verdächtige Adressen werden eingeblendet, entsprechende Trackbacks können z.B. im Backend in der Kommentaransicht mithilfe der internen (Kommentar-)Suche lokalisiert und bei Bedarf eliminiert werden.
1. Schritt: DB-Export als CSV
Zunächst gehören die Ursprungsadressen der Pings in Form von alleinigen URLs als lesbare Liste exportiert – sie wird später vom Skript eingelesen. Ein SQL-Befehl gibt den gewünschten Datensatz aus, dieser gehört händisch exportiert. Für das geplante Vorhaben kann ein beliebiger SQL-Client wie das Online-Tool phpMyAdmin oder die Desktop-Anwendung Sequel Pro angewendet werden. Einen Export als CSV ohne gesonderte Anpassungen schafft nahezu jede SQL-Applikation.
SQL-Statement zur Ausgabe der Ping-URLs:
SELECT DISTINCT comment_author_url
FROM wp_comments
WHERE comment_type
IN('trackback','pingback')
Für alle Kommentartypen (Kommentare plus Pings):
SELECT DISTINCT comment_author_url FROM wp_comments
Hinweis zur Abfrage
Weicht der Tabellenname mit Kommentaren vom WordPress-Standard (wp_comments) ab, so ist dieser im Befehl zu korrigieren.

Export der ausgelesenen Daten im CSV-Format
2. Schritt: PHP-Code anpassen und speichern
Der nachstehende PHP-Code soll kopiert, im Editor eingefügt, in den beiden Zeilen nach dem ersten Kommentar (/* Zuweisung der Werte */) vervollständigt und abschließend als PHP-Datei, also mit der Endung .php, gespeichert werden.
Erläuterung der abzustimmenden Variablen:
- $import_file – Dateiname der erzeugten CSV-Datei
- $blog_url – Blog-Domain, nach der im Artikeltext gesucht wird
PHP-Quelltext der Minianwendung:
/* Zuweisung der Werte */
$import_file = 'customresult.csv';
$blog_url = 'playground.ebiene.de';
/* Import starten */
echo "Import läuft...\n";
$lines = file($import_file);
/* Keine Daten? */
if (empty($lines)) {
die('No data');
}
/* URLs loopen */
foreach ($lines as $line) {
/* Zeile scannen */
preg_match('!"http://(.*)"!', $line, $matches);
/* Keine gültige URL */
if (empty($matches[1])) {
continue;
}
/* Gültige URL */
$url = 'http://' .$matches[1];
/* URL abrufen */
if (!$output = @file_get_contents($url)) {
echo 'Unereichbar: '. $url. "\n";
}
/* Blog-URL suchen */
if (!preg_match('/' .preg_quote($blog_url). '/i', $output)) {
'Kein Link in: ' .$url. "\n";
}
}
die('Fertig!');
3. Schritt: Ausführen
Vorab: Die angelegte PHP-Datei und der exportierte Datensatz im CSV-Format befinden sich am gleichen Ort, also physikalisch im identischen Ordner. PHP-File ist ausführbar, CSV lesbar.
Vor dem Start wird der Ordner auf eine unter PHP-laufende Umgebung transferiert: Das kann ein entfernter oder ein lokal eingerichteter Server sein. Eine Initialisierung via Bash bietet sich an. Ein heimischer Server hat den wesentlichen Vorteil, dass dort Ausführungszeiten des Codes bei Bedarf angepasst werden können – denn je nach Anzahl der zu prüfenden Links kann der zeitintensive Check schon eine Weile dauern. Da heißt es: Kaffee holen.
Kommt es bei der Analyse der Adressen also zum Stop oder Fehlerhinweis, so muss entweder die Execution Time nach oben oder die Menge der Einträge innerhalb der CSV-Liste nach unten korrigiert werden.
Das erreichte Resultat: Suspekte Trackback-Quellen kommen als Übersicht zum Vorschein und können – doppelt hält besser – nach manueller Kontrolle aus dem Blog entfernt werden. The job is done.
Fazit
Je nach Projektgröße kann die Prüfroutine alle 6 Monate wiederholt werden – für mehr “Sauberkeit” in WordPress.
[Der Autor] Sergej Müller ist enthusiastischer Software Engineer mit Schwerpunkten Webentwicklung und WordPress. Seit 2007 programmiert und vertreibt er wpSEO, das weltberühmte und patentierte SEO-Plugin für WordPress-Blogs.
Sicherheit in WordPress: WP-Version aus dem Feed und Quelltext entfernen
26 Kommentare zum Artikel
Wow. Coole Idee. Danke Sergej!
Müßte man doch auch vom lokalen XAMPP laufen lassen können, oder?
Ich habe mir angewöhnt der Reihe nach täglich ein paar meiner alten Posts zu lesen. Zum einen findet man da längst vergessene Perlen wieder, zum anderen findet man aber auch eigene Links, Kommentar-Links usw. die inzwischen zu 404s oder Schlimmerem mutiert sind.
Heute habe ich mich zum Beispiel sehr über den hier amüsiert ;-)
Ahhh, deshalb sind wohl einige meiner Trackbacks hier bei Dir hier verschwunden !?
Dabei existieren meine Artikel und die Links auf Deine Seiten natürlich immer noch. Ich erlaube allerdings keine Zugriffe auf meine Seite, in denen kein Useragent übergeben wird. Nach meiner Erfahrung sind das immer igendwelche Spambots. Seriöse Browser und Bots geben sich mit dem Useragenten normalerweise zu erkennen :-)
@Micha
Ja, sollte klappen.
@Heiner
Ist mit Sicherheit auch eine Alternative, jedoch ein wenig zeitintensiv ;)
@Schnurpsel
Vor dem Löschen der Pings aus dem Blog rufe ich die vom Script ausgespuckten Adressen manuell im Browser auf – wie im Artikel auch gesagt: Doppelt hält besser. Speichere deine Artikel erneut, dann kommt der Ping wieder.
Achso, na dann hatte das Löschen wohl einen anderen Grund :-)
Ist aber auch egal, war mir nur so aufgefallen.
Vielleicht war nur ein Zufall, dass die Seiten gerade zu dem Zeitpunkt nicht erreichbar waren.
Vielen Dank. Das kann ich gut gebrauchen!
Gut möglich, die liegt bei Strato. Da muß man immer mal mit sowas rechnen. Obwohl es in letzter Zeit schon deutlich besser geworden ist.
Wenn du den Regex und den ersten in $url anpaßt, erwischst du auch HTTPS:
‘!”https?://(.*)”!’
Mit cURL ließe sich ein UA und ein (fremder) Referer setzen, um auch solche Bösewichte zu erfassen, die nur dir den Backlink zeigen.
Könnte man das Script als Unterpunkt im Kommentarmenu einhängen? Hier käme es ohne den Zwischenschritt eines Exports aus. Ich habe mir mal etwas Ähnliches für die normalen Kommentarlinks geschrieben; das müßte ich allerdings erst an die 2.9+ anpassen. Ich habe den Timestamp der letzten Kontrolle in einer separaten Spalte notiert; jetzt gibt es ja ein Interface für Kommentarmetadaten.
Oh, und: ‘s/fandet/fahndet’ :)
Thomas, auf HTTPS im Regexp habe ich bewusst verzichtet. Ich bin der Meinung, man soll nicht so ohne weiteres auf SSL-Seiten zugreifen. Vor allem nicht mit einem einfachen file_get_contents. Zudem gibt es kaum bis nie Blogseiten, die im Frontend unter HTTPS laufen.
Richtig, mit cURL lässt sich Vieles leichter erledigen, doch hat nicht jeder Server cURL aktiv (bei Tweets2Delicious die Erfahrung gemacht).
Natürlich hatte ich mit dem Gedanken gespielt, den Ansatz als Plugin zu bauen. Könnte man machen, keine Frage – jeden Tag paar Links prüfen (lassen), nicht alle auf einmal. Sollte gehen.
Ach ja, danke für die Korrektur.
Noch mal meine Gedanken zur Integration der oberen Lösung in WordPress und warum ich nicht viel davon halte:
1. Der tägliche/stündliche Cronjob kann aus Gründen der Performance und der eingeschränkten Ausführungszeiten nur wenige URLs prüfen. Bei sehr vielen Pings im Blog kann der Stand so nicht aktuell gehalten werden.
2. Vom Plugin verdächtige Treffer müssen optisch und bestenfalls via E-Mail kommuniziert werden. Eine Reaktion seitens Administrator ist zu der Zeit erforderlich: Manueller Gegencheck, händisches Löschen. Auf Dauer kann die Benachrichtigung nerven, wenn eine URL zwar zugänglich ist, aber wegen eines Timeouts oder anderen Gründen als nicht erreichbar gemeldet wird. Eine Whitelist muss also her. Komplexität des Plugins nimmt zu.
Im Großen und Ganzen bin ich für die oben vorgestellte, smarte Standalone-Lösung, die nur ein, zwei Mal im Jahr die ganze Aufmerksamkeit erfordert. Liste exportieren, prüfen lassen, eliminieren. Fertig.
Ich hab die Schleife um “echo’.’ am Anfang und “ob_flush(); flush(); ” am Ende erweitert. Hilft wunderbar gegen den Servererror, wenn es länger dauert.
Allerdings kriege ich auch teilweise “Unerreichbar”, obwohl ich die Seite normal aufrufen kann und der Link vorhanden ist. Aber das könnte ja auch so ein “Schnurpsel-Schutz” sein. ;)
Alles in allem gute Arbeit. Danke. Ich geh dann mal löschen. :)
@Tom
Manchmal braucht ein Server auch länger, um zu antworten. Ein manueller Kontrollaufruf der Verdächtigen ist daher sehr empfehlenswert.
@Sergej: logisch. ich mach genug mit PCs um zu wissen, dass man sich nicht auf sie verlassen kann. ;)
Besten dank, das php Skript werde ich direkt mal einbinden. Danke auch für den Tipp mir der manuellen Nachkontrolle!
War für mich irgendwie nicht ganz so einfach das einzubauen. Ein Plugin für WP wäre mir lieber gewesen =)
@Arthur
Natürlich, wir wollen alles Plug&Play haben. Lies mal oben, warum es dafür kein Plugin geben wird.
Dein Script klingt sehr interessant. Meine Blogs prüfe ich alle paar Monate mit Xenu und ich bin auch immer wieder überrascht was dabei so alles nettes zum Vorschein kommt. Ist trotz Xenu Dein Script noch anzuraten, was denkst Du?
Tanja, würde ich nicht machen. Xenu prüft entsprechend auch die Trackbacks, das wäre dann doppelt gemoppelt. Ist eher für die Nutzer, die über solche Tools wie Xenu unter Windows nicht verfügen.
Danke für Deine Antwort, dann bin ich ja beruhigt. Xenu läuft hervorragend, auch bei großen Blogs und manachmal wird einem echt Übel beim Ergebnis ;-)
Andere Frage, die Du mir vielleicht auch beantworten könntest. Ich habe in meiner Options Tabelle hunderte _transient_feed…, _transient_feed_mod…, _transient_timeout_feed… und _transient_timeout_feed_mod… Einträge . Kann ich die bedenkenlos löschen bis auf jeweils den letzten? Wenn ich es richtig verstanden habe ist das ein Feed Cache und da ich über die Blogroll ständig Feeds einlese, werden das ja auch ständig mehr…
An sich sind Transients so konzipiert, dass sie sich nach festgelegter Zeit selbst aus der DB austragen, aber erneuern. Die kann man bedenkenlos löschen. Backup nicht vergessen.
Supi -> Danke :-)
Habs gerade mal ausprobiert, funktioniert hervorragend. Jetzt weiß ich endlich auch woher die kommen. Ich lese über die Blogroll 40 Feeds ein. Pro Feed gibt es 4 transient Options Einträge und so erhalte ich 160 neue Options. Mit denen werde ich wohl oder übel leben müssen.
Wichtig ist jetzt aber auch, dass ich das beobachten kann, ob die Teile sich ständig neu schreiben oder eben auch löschen, wie Du sagst. Theoretisch müssten sie sich ja nach Cache Ablauf auch selbst löschen. Wir werden es sehen… Danke nochmal, endlich blicke ich da durch ;-)
Wow super! Vielen Dank für den genialen Tipp – habe noch 2, 3 alte Blogs rumliegen, die ich gleich mal bewaffnet mit dem neuen Wissen angehen werde :-)
Es ist eine gute Idee nur die paar Schritte sind einem vielleicht zu umständlich. Gibt es keine vernünftigen WordPress Plugins die die Trackbacks prüfen und falls diese auf nofollow gestellt wurden, dann werden die eigenen auch auf nofollow gesetzt und falls der Artikel nicht erreichbar ist oder der Link entfernt wurde, dann wird der eigene auch entfernt?
@Mathias
Siehe meinen Kommentar Punkt 1. Solche Plugins gibt’s bereits, ich würde sie aus dem genannten Grund “Performace” nicht einsetzen.
4 Verlinkungen auf den Artikel
› Mal kurz rundgeschaut… #14 – Braekling.de
› Weekly 08/10 | [Gregel Dot Com]
› Benötigen Blogs einen Linkaufbau? - Blog, Linkaufbau, Blogger, [...]
› Mac OS Tool: Links und Bilder einer Website prüfen mit Integrit [...]