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.
38 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…