Patrick Fiedorowicz |  04.05.2011 | TYPO3, Extensions, RealUrl, SEO

Die TYPO3-Extensions RealUrl und tt_news sind wohl die am öftesten verwendeten Extensions überhaupt. Doch oft sieht man Programmierer daran scheitern, die sprechenden Pfade noch weiter zu optimieren und zu verkürzen.

Dass sich ein Pfad wie
"example.com/news/ article/2011/05/04/ eine-nachricht-mit-ttnews-und-realurl.html"
schon besser anhört als ohne RealUrl
"example.com/index.php ?id=123&tx_ttnews[tt_news]=456"
ist jedem klar. Auch die Tatsache, dass Suchmaschinen sprechende Links höher bewerten, ist auch längst kein Geheimnis mehr.

Aber trotzdem ist hier noch nicht das Ende des Optimums erreicht. Bei Google sind zahlreiche Foren-Einträge von verzweifelten Programmierern findbar, die gern z. B. die Unterordner für das Datum aus der Url entfernen wollen, dabei allerdings gescheitert sind.

Hierzu meine Lösung, wie der News-Pfad auf ein Minimum beschränkt werden kann. In meinem Fall ist die Seite mit der Id 14 meine SinglePid, also die Seite, auf welcher die News im Detail angezeigt werden. Benutzt habe ich die RealUrl-Version 1.10 und tt_news 3.0.1Der Code-Ausschnitt gehört in die realurl_conf.php im Verzeichnis /typo3conf/ bzw. in die entsprechende PHP-Datei, je nachdem wie sie benannt wurde:

...
// sucht diesen Abschnitt in der RealUrl-Config-Datei oder neu hinzufuegen
'fixedPostVars' => array(
  // hier muss nun eure SinglePid statt der 14 rein
  '14' => array(
    // der folgende Teil ist Standard und aus der tt_news-Doku entnommen
    array(
      'GETvar' => 'tx_ttnews[tt_news]',
      'lookUpTable' => array(
        'table' => 'tt_news',
        'id_field' => 'uid',
        'alias_field' => 'title',
        'addWhereClause' => ' AND NOT deleted',
        'useUniqueCache' => 1,
        'useUniqueCache_conf' => array(
          'strtolower' => 1,
          'spaceCharacter' => '-',
        ),
      ),
    ),
  ),
),
...

Mit Hilfe dieses kleines Snippets werden fortan News unter der Url "artikel/hier-kommt-der-news-titel.html" erreichbar sein. Ein weiterer Vorteil ist, dass der Seitentitel für die SinglePid (in meinem Fall "Artikel") im Link verwendet wird und auch Mehrsprachigkeit kein Problem darstellt.

Ich habe das bei FiedoMedia.de so gelöst, dass ich noch eine übergeordnete Seite namens "News" erstellt habe, somit sind alle Nachrichten unter /news/artikel/seitentitel/ erreichbar.

Analog dazu ist der Code-Ausschnitt auch mit jeder anderen Extension, welche eine Single-Ansicht bietet, und RealUrl kompatibel:

...
// sucht euch wieder diesen Abschnitt in der RealUrl-Config-Datei
'fixedPostVars' => array(
// hier muss wieder die SinglePid der Extension eingetragen werden
  '14' => array(
    array(
      // hier der $_GET Parameter eurer Extension, der umgewandelt wird
      'GETvar' => 'tx_meineextension_pi1[uid]', 
      'lookUpTable' => array(
        // in welcher DB-Tabelle stehen die Werte der Extension?
        'table' => 'tx_meineextension_tabellenname', 
        // nach welchem Feld soll gefiltert werden?
        'id_field' => 'uid',
        // welches Feld soll fuer die Url verwendet werden?
        'alias_field' => 'title', 
        'addWhereClause' => ' AND NOT deleted',
        'useUniqueCache' => 1,
        'useUniqueCache_conf' => array(
          'strtolower' => 1,
          'spaceCharacter' => '-',
        ),
      ),
    ),
  ),
),
...

Sollten Sie Anregungen, Fragen oder Kommentare zu meinem Snippet haben, zögern Sie nicht, die Kommentarfunktion zu benutzen oder diese Seite mit anderen zu teilen. Ich freue mich über jegliches Feedback.

  1. Nils Nils 12.08.2011
    endlich mal eine einfache, klar strukturierte und verständliche sowie vor allem funktionierende anleitung :) !!! weiter so...
  2. Markus Markus 07.09.2011
    Wie bekommt man noch im Pfad das /details/ umbenannt oder raus?

    Das wäre echt coll!

    Danke für die Lösung!
    1. Patrick Fiedorowicz Patrick Fiedorowicz 17.10.2011
      @Markus:
      "details" ist der Name der Seite, auf welcher sich die Single-Ansicht deiner News befindet! Um das zu ändern, einfach die Seite im Backend umbenennen.
      Wenn du aber auch den Seitennamen heraus haben willst (was nicht unbedingt zu empfehlen ist), dann müsstest du die Single-Ansicht auf die Startseite versetzen.

      Grüße Patrick
  3. solarkaine solarkaine 29.10.2011
    klingt wirklich gut...dankeschön

    was mache ich, wenn ich mehrere singleseiten im strukturbaum verteilt habe?

    gruß
    Solar
    1. Patrick Fiedorowicz Patrick Fiedorowicz 05.07.2014
      Bei mehreren Single-Seiten kannst du es wie folgt verwenden:

      'fixedPostVars' => array(
      'ttnews_singleview' => array(
      ... hier kommt die gleiche Konfiguration rein, wie beschrieben ...
      ),
      '14' => 'ttnews_singleview',
      '50' => 'ttnews_singleview',
      '76' => 'ttnews_singleview',
      ),

      Du definierst also die Konfiguration für tt_news-Single-Seiten unter einem frei wählbaren Namen (z. B. ttnews_singleview) und übergibst dann für die einzelnen Single-Seiten diesen von dir festgelegten Namen.

      Schöne Grüße
      Patrick
  4. Robert Ehrmann Robert Ehrmann 26.01.2016
    Hallo,
    verstehe ich nicht ganz. Ich verwende folgenden Code:

    'postVarSets' => array(
    '_DEFAULT' => array(
    'browse' => array(
    array( 'GETvar' => 'tx_ttnews[pointer]', 'valueMap' => array('weiter' => '1','weiter' => '2',)),),

    // news kategorien
    'kategorie' => array (
    array(
    'GETvar' => 'tx_ttnews[cat]',
    'lookUpTable' => array(
    'table' => 'tt_news_cat',
    'id_field' => 'uid',
    'alias_field' => 'title',
    'addWhereClause' => ' AND NOT deleted',
    'useUniqueCache' => 1,
    'useUniqueCache_conf' => array(
    'strtolower' => 1,
    'spaceCharacter' => '-',
    ),
    ),
    ),
    ),

    // news artikel
    'datum' => array(
    array(
    'GETvar' => 'tx_ttnews[year]' ,
    ),
    array(
    'GETvar' => 'tx_ttnews[month]' ,
    ),
    array(
    'GETvar' => 'tx_ttnews[day]' ,
    ),
    array(
    'GETvar' => 'tx_ttnews[tt_news]',
    'lookUpTable' => array(
    'table' => 'tt_news',
    'id_field' => 'uid',
    'alias_field' => 'title',
    'addWhereClause' => ' AND NOT deleted',
    'useUniqueCache' => 1,
    'useUniqueCache_conf' => array(
    'strtolower' => 1,
    'spaceCharacter' => '-',
    ),
    ),
    ),
    ),
    ),
    ),

    Hier kann ich die Ausgabe in der URL steuern wie ich möchte.

    Was mein Problem ist, dass sobald ich meine URL nur auf den "Titel meiner News.html" beschränke ich nach dann sowas wie "Titel meiner News.html?undganzvielschrottdahinter" bekomme
    Das mit meiner Variante und mit der oben genannten macht kein Unterschied.
    Kann mir da einer helfen?

    Grüße
    Robert
    1. Patrick Fiedorowicz Patrick Fiedorowicz 01.02.2016
      Hi Robert,

      genau der "Schrott dahinter" wäre interessant.

      Ich nehme mal an, dass du diese Parameter auch unter postVarSets definieren musst (ohne deine Parameter genau zu kennen).

      Grüße
      Patrick
  5. Bert Bert 23.02.2016
    Hey Patrick,

    cooler Artikel, jedoch funktioniert es leider mit meiner Config nicht:

    <?php
    $TYPO3_CONF_VARS['FE']['addRootLineFields'].= ',tx_realurl_pathsegment';
    $TYPO3_CONF_VARS['EXTCONF']['realurl'] = array(
    '_DEFAULT' => array(
    'init' => array(
    'enableCHashCache' => 1,
    'appendMissingSlash' => 'ifNotFile',
    'enableUrlDecodeCache' => 1,
    'enableUrlEncodeCache' => 1,
    'postVarSet_failureMode' => '',
    ),
    'redirects' => array(),
    'preVars' => array(
    array(
    'GETvar' => 'no_cache',
    'valueMap' => array(
    'nc' => 1,
    ),
    'noMatch' => 'bypass',
    ),
    array(
    'GETvar' => 'L',
    'valueMap' => array(
    # 'de' => '0',
    'en' => '1',
    ),
    'valueDefault' => 'de',
    'noMatch' => 'bypass',
    ),
    ),
    'pagePath' => array(
    'type' => 'user',
    'userFunc' => 'EXT:realurl/class.tx_realurl_advanced.php:&tx_realurl_advanced->main',
    'spaceCharacter' => '-',
    'languageGetVar' => 'L',
    'expireDays' => 7,
    'rootpage_id' => 1,
    'firstHitPathCache' => 1,
    ),
    'fixedPostVars' => array(
    // hier muss nun eure SinglePid statt der 14 rein
    '25' => array(
    // der folgende Teil ist Standard und aus der tt_news-Doku entnommen
    array(
    'GETvar' => 'tx_ttnews[tt_news]',
    'lookUpTable' => array(
    'table' => 'tt_news',
    'id_field' => 'uid',
    'alias_field' => 'title',
    'addWhereClause' => ' AND NOT deleted',
    'useUniqueCache' => 1,
    'useUniqueCache_conf' => array(
    'strtolower' => 1,
    'spaceCharacter' => '-',
    ),
    ),
    ),
    ),
    ),
    'postVarSets' => array(
    '_DEFAULT' => array(
    // news archive parameters
    'archive' => array(
    array(
    'GETvar' => 'tx_ttnews[year]' ,
    ),
    array(
    'GETvar' => 'tx_ttnews[month]' ,
    'valueMap' => array(
    'january' => '01',
    'february' => '02',
    'march' => '03',
    'april' => '04',
    'may' => '05',
    'june' => '06',
    'july' => '07',
    'august' => '08',
    'september' => '09',
    'october' => '10',
    'november' => '11',
    'december' => '12',
    )
    ),
    ),
    // news pagebrowser
    'browse' => array(
    array(
    'GETvar' => 'tx_ttnews[pointer]',
    ),
    ),
    // news categories
    'select_category' => array (
    array(
    'GETvar' => 'tx_ttnews[cat]',
    ),
    ),
    // news articles and searchwords
    'article' => array(
    array(
    'GETvar' => 'tx_ttnews[tt_news]',
    'lookUpTable' => array(
    'table' => 'tt_news',
    'id_field' => 'uid',
    'alias_field' => 'title',
    'addWhereClause' => ' AND NOT deleted',
    'useUniqueCache' => 1,
    'useUniqueCache_conf' => array(
    'strtolower' => 1,
    'spaceCharacter' => '-',
    ),
    ),
    ),
    array(
    'GETvar' => 'tx_ttnews[backPid]',
    ),
    array(
    'GETvar' => 'tx_ttnews[swords]',
    ),
    ),
    ),
    ),
    // configure filenames for different pagetypes
    'fileName' => array(
    'defaultToHTMLsuffixOnPrev' => 1,
    'index' => array(
    'print.html' => array(
    'keyValues' => array(
    'type' => 98,
    ),
    ),
    'rss.xml' => array(
    'keyValues' => array(
    'type' => 100,
    ),
    ),
    'rss091.xml' => array(
    'keyValues' => array(
    'type' => 101,
    ),
    ),
    'rdf.xml' => array(
    'keyValues' => array(
    'type' => 102,
    ),
    ),
    'atom.xml' => array(
    'keyValues' => array(
    'type' => 103,
    ),
    ),
    ),
    ),
    ),
    );
    ?>

    Ich bekomme immer "page not found" "Reason: Segment "presse-detail" was not a keyword for a postVarSet as expected on page with id=1."

    ID=1 ist meine Root page.

    Der link ist: http://www.example.de/presse-detail/test-news-1.html

    Ich bin schon am Verzweifeln...

    Vielen Dank schon mal!
    1. Patrick Fiedorowicz Patrick Fiedorowicz 24.02.2016
      Hi Bert,

      schau mal bei deinen postVarSets und räum da auf.
      Du rufst im Moment 2x 'GETvar' => 'tx_ttnews[tt_news]' ab, einmal bei fixedPostVars und einmal bei postVarSets.

      Grüße
      Patrick

Neuen Kommentar schreiben

Deine E-Mail-Adresse wird nicht veröffentlich. Bitte gib Sie an, um dein Gravatar-Bild anzuzeigen.

Zurück zu allen News