Mit Content_Dump eine interne Verlinkung auf Tag-Basis aufbauen

CMS made simple ist grundsätzlich in der Lage, für Suchmaschinen optimierte URLs auszugeben. Die Feinheiten rund um Pretty URLs & SEO können hier diskutiert werden.
Post Reply
nhaack

Mit Content_Dump eine interne Verlinkung auf Tag-Basis aufbauen

Post by nhaack »

Hallo zusammen,

wollte letztens bei einem Projekt eine Tag basierte Verlinkung innerhalb einer Site umsetzen. Der Content ist als normaler Seitencontent ohne Module angelegt worden. Von der Anzahl sind es recht viele Artikel und ich wollte die Artikel thematisch verknüpfen. Sprich, wenn ein Artikel den Tag "world" hat, soll dieser Tag auf eine Seite verlinken, auf der alle Artikel mit dem Tag "world" zu finden sind.

Da es hier im Forum gerade ein ähnliches Problem auf News-Modul Basis gibt, wollte ich mal meine Lösung auf regulärer Content-Basis vorstellen. Die Code-Beispiele sind sehr runtergedampft auf das Wesentliche. Bei Fragen einfach unten posten.

Hierfür habe ich Content_Dump mit einer Prise Smarty und htaccess verwendet. Allerdings muss man hierfür den Content-Props-Table in der DB um einen Fulltext-Index erweitern. Das ist per se nicht weiter wild, man sollte aber wissen was man da tut ;). Ich glaube es müsste auch ohne gehen, performanter ist es aber mit Index

Wenn man dies dann getan hast, können mit CD Beiträge nach bestimmten Inhalten gefiltert werden. Allerdings kann CD nur auf den regulären Seitencontent zugreifen. Ein Zugriff auf andere Module ist nicht möglich. Solange man nur kurze Content-Blöcke mit wenig Inhalt (z.B. Tags) durchsuchst, ist das noch OK von der Geschwindigkeit (hängt natürlich auch von der Konfiguration des Servers ab), als richtige Suche im ganzen Content würde ich dann doch lieber ne richtige Suche verwenden.

Nehmen wir an, die tags pflege ich in einem eigenen Content-Block:

{content block="tags" wysiwyg="false" oneline="true" assign="tags"}

Dabei ist es egal ob "world" als einzelnes Wort in diesem Block steht oder ein Wort von mehreren ist. So kann man z.B. mehrere Tags einem Artikel zuordnen.

Aufbau der Tags als Links:

Mit ein wenig smarty drum herum,wird die Ausgabe des Blocks gleich automatisch verlinkt. Dazu brauchen wir aber noch ein kleines UDT zum erzeugen der Tag-Links:

Name: tag_maker

Code: Select all


if ($params['content_tags'] != '') {
  // explode at space
  $links = explode(" ",$params['content_tags']);
  // count elements
  $counter = count($links)-1;
   // walk through all elements
   for ($i=0; $i<=$counter; $i++) {
     echo = "<a href='http://example.com/tags/$links[$i]/'>$links[$i]</a> ";
   }

} else {
   $echo = 'this article has no tags';
}

Der Einbau im Template sähe dann so aus:

Template

Code: Select all


{content block="tags" wysiwyg="false" oneline="true" assign="tags"}

{tag_maker content_tags=$tags}

heraus kommt dann eine Liste mit Links - damit erzeugt man gleich ne "vertaggte" Liste mit Begriffen zu jedem Artikel. Nehmen wir an es sind die Begriffe "lorem ipsum hello world" als String in der Content-Box gegeben. Dann erhält man folgende Links zurück

erzeugte URL

Code: Select all

http://example.com/tags/lorem
http://example.com/tags/ipsum
http://example.com/tags/hello
http://example.com/tags/world
Übersichtsseite:

Um jetzt ne schicke Übersichtsseite zu erzeugen, auf der alle Artikel mit einem bestimmten Tag angezeigt werden, muss die URL wieder aufgelöst werden, damit wir den Begriff als Parameter übergeben können:

htaccess:

Code: Select all


RewriteCond %{REQUEST_URI} ^/tags
RewriteRule ^([^/]*)/([^/]*) index.php?page=$1&tag=$2 [QSA,L]

Wenn auf dem Webserver jetzt die URL http://example.com/tags/hello aufgerufen wird, wird sie als http://example.com/index.php?page=tags&tag=hello verarbeitet.

Jetzt wird's spannend. Um die Übersicht zu erzeugen, müssen wir diesen Parameter ("tag=") jetzt annehmen. Das geht recht simple mit etwas Smarty (vorher aber noch eine Seite mit dem Alias "tags" anlegen - Smarty hier rein):

Smarty für Get-Parameter

Code: Select all


{if isset($smarty.get.tag)}
   {assign var=tag value=$smarty.get.tag}
{else}
   {assign var=tag value='default'}
{/if}

Und den mit Smarty abgegriffenen Wert übergibt man jetzt an Content_Dump.

{content_dump filter=$tag blockname="tags"}

;D

Alles klar?

Zusammenfassung

1) UDT erstellen damit man die interne Verlinkung erzeugen kann

siehe oben

2) UDT im Artikel-Template einbauen

Code: Select all


<__html>
  ...
  <h1>{title}</h1>
    <div id="tags">
      This article has the following tags: 
      {content block="tags" wysiwyg="false" oneline="true" assign="tags"}
      {tag_maker content_tags=$tags}
    </div>

    <div id="mainContent">
      {content}
    </div>
  ...
</__html>

3) htaccess anpassen damit die URLs korrekt aufgelöst werden

siehe oben

4) Übersichts template erstellen

Code: Select all


<__html>
  ...

{if isset($smarty.get.tag)}
   {assign var=tag value=$smarty.get.tag}
{else}
   {assign var=tag value='default'}
{/if}

  <h1>View articles being tagged "{$tag}"</h1>

{content_dump block_name="tags" filter=$tag} 

<ul>
{foreach from=$dump item=item}
   <li>{cms_selflink page=$item->content->alias}</li>
{/foreach}
</ul>
  ...
</__html>

Je nach Lust und Laune kann man dann dieses Rahmengerüst den eigenen Wünschen anpassen.

Beste Grüße
Nils
Post Reply

Return to “Suchmaschinenoptimierung (SEO)”