Canonical Tag für SEO in TYPO3 mit PHP Event Listener
In diesem Artikel des TYPO3 Tutorial von Thomas Berscheid geht um die Generierung eines Canonical Link für SEO in TYPO3 über die Schnittstelle des Event Listener. Der Canonical Link ist ein wichtiges Feature für die Suchmaschinenoptimierung, denn mit diesem Link einer Seite sagen wir einer Suchmaschine, dass wir für eine Seite genau einen führenden Link haben, auch wenn diese Seite in mehreren Varianten abrufbar ist. Dies geschieht zum Beispiel, wenn wir eine mehrsprachige Webseite mit noch nicht übersetzten Inhalten haben. Auch wenn eine Seite per Suche oder über ältere verlinkte Seiten noch mit Parametern und nicht über lesbare Links abrufbar ist, kann es mehrere Versionen derselben Seite geben. Damit haben wir duplicate Content, der für unseren Page Rank bei Google ziemlich schädlich ist, denn die bevorzugte Suchmaschine sucht nach einzigartigen Inhalten. Der Canonical Link sagt Google nun: schön, dass du meine Seite gefunden hast, aber der richtige Link steht hier und nimm bitte diese hier verlinkte Seite in deinen Index auf.
Eigenen Canonical Link für Extension in TYPO3 generieren
Bereits seit der Version 9.5 generiert TYPO3 den Canonical Link automatisch, ohne dass wir etwas dazu tun müssen. Wenn man redaktionellen Inhalt in Seiten pflegt, kann man den Link über den Slug generieren und den Rest macht TYPO3 automatisch. Manchmal aber hat man den Wunsch, den standardmäßig erzeugten Canonical Link abzuschalten und durch einen eigenen zu ersetzen. Dies ist beispielsweise der Fall, wenn man eine Blog oder News Extension hat und möchte, dass der Link zu einem Beitrag oder der Nachricht nicht mit Parametern gefüllt ist. Auch grätscht hier manchmal der Cache rein und sorgt dafür, dass mehrere Beiträge mit demselben Link abrufbar sind. Die Schnittstelle dazu gibt es seit mehreren Versionen in TYPO3, im Dezember 2023 ist sie mit mehreren Methoden erweitert worden.
Wir wollen also erreichen, dass der Link zu unserem Beitrag in unserer Extension nicht so aussieht
seite.de/blog?tx_meinblog_pi1&%5Baction%5D=finden&%5Bwort%5D=Hunger
sondern eher nutzerfreundlich aussieht wie hier
seite.de/meinblog/Suche/Hunger/2
Wenn wir den Link nach der hier beschriebenen Variante generieren, haben wir die erste Form des Links. Schön, werden wir sagen. Bis wir unser SEO Tool genutzt haben, dass über die Parameter meckert. Und weil TYPO3 Anforderungen von Kundinnen und Kunden aufnimmt, gibt es in TYPO3 eine Möglichkeit, den Canonical Link per PHP API und Symfony so zu generieren, dass auch das SEO Tool zufrieden ist und Google uns wieder liebt.
Canonical Link per PHP API in TYPO3 erzeugen
Die Erzeugung des Canonical Link kann man bei TYPO3 nun über das integrierte Symfony Framework und die in PHP geschriebene API erzeugen. Dazu greift man mit dem PSR-14 Event ModifyUrlForCanonicalTagEvent in den Prozess zur Generierung der Seite ein. Zu diesem Zweck legt man im Verzeichnis Classes der TYPO3 Extension neue Verzeichnisse in der gleichen Struktur wie im TYPO3 Core an, was die Wartung des Codes erleichtert, also zum Beispiel:
Meinblog/Classes/Seo/EventListener
Hier können Sie nun eine neue PHP Datei anlegen, die Sie in diesem Fall MeinblogEventListener.php nennen können. In dieser Datei können Sie nun die entsprechenden Klassen des TYPO3 Core referenzieren. Das Codebeispiel illustriert wie man das Event aufrufen und bearbeiten kann:
namespace Vendor\Meinblog\Seo\EventListener;
use Vendor\Meinblog\Services\MetatagServices;
use Vendor\Meinblog\Services\ServerServices;
use TYPO3\CMS\Seo\Event\ModifyUrlForCanonicalTagEvent;
final class MeinblogEventListener
{
public function setCanonicalLink(ModifyUrlForCanonicalTagEvent $event): void
{
// Logik für den neuen Canonical Link
$meinblogLink = [...]
$newCanonical = $meinblogLink;
// neuen Link über Methode setUrl() setzen
$event->setUrl((string)$newCanonical);
}
}
Den Namen der Funktion zur Generierung des neuen Canonical Link können Sie selbst vergeben, hier haben wir sie setCanonicalLink genannt.
Canonical Link per Symfony in Services.yaml konfigurieren
Wie aber nun sagen wir unserem System, dass es diese Funktion nutzen soll? Nun, dafür müssen wir Symfony nutzen. Für diesem Zweck haben wir unter
Configuration / Services.yaml
die Datei zur Konfiguration unseres System. Hier fügen wir nun die einen eindeutigen Identifier für unseren Service hinzu und sagen unserer Extension, welches Event und welche Methode es nutzen soll:
services:
[...]
Vendor\Meinblog\Seo\EventListener\MeinblogEventListener:
tags:
- name: event.listener
identifier: 'meinblog/modify-url-for-canonical-tag'
event: TYPO3\CMS\Seo\Event\ModifyUrlForCanonicalTagEvent
method: 'setCanonicalLink'
Damit haben wir nun einen eigenen Canonical Tag, mit dem wir erfolgreich SEO betreiben können.