Vorher
Zum Monatsende müssen Sie aufschreiben, was Sie getan haben, und graben es aus Git-Historie und Gedächtnis heraus.
Nachher
Die datierte Aufzeichnung liegt bereits auf der Website der Kundschaft. Sie öffnen sie.
Sie betreuen Websites, die Ihnen nicht gehören. Dieses Plugin wird auf der Website Ihrer Kundschaft installiert, führt eine datierte Aufzeichnung von Updates, Anmeldungen und Änderungen, zählt, was die Datenbank still füllt, und gibt der Kundschaft einen Bildschirm, der die Frage "läuft meine Website?" beantwortet. Pro ergänzt GA4-Zugriffszahlen, Uptime, einen gebrandeten PDF-Bericht nach Zeitplan und White Labelling. Das Ganze wurde um eine Bedingung herum geschrieben: Es darf das Dashboard der Kundschaft nicht verlangsamen.
Einmal im Monat fragt jemand, was Sie eigentlich getan haben, und Sie rekonstruieren es aus der Git-Historie, dem Update-Bildschirm und Ihrem Gedächtnis. Gleichzeitig hat Ihre Kundschaft ein komplettes WordPress-Dashboard, um das sie nie gebeten hat und das sie nicht lesen kann. Dieses Plugin führt die Aufzeichnung auf der Website der Kundschaft und gibt ihr einen Bildschirm statt des Rests.
Weil es auf einer fremden Website läuft, steht eine Bedingung über allem: Es darf das Dashboard dort nicht verlangsamen. Daraus folgen drei Entscheidungen. Ein abgeschaltetes Modul wird gar nicht erst geladen — die Registry hält Klassennamen statt Instanzen, und nur ein aktives Modul wird überhaupt erzeugt. Das Portal fragt nie live ab; jede Zahl stammt aus einem zwischengespeicherten Snapshot, und die Seite wird serverseitig in PHP gerendert, ohne REST-Aufruf und ohne JavaScript. Und die schwere Arbeit läuft im Cron hinter einem Lock: Ein PDF zu bauen ist hier das Teuerste und passiert nie während eines Seitenaufrufs.
Das Plugin hat sieben Module, und alle liegen in diesem Paket: ein Aktivitätsprotokoll mit indizierter Tabelle und geplanter Bereinigung, eine Datenbankprüfung, die zuerst nur zählt und ausschließlich löscht, was Sie ankreuzen, das Kundenportal, GA4-Zugriffszahlen über ein Dienstkonto, Uptime, geplante PDF-Berichte und White Labelling für das Plugin, die Berichte und auf Wunsch das Dashboard selbst.
Die persische PDF-Ausgabe stimmt tatsächlich, und das wurde mit den Augen geprüft statt angenommen: Ein Bericht wurde erzeugt, in ein Bild umgewandelt und angesehen. Vazirmatn liegt im Paket und ist mit aktiviertem OpenType-Layout registriert, und genau diese eine Einstellung sorgt dafür, dass sich die arabischen Buchstaben verbinden — das, was die meisten Plugins vergessen. Die Ausgabe ist rechtsbündig, gemischte persisch-lateinische Zeilen lesen sich korrekt, und Seitenzahlen sind auf LTR festgelegt, damit aus "1 / 2" nicht "2 / 1" wird.
Uptime können Sie von UptimeRobot oder Better Stack beziehen, oder Sie richten irgendeinen Cron auf den Heartbeat-Endpunkt. Dieser Endpunkt ist die einzige öffentliche Route des Plugins und authentifiziert sich per HMAC-SHA256 über einen Zeitstempel, verglichen mit hash_equals, innerhalb eines Fensters von einer Minute, wobei Zeitstempel aus der Zukunft abgelehnt werden. Wichtiger noch: Jede signierte URL funktioniert genau einmal. Ohne das könnte jede Person, die eine Heartbeat-URL im Serverlog sieht, sie wiederholen und einen echten Ausfall verdecken.
Vorher
Zum Monatsende müssen Sie aufschreiben, was Sie getan haben, und graben es aus Git-Historie und Gedächtnis heraus.
Nachher
Die datierte Aufzeichnung liegt bereits auf der Website der Kundschaft. Sie öffnen sie.
Vorher
Die Kundschaft hat das gesamte WordPress-Dashboard, versteht nichts davon und ruft bei Ihnen an.
Nachher
Ein Bildschirm: Gesundheitswert, offene Updates, belegter Speicher, jüngste Aktivität und Ihr Kontakt.
Vorher
Die Kundschaft sagt, die Website sei am Dienstag nicht erreichbar gewesen, und Sie haben keine Zahl dagegenzuhalten.
Nachher
Ein Uptime-Wert, aus Ihrem Monitoring-Dienst oder aus einem signierten Heartbeat, der sich nicht wiederholen lässt.
Aktivieren Sie das Plugin auf der Website der Kundschaft und kreuzen Sie im Bildschirm Client Reporting die gewünschten Module an. Was aus bleibt, lädt seine Datei gar nicht erst.
Legen Sie in den Einstellungen fest, welche Rolle das Kundenportal öffnen darf, und tragen Sie Ihre Supportdaten ein. Ab diesem Moment hat die Kundschaft einen Bildschirm.
Tragen Sie in Pro Ihr Branding ein, stellen Sie den Rhythmus auf wöchentlich oder monatlich und nennen Sie die Empfänger. Der Rest läuft im Cron.
Webdesign-Agenturen · freiberufliche Website-Betreuung · WordPress-Supportteams · Hoster mit Managed-Paketen · Digitalstudios · WordPress-Beratung · alle mit einem monatlichen Wartungsvertrag, die am Monatsende etwas vorzeigen müssen.
Alles steckt im Plugin selbst. Kein Composer zur Laufzeit, kein Cloud-Dienst, kein Zusatz-Plugin.
Ein abgeschaltetes Modul wird nicht geladen, das Portal liest einen zwischengespeicherten Snapshot, und die PDF-Erzeugung läuft im Cron hinter einem Lock. Admin-CSS und -JS laden nur auf den eigenen Bildschirmen des Plugins, und jQuery kommt nicht vor.
Eine datierte Aufzeichnung von Core-, Plugin- und Theme-Updates, Anmeldungen und Fehlanmeldungen, Anlegen, Löschen und Rollenwechsel von Benutzerkonten, beobachteten Einstellungen und Veröffentlichungen. Jeder Eintrag trägt eine Schwere.
Beitragsrevisionen, liegengebliebene Entwürfe, Papierkorb, Spam-Kommentare, abgelaufene Transients und verwaiste Metadaten. Sie sehen zuerst die Zahlen; gelöscht wird erst, wenn Sie ankreuzen und bestätigen.
Ein Bildschirm mit Gesundheitswert, offenen Updates, belegtem Speicher, jüngster Aktivität und Ihren Kontaktdaten. Serverseitig gerendertes PHP — kein REST-Aufruf, kein JavaScript, kein Spinner.
Das Plugin zu verwalten und das Portal zu sehen sind zwei verschiedene Fragen. Sie wählen die Rolle, die das Portal erhält, und beide Entscheidungen lassen sich per Filter überschreiben.
Sitzungen, Nutzer, Seitenaufrufe und meistbesuchte Seiten über ein Google-Dienstkonto. Das Plugin signiert sein JWT selbst, deshalb liegt kein Google-SDK im Paket.
Von UptimeRobot oder Better Stack mit Ihrem eigenen Schlüssel, oder aus einem Heartbeat, den jeder Cron senden kann. Eine Lücke von mehr als dem Doppelten Ihres eingestellten Intervalls zählt als Ausfall.
HMAC-SHA256 über den Zeitstempel, verglichen mit hash_equals, in einem Fenster von einer Minute, Zeitstempel aus der Zukunft werden abgelehnt. Jede signierte URL wird genau einmal angenommen, eine Wiederholung kann also keinen echten Ausfall verdecken.
Wöchentlich oder monatlich, per E-Mail an die von Ihnen benannten Empfänger. Die Dateien liegen mit zufälligem Dateinamen in einem geschützten Ordner, und ein Download verlangt Berechtigung und Nonce.
Vazirmatn liegt im Paket und ist mit aktiviertem OpenType-Layout registriert, und genau das verbindet die Buchstaben. Die Ausgabe ist rechtsbündig, Seitenzahlen sind auf LTR festgelegt. Geprüft, indem das PDF in ein Bild umgewandelt und angesehen wurde.
Ihr Agenturname, Logo und Ihre Farbe auf dem Plugin und den Berichten, auf Wunsch auch auf dem Dashboard der Kundschaft: Login-Logo, Admin-Fußzeile und das Plugin ganz vor der Kundschaft verbergen.
Der private Schlüssel des GA4-Dienstkontos und der Monitoring-API-Schlüssel werden pro Modul deklariert, aus jeder REST-Antwort entfernt und als reine Schreibfelder gerendert. Eine leere Eingabe bedeutet: den gespeicherten Wert behalten.
Mehr als dreißig dokumentierte Actions und Filter in docs/hooks.md. Ihr Modul ist eine Klasse, die über den Filter hd_wlcr_register_modules registriert wird, und nur deren boot-Methode darf Hooks registrieren.
| Funktion | Beschreibung | Enthalten |
|---|---|---|
| Datiertes Aktivitätsprotokoll | Core-, Plugin- und Theme-Updates sowie Theme-Wechsel | |
| Anmeldungen und Fehlanmeldungen | Fehlversuche werden vor dem Schreiben begrenzt | |
| Benutzeränderungen protokolliert | Anlegen, Löschen und Rollenwechsel | |
| Beobachtete Einstellungen | Eine Liste, die Sie über hd_wlcr_watched_options ändern | |
| Indizierte Protokolltabelle | Vier kombinierte Indizes passend zu den Abfragen des Plugins | |
| Geplante Protokollbereinigung | Standardmäßig neunzig Tage Aufbewahrung, einstellbar | |
| Schwere je Ereignis | Damit sich die wichtigen einzeln lesen lassen | |
| Zählen vor dem Löschen | Nichts wird entfernt, bevor Sie ankreuzen und bestätigen | |
| Bereinigung hinter einem Lock | Zwei Admins können nicht gleichzeitig dieselbe Bereinigung starten | |
| Behaltene Revisionen je Beitrag | Standardmäßig fünf, bis zu fünfzig | |
| Serverseitig gerendertes Portal | Kein REST-Aufruf, kein JavaScript, kein Spinner | |
| Zwischengespeicherter Gesundheits-Snapshot | Fünfzehn Minuten, änderbar über hd_wlcr_health_ttl | |
| Begrenzter Medien-Durchlauf | Fünfzigtausend Dateien, eine Stunde zwischengespeichert | |
| Rolle für das Portal wählen | Standardmäßig Redakteur, per Filter überschreibbar | |
| GA4 über ein Dienstkonto | Das Plugin signiert sein JWT selbst, kein Google-SDK im Paket | |
| Uptime aus einem Monitoring-Dienst | UptimeRobot oder Better Stack mit Ihrem eigenen Schlüssel | |
| Signierter Heartbeat | HMAC-SHA256 über einen Zeitstempel, verglichen mit hash_equals | |
| Jede signierte URL einmal verbraucht | Eine Wiederholung derselben URL wird abgelehnt | |
| Zeitstempel aus der Zukunft abgelehnt | Niemand kann gültige URLs auf Vorrat erzeugen | |
| Gebrandete PDF-Berichte | Wöchentlich oder monatlich, Zustellung per wp_mail | |
| Vazirmatn im Paket | Mit useOTL registriert, damit sich arabische Buchstaben verbinden | |
| Seitenzahlen auf LTR festgelegt | "1 / 2" erscheint nicht als "2 / 1" | |
| Getrimmtes, mitgeliefertes mPDF | Eigener Autoloader, kein Composer zur Laufzeit | |
| Geschützter Berichtsordner | Zufälliger Dateiname und ein Download mit Berechtigung und Nonce | |
| White Labelling | Agenturname, Logo, Farbe, Fußzeile und Login-Logo | |
| Geheimfelder nur beschreibbar | Aus jeder REST-Antwort entfernt | |
| Mehr als dreißig Hooks | Alle in docs/hooks.md dokumentiert | |
| Vollständige persische Übersetzung | pot-, po- und mo-Dateien liegen bei | |
| Daten werden nur auf Wunsch gelöscht | Eine Einstellung, die standardmäßig aus ist |
| Punkt | Minimum |
|---|---|
| WordPress | 6.2 oder neuer, getestet bis 6.8 |
| PHP | 8.0 bis 8.3 |
| WordPress-Cron | Nötig für geplante Berichte und die Protokollbereinigung; auf einer wenig besuchten Website ist ein echter Server-Cron zuverlässiger |
| Upload-Ordner | Beschreibbar — die PDF-Berichte entstehen in einem geschützten Unterordner |
| Externe Dienste | Nur wenn Sie möchten: ein Google-Dienstkonto für GA4 und ein Konto bei UptimeRobot oder Better Stack für Uptime. Der Heartbeat braucht überhaupt kein Konto |
Ja. Das Kriterium ist, ob Sie Websites betreuen, die Ihnen nicht gehören. Das Plugin wird auf jeder Kundenwebsite einzeln installiert und führt die Aufzeichnung dort. Das Aktivitätsprotokoll beantwortet für sich genommen die Frage nach dem, was Sie diesen Monat getan haben; eigenes Branding, Zugriffszahlen, Uptime und ein monatlicher PDF-Bericht werden wichtig, sobald Sie diesen Bericht unter Ihrem Namen übergeben wollen.
Das war die Entwurfsbedingung, keine nachträgliche Behauptung. Ein abgeschaltetes Modul wird gar nicht geladen, weil die Registry Klassennamen hält und nur ein aktives Modul instanziiert wird. Das Portal fragt nicht live ab, sondern liest einen zwischengespeicherten Snapshot, dessen Gültigkeitsdauer Sie ändern können. Die PDF-Erzeugung läuft im Cron hinter einem Lock. Admin-CSS und -JS laden nur auf den eigenen Bildschirmen des Plugins, und jQuery kommt nicht vor. Eine Geschwindigkeitszahl oder einen Prozentwert nenne ich Ihnen nicht — das sind Architekturentscheidungen und kein Benchmark-Ergebnis.
Nein, denn es gibt nichts zu sehen. Jede Installation steht für sich und enthält nur die Daten der jeweiligen Website; es gibt keine zentrale Stelle, die Kundendaten zusammenführt. Wenn Sie White Labelling einschalten und das Plugin vor der Kundschaft verbergen, sieht sie das Portal und nicht Ihre Agenturbildschirme. Die Kehrseite gehört dazu: Aus demselben Grund gibt es auch kein einzelnes Dashboard, das alle Ihre Kunden auf einmal zeigt.
Sieben Module, alle aktiv: Aktivitätsprotokoll, Datenbankprüfung, Kundenportal, GA4-Zugriffszahlen, Uptime (aus einem Monitoring-Dienst oder dem Heartbeat), geplante PDF-Berichte mit E-Mail-Versand und White Labelling. Dazu der Einstellungsbildschirm, die REST-Routen, die Übersetzungen und sämtliche Hooks. Ein abgeschaltetes Modul wird gar nicht geladen, und außer GA4 und dem Monitoring-Dienst — beides Ihre Entscheidung — kontaktiert das Plugin nichts.
Der kostenlose Build umfasst 33 Dateien und etwa 105 KB, der Pro-Build 404 Dateien und etwa 1,1 MB. Der gesamte Unterschied besteht aus zwei Dingen im Paket: der mPDF-Bibliothek und Vazirmatn in zwei Schnitten. mPDF liegt getrimmt bei — 3,8 MB Quellcode statt 55 — und wird von einem selbst geschriebenen Autoloader geladen, damit zur Laufzeit nichts installiert wird. Diese Dateien werden nur gelesen, wenn tatsächlich ein Bericht gebaut wird.
Ja, und das wurde mit den Augen geprüft statt angenommen: Ein PDF wurde erzeugt, in ein Bild umgewandelt und durchgesehen. Vazirmatn liegt im Paket und ist mit aktiviertem OpenType-Layout registriert, und genau diese eine Einstellung verbindet die arabischen Buchstaben — das, was die meisten Plugins vergessen, weshalb deren Ausgabe zerrissen aussieht. Die Ausgabe ist rechtsbündig, Tabellen und gemischte persisch-lateinische Zeilen lesen sich korrekt, und Seitenzahlen sind auf LTR festgelegt, damit aus "1 / 2" nicht "2 / 1" wird.
Sie brauchen ein Google-Cloud-Dienstkonto und dessen Schlüsseldatei, und jemand mit Administrationszugriff auf die GA4-Property muss die E-Mail-Adresse dieses Dienstkontos als Betrachter hinzufügen. In der Regel ist das Ihre Kundschaft, das ist also der eine Teil, den Sie nicht allein einrichten können. Das Plugin signiert sein JWT selbst mit dem Scope analytics.readonly und bringt kein Google-SDK mit; der private Schlüssel ist ein reines Schreibfeld und taucht in keiner Antwort wieder auf. Bekommen Sie den Zugriff nicht, lassen Sie das Modul aus — der Rest des Plugins arbeitet unverändert weiter.
Ja. Richten Sie irgendeinen Cron oder Monitor auf den Heartbeat-Endpunkt, und das Plugin errechnet die Verfügbarkeit aus den Lücken zwischen den Pings; eine Lücke von mehr als dem Doppelten Ihres eingestellten Intervalls zählt als Ausfall. Die URL ist per HMAC-SHA256 über einen Zeitstempel signiert und wird mit hash_equals verglichen, der Zeitstempel muss etwa eine Minute an der Serveruhr liegen, Zeitstempel aus der Zukunft werden abgelehnt, und jede signierte URL wird genau einmal angenommen. Der letzte Punkt ist der entscheidende: Ohne ihn könnte jede Person, die eine Heartbeat-URL im Serverlog sieht, sie wiederholen und einen echten Ausfall verdecken. Die Anleitung enthält einen fertigen curl-Befehl.
Nichts, sofern Sie es nicht verlangt haben. Es gibt eine Einstellung "Daten bei Deinstallation löschen", und sie ist standardmäßig aus, weil ein Plugin zu entfernen und neu zu installieren Sie nicht ein Jahr Aktivitätsprotokoll kosten sollte. Das Deaktivieren räumt lediglich geplante Ereignisse und Caches ab und rührt gespeicherte Daten nie an. Schalten Sie die Einstellung ein, entfernt die Deinstallation beide Tabellen, die Einstellungen und die erzeugten PDFs.
Fehlerbehebung im Plugin, Hilfe bei Installation und Einrichtung — einschließlich GA4 und Heartbeat — und Antworten auf Fragen zur Nutzung. Anpassungen, die Entwicklung neuer Funktionen und Probleme, die von anderen Themes oder Plugins kommen, liegen außerhalb des Supports und werden gesondert vereinbart.