Problembeschreibung

Auch Joomla 1.5.x selbst bereitet kleine Probleme mit der SEF-Umsetzung. So z.B. mit der MailTo-Funktion, oder anders „Seite per E-Mail weiterempfehlen". Diese Funktion ist auf jedem Joomla-Beitrag oben über das Mailto-Icon erreichbar. Das besondere Problem hierbei ist, dass im URL ein sehr langer ständig wechselnder Code-Link eingebaut ist. Damit entstehen äußerst suchmaschinen-unfreundliche URLs. Der angehängte Schlüssen codiert quasi die damit verbundene Seite. Es führt zu enorm vielen Einträgen in der jos_redirection-Tabelle für die SEF-Umsetzungen. Bestenfalls wird für jede Beitragsseite auch eine Seite_weiterempfehlen.html-URLs in der jos_redirection abgelegt. Außerdem, und das liebt z.B. Google nicht unbedingt, werden viele Seiten-Dublikate erzeugt, denn konkret ist dieses Formular ja völlig identisch unter verschiedensten URLs abrufbar. Alle diese Seiten werden in den Suchmaschinen sichbar sein.



Lösung

Die Lösung ist in zwei Schritten umzusetzen.

  1. Es muss dafür gesorgt werden, dass das href-Attribut im a-Tag möglichst immer den gleichen URL enthält und nicht für jede Seite eine eigene. Das geht aber zunächst nur mit dem Nachteil, dass dann nicht mehr die gerade für den User sichtbare Seite weiterempfohlen wird. Folglich muss
  2. dafür gesorgt werden, dass trotz den nun aktiven SEF für diesen Link die Weiterempfehlung für diese Seite funktioniert. Das geht nur - mal vorweggegriffen, in dem dem JavaScript-Aufruf für window.open() nicht der gleichlautenden SEF-URL übergeben werden darf, sondern ein nicht-SEF-URL. Für die Suchmaschinen ist das i.d.R. nicht relevant und wird als solches nicht interpretiert.

Zum ersten Schritt - dem Erstellen einer SEF-URL

Dazu ist es notwendig ein eigenen sh404SEF-Komponenten-Plugin zu erstellen, denn aus der non-SEF-URL wird ersichtlich, dass für dies Mail-Funktion eine eigene Komponente com_mailto aufgerufen wird.

So sieht ein Nicht-SEF-URL aus:

index.php?option=com_mailto&lang=de&link=aHR0cDovL2VudHcubWFya3Mtbm9ybWFsaWVuLmNvbS9UZWNobmlrL3NhZWdlbi5odG1s&tmpl=component

Das macht das Joomla-SEF daraus, wobei die hier erkenntliche ID für jede Seite anders aussieht:

component/option,com_mailto/link, aHR0cDovL2VudHcubWFya3Mtbm9ybWFsaWVuLmNvbS9UZWNobmlrL3NhZWdlbi5odG1s /tmpl,component/

Das Ziel ist, dass der URL so ausschauen soll:

Seite_weiterempfehlen.html

Nach Analyse des Problems war klar, man kommt nicht um Programmieraufwand herum und muss ein eigenes sh404SEF-Plugin für diesen Zweck erstellen.

sh404SEF hat dazu hervorragende Vorarbeit geleistet, die das wirklich einfach ermöglicht. Im Verzeichnis components/com_sh404sef/sef_ext/ liegt ein Beispiel-Script für die Erstellung von sh404SEF-Komponenten-Plugins. Diese wird geöffnet und zweckentsprechend modifiziert. Das Ergebnis sieht so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
/**
 * sh404SEF support for com_mailto component. (Seite_weiterempfehlen)
 * Author : Steffen Kraft
 * contact : Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.
 * 
 * {shSourceVersionTag: Version 1 - 2010-05-19} * 
 */
defined( '_JEXEC' ) or die( 'Direct Access to this location is not allowed.' );
 
// ------ standard plugin initialize function - don't change ----------------
global $sh_LANG;
$sefConfig = & shRouter::shGetConfig(); 
$shLangName = '';
$shLangIso = '';
$title = array();
$shItemidString = '';
$dosef = shInitializePlugin( $lang, $shLangName, $shLangIso, $option);
if ($dosef == false) return;
// ------- standard plugin initialize function - don't change ----------------
 

 
// remove common URL from GET vars list, so that they don't show up as query string in the URL
shRemoveFromGETVarsList('option');
shRemoveFromGETVarsList('lang');
if (!empty($Itemid))
 shRemoveFromGETVarsList('Itemid');
 
$title[] = "Seite_weiterempfehlen";
shRemoveFromGETVarsList('link');
shRemoveFromGETVarsList('tmpl');
 

 
// ----- standard plugin finalize function - don't change -----------------
if ($dosef){
 $string = shFinalizePlugin( $string, $title, $shAppendString, $shItemidString, 
 (isset($limit) ? @$limit : null), (isset($limitstart) ? @$limitstart : null), 
 (isset($shLangName) ? @$shLangName : null));
} 
// ----- standard plugin finalize function - don't change -----------------
 
?>
 

Einige Bestandteile wurden gelöscht. Wesentliche Neueinfügung sind die drei Zeile für den Titel und das Entfernen der störenden URL-GET-Parameter.

sh404SEF erkennt nach dem Speichern dieser Datei im o.g. Verzeichnis als com_mailto.php autom. die Existenz dieses Scriptes und führt die SEF-Umsetzung wunschgemäß aus.

Hierbei wurde verzichtet eine Sprachdatei einzubinden, die ggfl. die Mehrsprachigkeit ermöglicht. Statt dessen wurde der kleine Sprachtext hart im Script hinterlegt.

Zum zweiten Schritt - der Übergabe eines NON-SEF-URL an window.open()

Vorab ganz kurz noch eine Einfügung, die zu erwähnen evtl. nicht ganz unwichtig ist - der Vollständigkeit halber. Es gäbe neben dem nachfolgend beschriebenen Weg auch Alternativen um das Aufnehmen o.g. NON-SEF-ULSs durch die Suchmaschinen zu Verhindern. Man kann z.B.

  1. auch über die robots.txt bestimmt URLs verbieten, die erkennbare URL-Elemente enthalten (in unserem Fall alle URL mit com_mailto)
  2. auch im a Tag kann ein Attribut rel mit dem Inhalt nofollow einfügt werden, worauf die Suchmaschinen i.d.R. entspr. reagieren.
  3. Letztlich kann man - so zumindest bekannt für Google - auch z.B. über die Webmastertools URL durch Filter-Werte ausschließen.

Da ich aber eine Lösung avisiere, die zuverlässig und dann auch in allen Suchmaschinen funktioniert, praktiziere ich das in meinen Projekten wie hier beschrieben.

Zurück zur Umsetzung. Wir wollen nun also folgendes erreichen. Den Suchmaschinen wird im a-Tag über das Attribut href die einheitliche Link-URL Seite_weiterempfehlen.html angeboten. Das Mailto-Formular was dann aber aufgerufen wird, soll natürlich Seitenabhängig sein, und muss folglich o.g. ID erhalten, was ja mit unserem EinheitsURL nicht geht.

Das Mailto-Formular wird über eine JavaScript-Funktion window.open() aufgerufen, als größendimensionierte Flyingwindow. Übergeben werden muss diesen JS-Befehl natürlich ein Zielurl, wofür in der Originalfassung einfach this.href verwendet wird. Das ist in unserem modifizierten Fall natürlich Seite_weiterempfehlen.html.

Nun wollen wir erreichen, dass hier hier unser NON-SEF-URL verwendet wird.

Verantwortlich für die Ausgabe der Weiterempfehlen (recommended) Links in den Joomla-Beiträgen ist das Script components/com_content/helpers/icon.php. Dieses muss modifiziert werden wie nachfolgend beschrieben (Achtung! das ist eine JOOMLA-CORE-MODIFIKATION !).

Es gibt eine Methode mailto(), die das Weiterempfehle-Icon erzeugt. Hierbei wird wie oben beschrieben der komplette-Link-Tag mit a href (enthält den SEF-URL) und zum anderen die window.open()-JS-Funktion erzeugt. Die window.open()-Funktion bekommt als Ziel-URL this.href übergeben, also der URL, der im Attribut href übergeben wird – nun als SEF-URL. Diesen wollen wir ab nicht verwenden. Also muss this.href ersetzt werden durch die PHP-Variable $url, die etwas weiter oben erzeugt und befüllt wird mit dem NON-SEF-URL. Perfekt! Nun müssen wir eigentlich nur noch sicherstellen, dass dieser URL nicht durch das sh404SEF bei der Seitenerzeugung in ein SEF-URL umgewandelt wird. Das schaffen wir üblicherweise indem dem URL ein Slash vorangestellt wird.

Die Ursprungszeile im Script sieht so aus:

components/com_content/helpers/icon.php Methode mailto()
1
$attribs['onclick'] = "window.open(this.href,'win2','".$status."'); return false;";

Das komplett geänderte Konstrukt sieht dann so aus:

components/com_content/helpers/icon.php Methode mailto()
1
$attribs['onclick'] = "window.open('/".$url."','win2','".$status."'); return false;";

Nach diesen beiden Schritten sollte dann alles so funktionieren wie oben als Ziel formuliert.