Das Blogmodul verwaltet Fachbeiträge mit Titel, H1, Kurzfassung, Volltext, Kategorie und Schlagworten. Jeder Beitrag trägt einen Antwortkasten für die Kurzantwort, eine Liste mit Kernaussagen und einen FAQ-Block, der als FAQPage ausgezeichnet wird. …
Ein CMS, das fertiges HTML ausliefert
Kein Rendern bei jedem Aufruf, kein Plugin-Zoo, keine Paketverwaltung. SEO CMS baut aus einer MySQL-Datenbank statische Seiten – mit allem, was Suchmaschinen und Sprachmodelle brauchen, um einen Inhalt einzuordnen und einer Person zuzuschreiben.
Funktionen nach Bereich
Sechs Bereiche, von der Inhaltspflege bis zum Betrieb. Jeder Bereich erklärt, welche Aufgabe er löst und welche Funktionen dazugehören.
54 Einträge
Das Lexikon ist bewusst kein gekürzter Blog. Ein Eintrag besteht aus vier festen Teilen: einer Kurzantwort von zwei bis vier Sätzen, drei bis fünf prüfbaren Fakten, einer Einordnung für die Praxis und Verweisen auf verwandte Begriffe. Die Kurzantwor…
Über jedem Beitrag, jeder Übersicht und jedem Lexikoneintrag steht ein Kasten mit der Kurzantwort und bis zu fünf Stichpunkten. Er ist die wichtigste GEO-Funktion des Systems, weil er genau die Form erzwingt, die Sprachmodelle übernehmen können: ein…
Jede Seite trägt einen einzigen JSON-LD-Block mit einem Graph, dessen Knoten über stabile Kennungen aufeinander verweisen: Die Seite gehört zur Website, der Artikel hat einen Autor, der Autor arbeitet für eine Organisation, die Organisation hat Prof…
Die llms.txt fasst für Sprachmodelle zusammen, worum es auf der Website geht, welche Seiten zentral sind, unter welchen Bedingungen zitiert werden darf und wer redaktionell verantwortlich ist. Sie ist ein Vorschlag der Gemeinschaft und kein verabsch…
Jede schreibende Person bekommt eine eigene Seite mit Berufsbezeichnung, Kurzvorstellung, ausführlicher Beschreibung, Fachgebieten und Belegen. Die Fachgebiete werden als knowsAbout ausgezeichnet, die Belege dürfen einen Verweis tragen. Jeder Beitra…
Das Verzeichnis verwaltet gleichartige Einträge mit Name, Betreiber, Beschreibung, Leistungen, Schwerpunkten und Kontaktangaben. Jeder Eintrag bekommt eine eigene Seite, erscheint auf der Startseite als Karte und auf der zugehörigen Themenseite. Auf…
Auf einer Installation laufen beliebig viele Websites – jede mit eigener Domain, eigener Datenbank, eigenen Inhalten und eigenem Erscheinungsbild. Gemeinsam sind Programmcode und Vorlagen, sodass eine Aktualisierung für alle Projekte gleichzeitig wi…
Ein Lauf erzeugt sämtliche Seiten neu: Startseite, Verzeichnis, Themenseiten, Blog, Lexikon, Autorenprofile, Bestenliste, statische Seiten, Fehlerseiten, Sitemap, Feed, robots.txt und llms.txt. Aufrufbar aus dem Backend oder auf der Kommandozeile, f…
Impressum, Datenschutz, Kontakt und weitere Einzelseiten liegen als Datensätze in der Mandantendatenbank und sind im Backend pflegbar. Das ist kein Komfortdetail: Impressum und Datenschutzerklärung müssen je Domain eigenständig sein, und niemand sol…
Themenseiten bündeln Einträge nach einem Merkmal – klassisch nach Stadt, hier nach Bereich. Jede Seite trägt einen eigenen redaktionellen Text und einen Sichtbarkeitsschalter, damit eine Seite erst dann öffentlich wird, wenn sie etwas zu zeigen hat.…
Jeder Beitrag, jede Übersichtsseite und die Bestenliste können einen FAQ-Block tragen. Die Fragen erscheinen sichtbar auf der Seite und werden zusätzlich als FAQPage ausgezeichnet. Sichtbar ist dabei keine Formalie, sondern Voraussetzung: Auszeichnu…
Jede Seite bekommt Canonical, vollständige OpenGraph-Angaben inklusive Alternativtext für das Vorschaubild, Twitter-Angaben und bei Beiträgen die article-Felder mit Zeitzone. Der Markenzusatz im Titel wird nur angehängt, wenn der Titel dadurch nicht…
Die sitemap.xml entsteht bei jedem Build und enthält alle erzeugten Adressen mit Änderungsdatum, Änderungshäufigkeit und Priorität. Das Änderungsdatum bezieht sich auf den Inhalt, nicht auf den Bauvorgang – wer bei jedem Lauf das aktuelle Datum eint…
Die zuletzt veröffentlichten Beiträge stehen als RSS unter /blog/feed.xml bereit, verwiesen aus dem Kopfbereich jeder Seite. Feeds gelten als überholt, sind es aber nicht: Sie sind der einfachste Weg, andere Systeme über Neuigkeiten zu informieren, …
Die robots.txt wird bei jedem Build neu geschrieben und richtet sich nach dem Indexierungsschalter des Mandanten: Solange er aus ist, steht dort Disallow für alles. Zusätzliche Zeilen und eine Liste ausdrücklich erlaubter Bots lassen sich im Backend…
Adressen kommen ohne Dateiendung aus, HTTPS wird erzwungen, www wird entfernt, abschließende Schrägstriche werden bereinigt und Index-Duplikate werden auf die Verzeichnisadresse umgeleitet. Alles läuft über dauerhafte Weiterleitungen, sodass derselb…
Statt einer Textwiese gibt es im Backend je bekanntem Profildienst ein eigenes Feld. Damit ist auf einen Blick erkennbar, was noch fehlt, und es landen keine Tippfehler in den strukturierten Daten. Gespeichert wird trotzdem alles in einer Liste, ein…
Beiträge und Lexikoneinträge sind über eine Kennung mit dem Autorenprofil verbunden, nicht über einen Namen im Freitext. Wo eine Altinstallation nur den Namen kennt, wird die Kennung daraus abgeleitet, sodass nichts verlorengeht. Im JSON-LD entsteht…
Veröffentlichungs- und Änderungsdatum stehen im JSON-LD, in den OpenGraph-Angaben, im RSS und in der Sitemap – jeweils mit Zeitzone. Ohne gesetzte Zeitzone macht PHP aus einer Datenbankzeit stillschweigend UTC; im Sommer ist das Ergebnis eine Stunde…
Autorenprofile liegen je Mandant in dessen eigener Datenbank. Wer dieselbe Person auf zwanzig Portalen schreiben lässt, müsste das Profil zwanzigmal anlegen. Zwei Werkzeuge nehmen das ab: Das eine kopiert Profile aus einem Quellmandanten in alle übr…
Herausgeber, Website, E-Mail und Telefon werden als Organisation ausgezeichnet und mit den Autorenprofilen und Beiträgen verknüpft. Telefonnummern werden dabei in eine wählbare Form gebracht: Leerzeichen sind in einer tel-Adresse nicht erlaubt, deut…
Ein öffentliches Formular nimmt Einsendungen entgegen. Sie landen auf pending und erscheinen nirgends, bis sie im Backend freigegeben werden. Drei Vorkehrungen halten Automaten draußen: ein verstecktes Feld, das nur Programme ausfüllen, eine Mindest…
Ein redaktionelles Ranking mit Kurzurteil, ausführlicher Begründung, Stärken und vier Teilbewertungen, aus denen sich die Gesamtnote als Mittelwert ergibt. Die Bezeichnung der ersten Spalte ist frei wählbar. Der Methodikabschnitt steht sichtbar auf …
Die Suche auf der Startseite arbeitet im Browser gegen eine Datei, die beim Bauen entsteht. Keine Suchanfrage geht an den Server. Es gibt keinen Suchdienst zu betreiben, nichts, was ausfallen könnte, und keine Suchanfragen, die irgendwo protokollier…
Bestehende Bestände lassen sich als CSV einlesen und wieder ausgeben. Das ist der Weg für die Übernahme aus einem Altsystem und für Sicherungen außerhalb der Datenbank. Der Export eignet sich außerdem für die Massenpflege in einer Tabellenkalkulatio…
Welcher Mandant bedient wird, entscheidet der Hostname der Anfrage. Die Weiche ist generisch: Jede künftige Subdomain wird automatisch aufgelöst, ohne dass die Konfiguration erneut angefasst werden muss. Für eine zusätzliche eigene Domain genügt ein…
Damit aus „Agentur“ ein „Shop“, ein „Anbieter“ oder – wie hier – eine „Funktion“ wird, läuft die fertige Ausgabe durch einen zentralen Begriffsfilter. Ergebnis: identisches Design, identischer Aufbau, eigenes Vokabular. Ohne diesen Filter müsste man…
Ein Mandant kann als Portal arbeiten und die übrigen bündeln. Er liest die Stammdaten jedes installierten Projekts direkt aus dessen Datenbank und schreibt sie als Eintrag und als Position in die eigene Liste fort. Jedes neu installierte Projekt ers…
Ab dem zweiten Mandanten lohnt die zentrale Verwaltung: ein Benutzer, ein Passwort, ein Präfix – der Datenbankname ergibt sich aus Präfix und Schlüssel. Einzelne Projekte lassen sich davon ausnehmen und auf ein eigenes Konto legen. Wo ein Provisioni…
Das Backend deckt den gesamten Alltag ab: Einträge, Beiträge, Lexikon, Autorenprofile, statische Seiten, Bestenliste und sämtliche Einstellungen. Die Einstellungen sind nach Themen gegliedert und mit Erklärungen versehen, sodass erkennbar ist, was e…
Startinhalte eines Mandanten können als Datei vorliegen: Einstellungen, Seiten, Themenseiten, Beiträge, Lexikon, Autoren, Verzeichnis und Bestenliste in einem Array. Beim Bauen werden neue Datensätze nachgezogen, vorhandene bleiben unberührt – der A…
Neue Mandanten stehen auf nicht indexierbar. Solange gilt: noindex auf jeder Seite, Disallow für alles in der robots.txt, keine llms.txt. Erst wenn echter Inhalt da ist, wird umgeschaltet und neu gebaut. Der Schalter greift an allen Stellen gleichze…
Datenbankzugriffe laufen ausschließlich über vorbereitete Anweisungen, Formulare tragen ein CSRF-Token, Passwörter liegen als bcrypt-Hash vor, und nach fünf Fehlversuchen greift eine Anmeldesperre. Konfiguration, Vorlagen und Programmcode sind von a…
Alle Textkontraste liegen bei mindestens 4,5:1 und erfüllen damit WCAG-Stufe AA. Die Akzentfarbe eines Mandanten wird beim Bauen automatisch in zwei kontrastsichere Varianten abgeleitet: eine für Text auf Weiß, eine für Text auf der Farbfläche. Dami…
Schriften werden vom eigenen Server ausgeliefert, nicht von einem Drittanbieter. Das erspart eine datenschutzrechtliche Diskussion und einen zusätzlichen Verbindungsaufbau. Die Hauptschrift wird vorgeladen, damit kein Textaustausch das Layout versch…
Jeder Mandant kann ein eigenes Vorschaubild haben; fehlt es, greift ein gemeinsames. Fehlt auch das, entfallen die Bildangaben ganz – ein Vorschaubild mit fremder Marke ist schlechter als keines. Für die Erzeugung liegt ein Hilfsskript bei, das aus …
Nach jedem Build meldet das System Verzeichnisse, die zu keiner aktuellen Adresseinstellung mehr gehören und denselben Inhalt unter einer zweiten Adresse ausliefern würden. Gelöscht wird nichts: Unter dem Ausgabeverzeichnis können auch übernommene A…
Jeder Beitrag trägt genau eine Kategorie und beliebig viele Schlagworte. Die Kategorie ordnet ein, die Schlagworte verbinden – das ist bewusst getrennt, weil eine Sache an einer Stelle steht, aber zu vielen Themen gehören kann. In der Übersicht läss…
Alle veröffentlichten Profile stehen zusätzlich auf einer Übersichtsseite mit Name, Rolle, Kurzvorstellung und Fachgebieten. Für Portale mit mehreren Schreibenden ist das die Seite, auf die eine Redaktionsangabe verweisen kann. Bei einem einzelnen A…
Neben Startseite und Themenseiten gibt es eine alphabetische Gesamtübersicht unter einer eigenen Adresse. Sie ist die Seite, auf die interne Verweise zeigen können, wenn kein bestimmter Bereich gemeint ist, und der zuverlässigste Weg für Suchmaschin…
Mandanten lassen sich im Backend anlegen, einsehen und einzeln bauen, ohne dass jemand an Konfigurationsdateien muss. Neu angelegte Projekte landen dabei in einer Datendatei, nicht in einer PHP-Datei – eine vom Webserver beschreibbare PHP-Datei im A…
Stylesheets, Skripte, Schriften und Symbole liegen einmal zentral und werden von allen Projekten genutzt. Eine Datei mit gleichem Namen im Mandantenverzeichnis hat Vorrang – so lassen sich Vorschaubild, Favicon oder das Web-App-Manifest je Projekt ü…
Eine Seite im Backend führt der Reihe nach über jeden Mandanten: Einstellungen abgleichen, bauen, aufräumen. Abgleich und Aufräumen laufen dabei zunächst im Trockenlauf – sie zeigen an, ohne zu ändern. Jeder Schritt läuft in einem eigenen Prozess, w…
Ein eigenständiges Skript prüft, ob die Konfiguration gefunden und geladen wird, ob das Token gesetzt ist und wo genau eine Abweichung liegt – ohne den Wert im Klartext auszugeben. Es beantwortet die Frage, die bei jeder gescheiterten Einrichtung zu…
Aus den Zwischenüberschriften eines Beitrags entsteht beim Bauen ein Inhaltsverzeichnis mit Sprungzielen. Jeder Abschnitt bekommt damit eine eigene Adresse und lässt sich einzeln verlinken – von außen, aus einem anderen Beitrag oder aus dem Lexikon …
Jeder Inhaltstyp kennt einen Status. Beiträge, Lexikoneinträge und Autorenprofile sind Entwurf, bis sie freigegeben werden; eingesandte Verzeichniseinträge landen auf Prüfung; Themenseiten haben einen eigenen Sichtbarkeitsschalter. Entwürfe werden g…
Die Module verweisen aufeinander, statt nebeneinander zu stehen: Lexikoneinträge nennen verwandte Begriffe, Beiträge führen ins Lexikon, Bereichsseiten auf ihre Nachbarn, Autorenprofile auf ihre Beiträge und zurück. Entscheidend ist, was dabei nicht…
Jede Unterseite trägt oben einen Pfad zurück zur Startseite und im JSON-LD dieselbe Abfolge als BreadcrumbList. Beides kommt aus derselben Quelle, kann also nicht auseinanderlaufen. Das letzte Glied bleibt ohne Verweis – ein Link auf die Seite, auf …
Wer eine Seite auf den Startbildschirm legt, sieht darunter den Namen aus dem Web-App-Manifest. Eine gemeinsame Datei für alle Mandanten führt hier zwangsläufig zum falschen Ergebnis: Ein Projekt bekommt den Namen eines anderen. Deshalb entsteht das…
Die drei Fehlerseiten sind gewöhnliche Inhaltsseiten und im Backend pflegbar – mit Hinweisen, die zum Projekt passen, statt einer Standardmeldung des Webservers. Sie tragen immer noindex. Wichtiger ist der Rückfall: Solange ein Mandant noch nicht ge…
Für die Auswertung ist eine Matomo-Einbindung vorgesehen, die beim Laden ausdrücklich die Cookies abschaltet. Damit entfällt der Einwilligungsbanner, und es entsteht kein wiedererkennbares Profil über Besuche hinweg. Adresse und Kennung stehen je Ma…
Alle Einstellungen sind nach Themen gegliedert und tragen je Feld eine Erklärung, was der Wert bewirkt – nicht nur, wie er heißt. Der Unterschied zeigt sich beim zweiten Projekt: Eine Liste aus achtzig Schlüsseln ohne Erläuterung ist nach drei Monat…
Automatische Zertifikate brauchen einen Prüfpfad, der jederzeit unverschlüsselt und ohne Weiterleitung erreichbar ist. In einer Installation, die jeden Aufruf auf HTTPS zwingt und in Mandantenverzeichnisse umschreibt, ist genau das die Stelle, an de…