Ein neues Plugin: Eine abstrakte Klasse für XML-Elemente

Weil es Spaß und Sinn macht: Eine abstrakte Klasse für XML-Elemente.

Der Vorteil einer abstrakten Klasse: Methoden, die sich nicht ändern, müssen nicht bei jeder abgeleiteten Klasse wiederholt im Code erscheinen. Es könnten auch Traits verwendet werden, jedoch sind sie nicht für den Fall gedacht, dass die Methoden zur gleichen Klassenhierarchie gehören.

ALeo_Sitemap_Xml

  1. <?php
  2. /*
  3. Hier werden bereits alle Methoden implementiert,
  4. die alle Klasssen vom Typ 'ILeo_Sitemap_Xml'
  5. gemeinsam haben.
  6. Author: Hermann J. Leopold
  7. Email: hermann.leopold@leopoldnet.de
  8. Date: 2017-02-08
  9. /*
  10. require_once('ILeo_Sitemap_Xml.php');
  11. abstract class ALeo_Sitemap_Xml implements ILeo_Sitemap_Xml
  12. {
  13. /* Hier muss bei den konkreten Klassen
  14. der Name aka Symbol zurück
  15. gegeben werden. /*
  16. protected abstract function getSymbol();
  17. /* Hier wird der Inhalt des Elements
  18. zurück gegeben. Da dies entweder
  19. Text oder andere Elemente sein
  20. können, muss auch diese Methode von
  21. jedem Element überschrieben werden.
  22. /*
  23. protected abstract function getContent();
  24. /* Mit den Attributen des Elements könnte
  25. man viel Spaß haben; eigene Klassen,
  26. schön mit addAttribute eine Liste
  27. hinzufügen...
  28. Da aber nur ein Element überhaupt
  29. Attribute hat, die dazu noch stets
  30. gleich sind, habe ich diese
  31. einfache Methode bevorzugt. /*
  32. protected function getAttributes()
  33. {
  34. // Gibt es Attribute, muss
  35. // diese Methode überschrieben
  36. // werden
  37. return '';
  38. }
  39. /* Hier die wichtige konkrete
  40. Klasse -> das Element wird erstellt /*
  41. public function toString()
  42. {
  43. // Die vielen Zeilen haben einen Grund:
  44. // Es sieht so besser im Blog aus.. 😄
  45. $sReturn = ILeo_Sitemap_Xml::csTagAuf . $this->getSymbol();
  46. $sReturn .= $this->getAttributes() . ILeo_Sitemap_Xml::csTagZu;
  47. $sReturn .= $this->getContent();
  48. $sReturn .= ILeo_Sitemap_Xml::csTagAuf;
  49. $sReturn .= '/' . $this->getSymbol();
  50. $sReturn .= ILeo_Sitemap_Xml::csTagZu;
  51. return $sReturn;
  52. }
  53. }

ALeo_Sitemap_Xml.php

Dank der getContent()-"Problematik" kann ich noch zwei abstrakte Klassen schreiben. Hurra – und ich sollte mal ein Klassendiagramm erstellen. Es könnte sich lohnen 😃

Ein neues Sitemap-Plugin muss her!

Eine Möglichkeit, einer Suchmaschine alle Seiten mitzuteilen, ist die Bereitstellung einer Datei namens sitemap.xml. Diese Datei wird von WordPress nicht automatisch erstellt; doch es gibt Plugins, die den Job erledigen. Da mir vor vielen Jahren keines gut gefiel, hatte ich ein eigenes geschrieben.

Der übliche Aufbau einer sitemap.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  3. <url>
  4. <loc>http://www.example.com/</loc>
  5. <lastmod>2005-01-01</lastmod>
  6. <changefreq>monthly</changefreq>
  7. <priority>0.8</priority>
  8. </url>
  9. </urlset>

Beispiel von sitemaps.org

Unterhalb von <url> ist nur das "loc"-Element Pflicht, und im alten Plugin hatte ich auf die optionalen Elemente verzichtet.

"changefreq" ist bei einem Blog sinnlos; auch glaube ich nicht, dass sich irgendeine Suchmaschine davon beeinflussen lässt.

"priority" ist schon berüchtigt für den Schindluder, der damit getrieben wurde. Daher denke ich nicht, dass sich Suchmaschinen dafür interessieren.

"lastmod" hingegen lässt sich ermitteln und könnte nützlich sein. Ich setze es mit auf die Todo-Liste.

Somit sieht die bisherige sitemap.xml reichlich langweilig aus:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  3. <url>
  4. <loc>http://leopoldnet.de/</loc>
  5. </url>
  6. <url>
  7. <loc>http://leopoldnet.de/impressum</loc>
  8. </url>
  9. <url>
  10. <loc>http://leopoldnet.de/start-meiner-website-als-blog</loc>
  11. </url>
  12. <url>
  13. <loc>http://leopoldnet.de/freezing-leafs</loc>
  14. </url>
  15. <!-- und so weiter -->

Die sitemap.xml von leopoldnet.de vom 28.01.2017

Und noch etwas fehlt: Die Übersichtsseiten der Schlagwörter und Kategorien – auf die Todo-Liste damit.

Die Bildererweiterung von Google

Google hat die sitemap.xml um Bildinformationen erweitert; da dies auf sitemaps.org nicht beschrieben wird, könnte es eine Eigeninitiative gewesen sein. Die Bilder müssen einer Seite zugewiesen werden; pro Seite sind 1000 Bilder erlaubt. Im Beispiel sähe es so aus:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  3. xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
  4. <url>
  5. <loc>http://ihrebeispielurl.de/beispiel.html</loc>
  6. <image:image>
  7. <image:loc>http://ihrebeispielurl.de/bild.jpg</image:loc>
  8. </image:image>
  9. <image:image>
  10. <image:loc>http://ihrebeispielurl.de/foto.jpg</image:loc>
  11. </image:image>
  12. </url>
  13. </urlset>

Beispiel von support.google.com

Sieht auch nicht besser aus, doch hier gibt es spannende, optionale Elemente:

<image:caption>

Dieses Element sieht Google für den Untertitel vor; WordPress wiederum hat ein Feld "Alternativtext". Auch ist das Feld "Beschriftung" denkbar.

<image:geo_location>

Anders als ich dachte, sind hier keine Koordinaten gewünscht, sondern der Ort als Klartext; zum Beispiel "Bremen, Deutschland". Leider stellt WordPress für Medien kein entsprechendes Feld zur Verfügung, die Information könnte ich unter "Beschreibung" einfügen, wobei eine Art Auszeichnung nötig wäre: loc{Bremen, Deutschland} oder so.

<image:title>

Hierfür scheint das Feld "Titel" wie geschaffen.

<image:license>

Sicher interessant, aber derzeit für mich nicht.

Ganz klar: Hier lassen sich deutlich mehr Informationen über die Sitemap übermitteln.

Die Todo-Liste

  • "lastmod" hinzufügen
  • Schlagwörter und Kategorien berücksichtigen
  • Bilder mit Beschreibungen hinzufügen

Dann mache ich mich mal an die Arbeit