ich traue mich mal, mein zweites Thema aufzumachen.
![grinsen :D](./images/smilies/grinsen.gif)
Vor einiger Zeit habe ich mit Werner über seinen Vorschlag für einen Sitemap-Generator gesprochen.
Über Sitemap-Dateien gibt es ja durchaus geteilte Ansichten, ob sie für SEO nun Sinn machen oder nicht. Ich bin der Ansicht, auf jeden Fall können sie nicht schaden und ihre Dateigröße spielt keine Rolle. (Ich weiß, Anfang der 90er hätte ich das anders gesehen.) Wie sie von den verschiedenen Suchmaschinen bewertet werden, weiß ohnehin keiner (den ich kenne).
Ich habe auf Grundlage von Werners Script etwas weitergearbeitet. So viel ist zwar nicht übrig geblieben, aber ich hoffe, dass ich nicht gesteinigt werde, weil ich es hier veröffentliche.
Das Script ist weiterhin rekursiv, es können aber auch (mehrere) parallel liegende Unterverzeichnisse angegeben oder einzelne Verzeichnisse ausgeschlossen werden.
Dateien mit META-Tag 'noindex' werden nicht mehr in die sitemap.xml aufgenommen. Es können mehrere Vorzeichen und mehrere auszuschließende Dateinahmen angegeben werden. (Ich glaube, Vorzeichen ging vorher nur eines.) Nutzt man mehrere VHOST auf seinem Server, muss das Script nicht in jedem VHOST gespeichert werden sondern nur ein mal, mit einem konfigurierten Alias. So kann das Script von jedem VHOST aus aufgerufen werden, liest aber nur das DocumentRoot des jeweiligen VHOST und speichert die sitemap.xml auch dort.
Hier meine Anpassung des sitemap_generator Script, der eine oder andere kann es womöglich gebrauchen.
Viele Grüße
Detlef Paschke
Code: Alles auswählen
<!DOCTYPE html>
<html lang="de">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
<title>Sitemap-Generator</title>
<meta content="Sitemap-Generator" name="description">
<meta name="robots" content="noindex,nofollow">
</head>
<body>
<h1>Sitemap-Generator</h1>
<?php
/* URL der Webseite
Hier muss nur das verwendete Protokoll (http oder https) angepasst werden.
Die Seiten-URL wird automatisch vom Server ermittelt. */
$url = "http://" . $_SERVER['SERVER_NAME'];
/* Die zu durchsuchenden Verzeichnisse eintragen.
Das DocumentRoot der URL wird mit $_SERVER['DOCUMENT_ROOT'] automatisch ermittelt.
Verzeichnisse werden rekursiv (inkl. Unterverzeichnis) durchsucht.
Soll nur ein oder mehrere parallel liegende Unterverzeichnisse durchsucht werden,
dann diese entsprechend dem Beispiel angeben. */
$verzeichnisse = array(
$_SERVER['DOCUMENT_ROOT'],
//$_SERVER['DOCUMENT_ROOT'] . "/archiv",
);
/* Verzeichnisse, die von der rekursiven Suche ausgeschlossen werden sollen. */
$nicht_durchsuchen = array(
$_SERVER['DOCUMENT_ROOT'] . "/privat",
$_SERVER['DOCUMENT_ROOT'] . "/geheim",
);
/* Dateitypen die in die Sitemap-Datei aufgenommen werden sollen. */
$dateiendungen = array(
"htm",
"html",
"php",
//"xml",
);
/* Vorzeichen von Dateien, die nicht in die Sitemap-Datei aufgenommen werden sollen.
z.B. _intern.htm oder .login.php */
$vorzeichen = array(
//".",
//"_",
);
/* Einzelne Dateien die nicht in die Sitemap-Datei aufgenommen werden sollen */
$ausschluss = array(
"google6a5646a0162ac22a.html",
"muster.html",
);
/* Dateiname und Pfad der Sitemap-Datei.
Eine Sitemap-Datei sitemap.xml wird im DocumentRoot der URL gesucht.
Veränderungen sind hier nicht oder nur zu Testzwecken nötig. */
$sitemap = $_SERVER['DOCUMENT_ROOT'] . "/sitemap.xml";
/* ### Ende der Konfiguration ### */
$eintraege = 0;
// Verzeichnisse durchsuchen
class dirfilter extends RecursiveFilterIterator
{
public function accept()
{
global $nicht_durchsuchen;
foreach ($nicht_durchsuchen as $exPath) {
if (strpos($this->current()->getPath(), $exPath) !== false) {
return false;
}
}
return true;
}
}
foreach ($verzeichnisse as $verzeichnis) {
$dirIterator = new RecursiveDirectoryIterator(
$verzeichnis,
FilesystemIterator::NEW_CURRENT_AND_KEY |
FilesystemIterator::FOLLOW_SYMLINKS
);
$filter = new dirfilter($dirIterator);
$fileinfos = new RecursiveIteratorIterator($filter);
// Nach Ausschlüssen filtern.
foreach ($fileinfos as $pathname => $fileinfo) {
if (
in_array($fileinfo->getExtension(), $dateiendungen) &&
str_replace( $vorzeichen,'', substr($fileinfo->getFilename(), 0, 1)) &&
!in_array($fileinfo->getFilename(), $ausschluss) &&
// Dateien mit dem META-Tag 'noindex' werden nicht aufgenommen.
!preg_grep('/noindex/', get_meta_tags($fileinfo))
) {
$links[
$url . str_replace([$_SERVER['DOCUMENT_ROOT']], '', $fileinfo->getPathname())
] = $fileinfo->getMTime();
}
}
}
// Kopf der Sitemap-XML-Datei erstellen.
$xml =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<urlset
xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">
<url>
<loc>" . $url . "/</loc>\n";
foreach ($links as $link => $alter) {
$seitenalter[] = $alter;
}
rsort($seitenalter);
$xml .=
"<lastmod>" . date("c", $seitenalter[0]) . "</lastmod>
</url>\n";
// Dateien in Sitemap-Datei hinzufügen.
foreach ($links as $link => $alter) {
$xml .=
"<url>\n<loc>" . $link . "</loc>
<lastmod>" . date("c", $alter) . "</lastmod>
</url>\n";
$eintraege++;
}
// Sitemap-Datei schließen.
$xml .= "</urlset>";
if ($eintraege == 0) {
echo "<p>Es wurden keine Einträge gefunden!</p>";
}
else {
// Sitemap-Datei abspeichern und Information ausgeben.
$sitemaplink = $url . str_replace([$_SERVER['DOCUMENT_ROOT']], '', $sitemap);
// Alte Sitemap-Datei löschen wenn vorhanden.
if (file_exists($sitemap)) {
if (unlink($sitemap)) {
echo "<p>Die vorhandene Sitemap-Datei " . $sitemaplink . " wurde gelöscht.</p>";
}
else {
echo "<p>Fehler beim löschen der Datei " . $sitemaplink . "!</p>";
exit;
}
}
// Neue Sitemap-Datei speichern.
if (file_put_contents($sitemap, $xml) == true) {
echo "<p>Eine neue Datei <a href='" . $sitemaplink . "' target='_blank'>" . $sitemaplink . "</a> wurde mit diesen " .
$eintraege . " Einträgen erstellt:</p>";
foreach ($links as $link => $alter) {
echo $link . "<br>";
}
}
else {
echo "<p>Fehler beim erstellen der Datei '" . $sitemaplink . "'!</p>";
}
}
?>
</body>
</html>