Sitemap-Generator

PHP, CSS und JavaScript lernen. Anwendungen für Webseiten
schabau
Mitglied (Level 5)
Mitglied (Level 5)
Beiträge: 43
Registriert: Do 25. Aug 2022, 13:24
Wohnort: Cottbus
Kontaktdaten:

Sitemap-Generator

Ungelesener Beitrag von schabau »

Hallo an alle,
ich traue mich mal, mein zweites Thema aufzumachen. :D

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>
Das "Zitat des Augenblicks" gibt es nur auf
http://schabau.eu
Meine "Merkzettel"
http://helpdesk.schabau.eu
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5744
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Sitemap-Generator

Ungelesener Beitrag von Tommy Herrmann »

Hallo Detlef,

vielen Dank für Deinen Beitrag - das gefällt, wenn mal jemand kreativ mitdenkt :tu:

Ich habe mich nie mit Sitemaps beschäftigt, da ich ja meine Seiten immer nur als Hobby betrieben habe und auch ohne Sitemap immer ganz oben zu finden bin oder auch auf Platz 1.
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 11 Gäste