rel=“nofollow“ für “Du musst angemeldet sein, um einen Kommentar abzugeben.“

Gestatten Sie in WordPress nur angemeldeten Benutzern, Kommentare zu Ihren Beiträgen zu verfassen, zeigt WordPress eine Meldung wie Du musst angemeldet sein, um einen Kommentar abzugeben. Das Wort angemeldet ist dabei auf eine Login-Seite mit nutzer- und suchmaschinenunfreundlichem Parameter verlinkt. Zumindest für das in puncto Suchmaschinenoptimierung bestehende Problem gibt es eine einfache Lösung.

Dieser Beitrag behandelt keineswegs sämtliche in Zusammenhang mit dem Login-Link auftretenden Probleme. Im Gegenteil: Der Login-Link selbst bleibt völlig unberührt.

Worum geht es? Das Problem entsteht, wenn Sie in WordPress Kommentare von Besuchern zulassen und gleichzeitig unter Einstellungen Diskussion die Option Benutzer müssen zum Kommentieren registriert und angemeldet sein aktivieren. Nicht angemeldete Besucher, zu denen auch Suchmaschinen Bots zählen, sehen unterhalb Ihrer Beiträge mit zugelassenen Kommentaren die Meldung:

  • Du musst angemeldet sein, um einen Kommentar abzugeben.
    (deutsch)
  • Sie müssen angemeldet sein, um einen Kommentar abzugeben.
    (deutsch formal)

In beiden Fällen verlinkt WordPress das Wort angemeldet auf die Login-Seite und gibt die aktuelle Beitragsseite als Weiterleitungsadresse an. Das sieht dann in etwa so aus:

https://www.werbe-markt.de/wp-login.php?redirect_to=https%3A%2F%2Fwww.werbe-markt.de%2Fwordpress%2Finhaltsverzeichnis-fuer-seiten-und-beitraege%2F

So etwas möchte man bestimmt nicht im Google-Index haben. Zudem sollten Links wie diese nicht die interne Link-Struktur verwässern und der Roboter muss auf diese Seite gar nicht drauf, weil er sich eh nicht einloggen sollte. Die Zielsetzung umfasst daher zwei einfache Punkte:

  1. Die Seite soll nicht im Index erscheinen.
  2. Suchmaschinen sollen dem Link keine Gewichtung beimessen.

Aussperren über robots.txt

Inzwischen selten geworden, aber früher sah man auf Google SERP häufiger Suchergebnisse ohne Vorschau-Snippet. Wahrscheinlichste Ursache: Der Google-Bot darf die Seite wegen eines Eintrags in der robots.txt nicht crawlen und findet auch sonst keine passenden Inhalte zur Generierung des Snippets. Ein Disallow-Eintrag in der robots.txt verbietet jedoch keineswegs die Indexierung!

Trotz robots.txt-Eintrag indexiertes Suchergebnis ohne Vorschau-Snippet

Davon abgesehen, dass Einträge in der robots.txt für jeden sichtbar sind und ein potenzielles Sicherheitsrisiko darstellen bzw. offenlegen können, bringt uns der Eintrag kein Stück weiter.

Meta robots noindex

WordPress stattet die Login-Seite von Haus aus bereits mit diesem Meta-Element aus:

<meta name="robots" content="noindex,follow" />

Das ist gut. Es hält Suchmaschinen davon ab, die Seite zu indexieren. Das gilt nicht nur für interne Links, sondern auch für Links von anderen Seiten, auf die sie keinen bzw. nur bedingt Einfluss haben. Warum auch immer eine externe Seite auf Ihre Login-Seite verweisen sollte. Das Indexierungsproblem ist somit gelöst.

Attribut rel=nofollow

Kommen wir nun zum eigentlichen Thema des Beitrags. Ein rel-Attribut mit dem Wert nofollow im a-Element weist Suchmaschinen an, dem Link nicht zu folgen. Im Wesentlichen ist das rel=“nofollow“ Attribut für zwei Fälle vorgesehen:

  1. Kennzeichnung bezahlter Links
  2. Distanzierung vom verlinkten Inhalt

In der Realität wird rel=“nofollow“ in den allermeisten Fällen missbräuchlich verwendet. Warum? Keine Ahnung. Vielleicht macht es Spaß, auf Seiten zu verweisen und gleichzeitig sein Misstrauen gegenüber den eigenen Empfehlungen auszudrücken. Um Schizophrenie soll es in diesem Beitrag ja aber nicht gehen.

Google selbst schlägt in diesem Artikel aus der Search Console-Hilfe die Priorisierung des Crawlens als weitere Einsatzmöglichkeit vor. Also ran an den Speck. Ein Blick in die /wp-includes/comment-template.php (Anschauen erlaubt, ändern nicht) verrät uns, dass der Link aus der Textphrase You must be <a href=%s>logged in</a> to post a comment. stammt.

Alles rund um Kommentare ist in WordPress relativ hart codiert und die zur Verfügung stehenden Hooks überschaubar. Als einzige praktikable Möglichkeit sehe ich den Filter comment_form_defaults, um einen eigenen Text zu injizieren oder den Standard-Text zu verändern. Ich stelle beide Lösungen vor.

Die saubere Lösung

Der Filter sieht dann so aus und kann in der functions.php des aktiven Themes untergebracht werden:

add_filter('comment_form_defaults', function ($defaults) {
    $post_id = get_the_ID();
    $defaults['must_log_in'] = '<p class="must-log-in">' . sprintf(__('You must be <a href="%s" rel="nofollow">logged in</a> to post a comment.'), wp_login_url(apply_filters('the_permalink', get_permalink($post_id), $post_id))) . '</p>';
    return $defaults;
}, 99, 1);

Lästigerweise übergibt uns WordPress die $post_id nicht als Paramter an die Callback-Funktion, so dass wir sie mit get_the_ID() nochmals beziehen müssen. Jedenfalls haben wir eine neue Textphrase kreiert, die unser rel=“nofollow“ Attribut enthält. Jetzt gilt es, die Übersetzung hierfür zu hinterlegen.

Zu erklären, was es mit .po- und .mo-Dateien auf sich hat, würde hier eindeutig den Rahmen sprengen. Mein Blog-Beitrag Eine POT-Datei mit Poedit erstellen streift das Thema zumindest. Die de_DE_formal.po-Datei meines Themes enthält nach vorgenommener Übersetzung diese Passage:

msgid ""
"You must be <a href=\"%s\" rel=\"nofollow\">logged in</a> to post a comment."
msgstr ""
"Sie müssen <a href=\"%s\" rel=\"nofollow\">angemeldet</a> sein, um einen "
"Kommentar abzugeben."

Quick’n’dirty

Wenn Sie keine Lust haben, sich mit Poedit oder ähnlichem rumzuschlagen, kann ich das vollkommen nachvollziehen. Die schnelle und schmutzige Lösung sieht ganz einfach so aus und sollte in den meisten Fällen zum selben Ergebnis führen:

add_filter('comment_form_defaults', function ($defaults) {
    $defaults['must_log_in'] = preg_replace('/<a([^>]+)>/', '<a$1 rel="nofollow">', $defaults['must_log_in']);
    return $defaults;
}, 99, 1);

Nochmal zusammenfassend

Ein Disallow-Eintrag in der robots.txt bringt in diesem Fall rein gar nichts und ist eher schädlich als nützlich. Den nötigen noindex-Attributswert setzt WordPress bereits nativ und es ist kein Zutun Ihrerseits erforderlich. Für die Einbindung des rel=“nofollow“ Attributs können Sie aus einem der beiden obigen Code-Schnipsel wählen. Die beiden Ziele, dass die Seite nicht im Index erscheinen soll und dass ihr kein Link Juice zuteil werden soll, sind somit erreicht.

Search Spam Risiko

Es wäre unseriös, abschließend nicht auf ein potenzielles Risiko der Abstrafung durch Google hinzuweisen. Wenn Sie mal nach etwas wie „Internal Links nofollow“ recherchieren, werden Ihnen zig SEO-Experten begegnen, die das Vorgehen als möglicherweise unlautere Manipulation einstufen.

Allerdings werden Sie auch auf den schon oben erwähnten Artikel in der Search Console-Hilfe stoßen. Wenn Google ganz exakt die von mir geschilderte Methodik im Beispiel <a href=signin.php rel=nofollow>sign in</a> selbst anführt, kann es so schlimm nicht sein, oder?

In einer Vielzahl von Beiträgen einschließlich des Google-Artikels ist vom PageRank die Rede. Das lässt zumindest mal den Gedanken aufkommen, dass, was vor Jahren als erwiesene Best Practice der Suchmaschinenoptimierung galt, heute schon längst überholt ist. Wer weiß das schon?

Ich persönlich schätze weder den Nutzen, noch das Risiko als sonderlich hoch ein, an der ein oder anderen Stelle der Website mit einem Nofollow-Link zu arbeiten. Entscheiden Sie daher selbst, ob Sie den beschriebenen Weg mit dem rel=“nofollow“ Attribut mitgehen möchten oder nicht. Im Übrigen bin ich kurz nach Schreiben des Beitrags auf einige weitere Stellen bzw. Textphrasen gestoßen, in denen der unschöne Link zum Einsatz kommt. Das schreit nach einer Fortsetzung.

»«

Schreiben Sie einen Kommentar