MengTracker zerstört Links
Bei Basic Thinking habe ich neulich von MengTracker for Wordpress gelesen, einem PlugIn für WordPress, dass die Klicks der Besucher aufzeichnet und auswertet.
Als ich dieses PlugIn dann ausprobiert habe, bin ich über ein kleines Problem gestolpert, das ich erst nach einigem Experimentieren lösen konnte. Nachdem ich nun (nach Abschalten des JavaScripts) auch endlich einen entsprechenden Kommentar beim Autor hinterlassen konnte, will ich den deutschsprachigen Lesern diese Problemlösung natürlich nicht vorenthalten. Mehr dazu später.
Installation
Zunächst zur Installation (für alle, die des Englischen vielleicht nicht so mächtig sind):
Man lädt sich von der MengTracker-Seite das aktuelle Achiv mengTracker-x.x.x-en.zip (das x.x.x steht für die jeweilig aktuelle Version) herunter und entpackt es in ein beliebiges Verzeichnis. Dort wird dann ein Unterverzeichnis namens mengtracker erstellt.
Dann kopiert man dieses Verzeichnis direkt in das WordPress-PlugIn-Verzeichnis wp-content/plugins. Damit die schönen Grafiken erstellt werden können, muss man nun noch die Dateirechte für die vier Dateien chart1.txt, chart2.txt, chart3.txt, chart4.txt im Unterverzeichnis mengtracker/ampie auf 666 (also Lesen und Schreiben, aber nicht Ausführen) ändern1.
Nun einfach das PlugIn in der PlugIn-Übersicht aktivieren und fertig.
Die Ergebnisse des PlugIns findet man übrigens nicht im Tellerrand/Dashboard oder unter dem Menüpunkt Verwalten/Manage, sondern unter Links » MengTracker.
Ein Bug
Das PlugIn verändert die Links im nicht-statischen Text und fügt JavaScript-onClick-Events hinzu. So auch im Text des jeweiligen Beitrags oder für die Verweise, die auf den Namen der Kommentar-Verfassern liegen.
Benutzt man nun eventuell noch andere PlugIns, die diese Verweise ändern, bzw. weitere Attribute hinzufügen, so kann es passieren, dass MengTracker die Links zerstört, was neben einem Bruch der Standard-Konformität auch mit Darstellungslücken einhergeht.
Das Problem ist, dass das PlugIn in einem Link ;Name alles zwischen dem ersten (nach dem href=) und dem letzten Anführungszeichen als Verweisziel ermittelt und den Code dann mit diesen falschen Annahmen ergänzt. Stehen in dem Link aber noch weitere Attribute (wie class etwa) oder zusätzliche Elemente (wie img-Bilder), so schätzt das PlugIn den Link wegen der zusätzlichen Anführungszeichen zu lang und schreibt die Ergänzungen an vollkommen unsinnigen Stellen.
Schuld sind die Zeilen 139 und 140 in der Datei menganalytics.php:
static $anchorPattern = '(.*hrefs*=s*)[\"']*(.*)[\"'] (.*)';ereg($anchorPattern, $text, $matches);
Abgesehen davon, dass ich nicht verstehe, warum der Autor an dieser Stelle nicht – wie er es im restlichen Quelltext ja auch tut – die (von php.net empfohlenen) Perl-kompatiblen Funktionen benutzt, ist der verwendete reguläre Ausdruck zu gierig.
Eine Lösung
Damit auch Leute ohne tieferes Verständnis von regulären Ausdrücken dieses Problem beheben können, hier (m)ein Korrekturvorschlag:
static $anchorPattern = '/(.*href\s*=\s*)[\"\']*([^\"\']*)[\"\'] (.*)/';preg_match($anchorPattern, $text, $matches);
Wenn man die genannten Zeilen austauscht, ist das Problem gelöst und die friedliche Koexistenz verschiedener PlugIns ist wieder möglich.
Wer dazu fragen hat, kann diese (wie immer) gern in den Kommentaren niederschreiben.
- 1 Entgegen den Angaben auf der PlugIn-Homepage reichen dafür die Dateirechte 666. Gäbe man den Dateien per 777 auch Ausführen-Rechte, so öffnete man eine theoretische Sicherheitslücke – aber wer will das schon :).
Mittwoch, 10. Januar 2007 um 6:46
Moin,
hmm, wenn ich die hier vorgeschlagenen Änderungen durchführe, dann schiesst sich meine gesamte Wordpress Installation komplett ab (selbst die Admin Seiten werden nicht mehr geladen). Ist nur wieder zum Funktionieren zu überreden, indem man die original menganalytics.php an die entsprechende Stell kopiert.
Mittwoch, 10. Januar 2007 um 8:52
Sorry, da hatte mir die AutoFix-Funktion von WordPress die Backslahes vor dem “s” geklaut. Habe ich jetzt korrigiert.
Der jetzige Ausdruck entspricht auch nach dem “Veröffentlichen” noch genau dem, den ich in meine Datei eingefügt habe.
Danke für den Hinweis.