WordPress - nofollow aus bestimmten Kommentaren entfernen

Schon seit einiger Zeit nervt mich, dass selbst eigene Kommentare dieses rel=”nofollow” in den Links ergänzt bekommen. An sich ist rel=”nofollow” eine sehr gute Lösung gegen Kommentarspam. Nicht, dass es diesen dadurch gar nicht mehr geben würde, aber zumindest wirken die Links (theoretisch) nicht mehr beim Ranking in den Suchmaschinen und das macht Blogs mit nofollow für viele Spammer uninteressant und man hat so weniger Arbeit mit dem Löschen des Mülls. Außerdem kann man so auch Links einbauen, die man im Normalfall sonst besser nicht setzen würde, z.B. weil sie zu Bad-Neighborhood führen würden, weil man die Seite einfach nicht mag, weil der verwendete Deeplink evtl. instabil (von Änderungen bedroht) ist oder schlicht, um Crosslinks zu vermeiden. Einer der Hauptgründe ist in meinen Augen jedoch auch, dass man somit Seiten anlinken kann, die einfach nicht empfehlenswert sind und nur als schlechtes Beispiel aufgeführt werden oder auch interne Seiten, die man nicht in den Suchmaschinen haben will (z.B. sich ständig ändernde Seitenstatistiken etc.). Eine Suchmaschine kann aber ohne dieses nofollow unmöglich erkennen, ob der Link nun positiv oder neutral (negative gibt es nicht) eingestuft werden sollte. Zwar ignorieren Yahoo, MSN und viele andere trotz anderer Pläne diesen Linkparameter, aber das ist Dank 90% Marktanteil von Google in Deutschland ja (fast) egal. Auf jeden Fall ist es sinnvoll, die WordPress-Standardeinstellung mit dem automatischen nofollow in den Kommentaren beizubehalten.

Stören tun da allerdings 2 Dinge, zum einen kann man nicht mal in eigenen Kommentaren echte Links setzen und zum anderen erhält jeder Link bei einer späteren Bearbeitung des Kommentars blöder Weise noch ein weiteres rel=”nofollow” dazu. Bearbeitet man einen Kommentar mit vielen Links mehrmals und achtet da nicht drauf, kann sich das schon recht ordentlich aufblähen. Genauso dämlich ist die Tatsache, dass selbst interne Links zur gleichen Domain (also z.B. zum Blog) nicht vom rel=”nofollow” ausgeschlossen sind und somit selbst Links auf Bilder, wie ich sie ja gerade erst in zwei Beiträgen drin hatte, von diesem Attribut nicht verschont werden. Dies wiederum sorgt dafür, dass die Bilder nicht in die Google-Bilder-Suche aufgenommen werden können. Auch konnte ich auf die Schnelle keine Lösungen für WordPress 2.x finden, die sich diesem Problem annehmen. Eine Anpassung ist schon mal nicht auf Themes-Ebene möglich, man muss da bedeutend tiefer im WordPress-Quelltext ansetzen. Die entscheidende Stelle findet sich in der Datei /wp-includes/functions-formatting.php in function wp_rel_nofollow ( $text ). Nach mehreren Stunden des Herumprobierens habe ich dann auch wieder einiges über die interne Funktionsweise von WordPress herausgefunden :mrgreen: Die ersten Versuche mit der Funktion the_author() scheiterten, weil die davon zurückgegeben Werte auf einem Array beruhen, was zu dem Zeitpunkt noch nicht gefüllt ist. Auch die Versuche direkt über das Array $post waren natürlich nicht von Erfolg gekrönt. Nach einiger Zeit fand ich dann heraus, dass die Funktion wp_rel_nofollow als Filter noch weit vor vielen anderen wichtigen Funktionen aufgerufen wird. Warum das so ist, muss man wohl nicht verstehen, aber eine Änderung der Reihenfolge wollte ich nicht versuchen - das wäre vermutlich doch etwas arg tricky geworden und bei Fehlern hätte man sich später dumm und dusselig gesucht. Auf dem Weg durch die WordPress-Sourcecodes immer schön der Spur der Daten folgend entdeckte ich schließlich irgendwann die Funktion wp_get_current_commenter(), die ein Array liefert, in dem unter anderem auch der Name des aktuellen Kommentators drin steht. An der Stelle, wo ich dies gefunden hatte, stand auch gleich die Lösung, wie man da ran kommt, ich habe das daher einfach nur kopiert und die function wp_rel_nofollow ( $text ) entsprechend angepaßt.

function wp_rel_nofollow ( $text ) {
 $commenter = wp_get_current_commenter();
 extract($commenter);
 if($comment_author!=='admin'){
  $text=preg_replace('|<a (.+?)>|i','<a $1 rel="nofollow">',$text);
 }else{
  $text = preg_replace('|<a (.+?)>|i', '<a $1>', $text);
 }
 return $text;
}

Das klappte dann in den ersten Tests auch wunderbar. Jedes Kommentar, welches ich freischaltete, wurde damit ohne rel=”nofollow” in die Datenbank geschrieben. Automatisch veröffentlichte Kommentare (bekannter Autor + bekannte eMail-Adresse) ohne vorherigen Login erhielten allerdings auch bei mir weiterhin das nofollow - wenn man das weiß, ist’s aber kein Problem. Auf die Art bin ich dann nach dem Testen alle bisherigen Beiträge des Blogs noch mal durchgegangen und habe interne Links (vor allem die zu den Bildern) in den Kommentaren wieder “verfolgbar” gemacht. Da gibt es allerdings noch etwas, was ich absolut nicht verstehe: jetzt klappt das nicht mehr. 8O Ich habe keine weitere Änderung an WordPress vorgenommen, es sind also einfach nur ein paar Stunden vergangen und jetzt bekomme auch ich wieder dieses dämliche nofollow in die von mir freigeschalteten Kommentare. Verdammt, was ist das? :roll: Nun ja, das könnte wieder einige Stunden basteln und nachbessern bedeuten - die habe ich leider gerade nicht :? Aber vielleicht liest das ja jemand, der sich auch schon mal mit dieser Problematik befaßt hat …

5 Reaktionen zu “WordPress - nofollow aus bestimmten Kommentaren entfernen”

  1. admin

    Noch ein Hinweis, falls das jemand zum Testen nachbauen möchte:
    Man kann statt direkt in den include-Files herumzuwurschteln auch das Plugin “no nofollow” im Pluginverzeichnis unter follow.php verwenden, welches die beiden zugehörigen Standard-Filter überschreibt. Man müßte dann halt nur den Ersatz-Filter für make_clickable($ret) durch den Standard aus der functions-formatting.php überschreiben oder schlicht komplett löschen und die andere Funktion so wie oben beschrieben anpassen. Um an die Inhalte der verwendeten Arrays zu kommen, muss man diese irgendwie übergeben. Eine Ausgabe per echo ist nicht mgl., weil zu dem Zeitpunkt der Filterabarbeitung WordPress noch mitten in der Header-Generierung steckt. Ich hatte dazu die gewünschten Dinge einfach an den Link angefügt, also z.B. mit $text.=$comment_author;. Merkwürdiger Weise ist diese Variable jetzt auch total leer, wärend sie vorhin noch mit meinem “admin” gefüllt war *kopfkratz*

  2. admin

    Heute geht es wieder - ich habe da so einen Verdacht. Wahrscheinlich funktioniert die von mir gemachte Anpassung zur Vermeidung des rel=”nofollow” in den WordPress-Kommentaren durchaus. Allerdings nur dann, wenn ich vorher mind. einen Beitrag editiert habe. Scheinbar ist dann die entsprechende Variable gesetzt, so dass ich eben wieder eines dieser nofollows entfernen konnte. Auch wenn das keine saubere Lösung ist, immerhin scheint es trotzdem mit diesem zusätzlichen Trick zu gehen.

  3. Ben ny

    http://kimmo.suominen.com/sw/dofollow/
    Das macht das ganze automatisiert …. ^^
    wie das jetzt mit Bildlinks in Kommentaren aussschaut weiss ich jedoch nciht … :)

  4. admin

    Nein, das ist nur das altbekannte no-nofollow-Plugin. Was ich wollte, ist etwas anderes: das nofollow soll standardmäßig überall rein und ich will halt nur aus von mir erstellten oder nachbearbeiteten Kommentaren dieses nofollow entfernen können - das kann bisher kein Plugin und das Dofollow bzw. no-nofollow eben auch nicht ;)

  5. admin

    Inzwischen habe ich eine einfache Lösung, die immer funktioniert und mir fiel gerade ein, dass ich hier vor längerem mal einen Artikel dazu gepostet hatte - hier also die Nachbesserung:

    function wp_rel_nofollow($text){
     global $user_ID;
     if($user_ID!=="1")
      $text=preg_replace('|<a (.+?)>|i','<a $1 rel="nofollow">',$text);
     else $text=preg_replace('|<a (.+?)>|i','<a $1>',$text);
     return $text;
    }

    Die ist nicht nur kürzer, einfacher und schneller - vor allem geht sie halt wirklich problemlos :) Der User mit der ID 1 ist im Normalfall der Admin. Alle anderen User, egal ob angemeldet oder nicht, werden bei dieser Anpassung auch weiterhin das standardmäßige rel=”nofollow” in ihren Kommentaren drin haben.

Einen Kommentar schreiben