0.34.3 — Performance: Kalender-Monatsansicht, Dashboard-Grid, Seiten-Erkennung
Aus dem Performance-Review vom 13.08.2026:
- Kalender-Heatmap (
[canna_daily_calendar]): lud bisher pro Monatswechsel die komplette Tagebuch-Historie aller Grows und filterte den angezeigten Monat erst in PHP heraus. Je länger ein Nutzer sein Tagebuch führt, desto teurer wurde jeder Kalenderaufruf. Neue MethodeDiary::getEntriesInMonth()grenzt die Query direkt permeta_queryauf den angezeigten Monat ein. - Tagebuch-Dashboard: zählte die Einträge jeder Grow-Karte einzeln (
countEntries()pro Karte → eine Query pro Tagebuch, N+1 bei N Tagebüchern). Neue MethodeDiary::countEntriesBulk()holt alle Zählungen in einer gruppierten Query. - Seiten-Erkennung (
cannacal_calendar_page_url(),cannadaily_page_url_by_shortcode()): scannte bei kaltem Options-Cache potenziell alle veröffentlichten Seiten der Website. Jetzt auf 500 Seiten begrenzt statt unbegrenzt.
0.34.2 — Fix: Toter Klick auf „Heute" im Grow-Kalender
Live gemeldet: Tippen auf den heutigen Tag im Monats-Heatmap-Kalender
([canna_daily_calendar]) tat nichts, wenn heute noch kein Eintrag geloggt
war. Root Cause: cannadaily_render_calendar_shortcode() rendert Tageszellen
nur dann als <button> mit Popover, wenn $level > 0 (also Log-Aktivität an
dem Tag existiert) — bei 0 Einträgen (der Normalfall für „heute", solange man
noch nichts eingetragen hat) blieb die Zelle eine reine, nicht interaktive
<span>. Fix: die is-today-Zelle ist jetzt immer ein Button; bei 0 Einträgen
öffnet sie ein Popover mit „Heute noch keine Einträge." + einem
„Eintrag hinzufügen →"-Link zum passenden Tagebuch (direkt zum einzigen Grow,
falls nur einer existiert, sonst zur Grow-Übersicht) — die Formular-Seite
befüllt das Datumsfeld dort ohnehin bereits automatisch mit heute.
0.34.1 — Polish-Pass: Tagebuch/Grow-Kalender
Gegen das neu erstellte DESIGN.md geprüft (Projekt-Root, gemeinsames System mit
NavWeed). Kein Feature-/Funktionsumfang geändert.
- Aktions-Tags am Eintrag repariert: wurden mit der falschen CSS-Klasse (
.we-tag/.we-tag-row, nie definiert) gerendert statt der bereits vorhandenen, vollständig gestylten.we-chip/.we-chip-row-Pillen — zeigten bislang unformatierten Rohtext statt Chips. - Schwebende Overlays vereinheitlicht: Kalender-Popover, Foto-Lightbox-Popover, Teilen-Popover, Speichern-Toast und Kamera-Dialog hatten fünf verschiedene Ad-hoc-Schattenwerte (eine davon: gar keinen) — jetzt durchgängig
0 20px 60px rgba(0,0,0,.3), wie im übrigen System für Modals/Popovers. - Danger-Rot vereinheitlicht + Dark-Mode ergänzt: Foto-Warnung und „Tagebuch löschen"-Link nutzten ein anderes Rot als der Rest des Systems und hatten keine Dark-Mode-Variante.
- Fokus-Ringe ergänzt für Icon-Buttons (
.we-act), Buttons, Sub-Tabs und Chips — bislang nur auf Texteingaben vorhanden. - Desktop-Breakpoint auf 782px vereinheitlicht (vorher 900px, s. 0.34.0): deckt sich jetzt mit
--we-bp-lg, dem kanonischen Desktop-Breakpoint des restlichen App-Shells (Bottom-Nav→Rail wechselt ebenfalls bei 782px) — vorher blieb das Tagebuch zwischen 782–900px einspaltig, obwohl die Nav schon auf Desktop-Layout umgeschaltet hatte. Sidebar-Spalte dafür von 360px auf 320px verschmälert. - Stage-Bar barrierefrei: aktives Segment trägt jetzt
aria-current="step", die Gruppe einen Tag/Phase-tragendenaria-labelstatt nur des benachbarten Texts.
0.34.0 — Grow-Tagebuch: 2-Spalten-Desktop-Layout, Katalog-Foto-Opt-in
- Desktop-Layout: Ab 900px Breite steht das "Neuer Eintrag"-Formular jetzt sticky neben dem Grow-Log statt darüber/darunter — kein Hin-und-Herscrollen mehr beim Nacheintragen mehrerer Tage. Mobile (<900px) bleibt unverändert einspaltig. Siehe
.we-diary-layoutinassets/css/diary.css. - Katalog-Foto-Opt-in: neue Checkbox im Eintragsformular — Grower können ihr Titelbild für den NavWeed-Sorten-Katalog freigeben (
cc_catalog_optinMeta,Diary::catalogOptIn()/setCatalogOptIn()). Getrennt vom bestehenden Share-Token-Mechanismus, da öffentlicher Katalog ein anderer Sichtbarkeits-Kontext ist als ein privater Share-Link.
0.33.1 — Tagebuch-Formular: kein Pflicht-Scroll mehr, Hinweistext, Sorten-Link
- "Neuer Eintrag"-Formular (Foto-first Capture) erscheint jetzt direkt nach Titel/Tab-Umschalter statt erst nach dem Fortschrittsbalken — auf Mobile war bislang ein Scroll nötig, bevor Kamera/ Notizfeld sichtbar wurden. Fortschrittsbalken rückt dafür hinter das Formular.
- Neuer Hinweistext im Formular: "Foto oder Notiz reicht — beides ist nicht Pflicht." (macht die bereits bestehende Server-Validierung sichtbar,
Diary::addEntry()unverändert). - Sortenname im Tagebuch (Übersichtskarten + Grow-Detailseite) ist jetzt anklickbar und führt zur NavWeed-Sortenseite (Specs + dortiger HOS-Shop-Link).
0.33.0 — Dashboard-Redesign: Stat-Karten unter der Kalender-Heatmap (MacroFactor-Pattern)
Der Grow-Kalender ([canna_daily_calendar]) endete bisher direkt nach der Heatmap-Legende.
Ergänzt um eine Stat-Karten-Reihe (.we-result-info mit drei .we-info-cards: Log-Einträge,
Aktive Tage, Fotos — alle aus den ohnehin berechneten $activity-Daten des angezeigten
Monats, keine zusätzliche Query) nach dem Vorbild von MacroFactors Dashboard (Referenz-Recherche
via Mobbin, siehe Projekt-Memory). Dieselben Klassen kommen jetzt auch im NavWeed-Monats-Digest
zum Einsatz — geteiltes Stat-Karten-Pattern über beide Plugins hinweg.
0.32.2 — Fix: Kalender-Kacheln zu groß, Spalten nicht mehr unter Wochentagen
Live entdeckt: Grid-Items haben implizit min-width: auto (= Content-Mindestgröße), das
zwang die 1fr-Spalten in .we-heat-grid in Kombination mit aspect-ratio: 1 auf
.we-heat-cell über ihren fairen Anteil hinaus (65.5px statt 54px pro Spalte) — die
Kalender-Kacheln liefen aus dem Container und die Tages-Spalten passten nicht mehr zur
Wochentags-Kopfzeile (Mo/Di/Mi/…) darüber. Fix: min-width: 0; min-height: 0; auf
.we-heat-cell.
0.32.1 — Fix: ungewollte Abstände unter Untertiteln/Legende/Stage-Label
Live auf weederkennen.de entdeckt (Live-Inspektion via Browser-DevTools): dieselbe
Ursache wie im NavWeed-Fix 0.53.1 — Astras .entry-content p { margin-bottom: 1.6em }
gewann gegen .we-subtitle, .we-subtitle--detail, .we-stage-label und
.we-heat-legend/.we-cal-daypop-date (einzelne Klasse schlägt gegen
Klasse+Element-Selektor). Fix: jeweils Ancestor-Klasse (.we-widget, .we-stage,
.we-cal-daypop) vorangestellt, kein !important nötig.
0.32.0 — UI-Redesign: echter Grow-Kalender statt Konsum-Tagebuch-Optik
Erste Umsetzungsrunde des App-Redesigns (Referenz: Planta/GrowBuddy-Muster). CannaCal
bekommt sein eigenes, domänengerechtes Framing statt generischer Journal-App-Optik.
- Stage-Fortschritt: neue
cannadaily_get_current_stage()-Hilfsfunktion leitet auscc_start+ dem bestehenden GrowSchedule-Zeitplan die aktuelle Phase (Keimling/Veg/Blüte/Curing) ab; als 4-Segment-Fortschrittsbalken + "Tag N"-Anzeige oben im Tagebuch sichtbar. Bekannte Grenze: GrowSchedule bildet weiterhin nur eine feste Autoflower-Zeitlinie ab, keine Photoperiod-Sorten. - Aktions-Tags pro Eintrag: neues
cc_actions-Meta-Feld (Gegossen/Gedüngt/ Getrimmt/Umgetopft) als Chip-Auswahl im Eintragsformular, sichtbar als Mini-Tags in der Liste. - Foto-first Erfassung + Wochen-Timeline: die Foto-/Kamera-Aufnahme (Funktion war bereits vorhanden) steht jetzt als erstes, großes Element im Formular statt als Neben-Icon. Neue
cannadaily_gallery_html_grouped()gruppiert die Grow-Fotos nach ISO-Woche (neueste zuerst) als eigene "Fotos"-Ansicht neben den Einträgen. - Kalender als Monats-Heatmap:
[canna_daily_calendar]zeigt jetzt ein 7-Spalten-Raster mit Einfärbung nach Log-Aktivität des Tages (0/1/2+ Einträge, Foto vorhanden) statt der vorherigen Agenda-/FullCalendar-Ansicht; aktive Tage öffnen ein natives Popover mit den Einträgen des Tages.
0.31.0 — Security- & Performance-Audit: Sharepic-Härtung, Feed-Caching, Conditional Assets
Ergebnis eines vollständigen Audits (Security + Performance) beider Plugins.
Security
- Sharepics gehärtet: Dateinamen enthalten jetzt ein nicht erratbares, vom Share-Token abgeleitetes Segment (
share-{typ}-{id}-{hash}.png) — vorher waren die PNGs (Foto + Notiz-Auszug) allein über die enumerierbare Post-ID abrufbar. Beim **Zurückziehen des Teilens, Bearbeiten/Löschen von Einträgen, Cover-Wechsel und Grow-Löschung** werden die Dateien jetzt gelöscht (Share::deleteSharepics(), inkl. Alt-Dateien ohne Hash). - Rate-Limiting auf den öffentlichen Token-Routen (
/grow-kalender/…,/geteilt/…): max. 20 ungültige Tokens pro IP in 10 min, danach 429. - Foto-Upload: Datei-Inhalt wird per
wp_getimagesizeals echtes Bild verifiziert (vorher nur Endungs-Check viawp_check_filetype). - Mastodon-Token verschlüsselt in User-Meta (AES-256-GCM, Schlüssel aus
wp_salt); Legacy-Klartext wird beim nächsten Speichern migriert. - SSRF-Härtung Mastodon: Instanz-Angabe muss ein plain Hostname sein und darf nicht auf private/link-local IPs auflösen.
- Privacy-Hinweis präzisiert: Tagebuch-Formular verspricht nicht mehr absolute Privatheit (Fotos sind als Uploads über ihren direkten Datei-Link erreichbar).
Performance
- Assets nur noch auf Plugin-Seiten (Shortcodes/Blöcke/Share-Seiten) statt global auf jeder Seite; CSS/JS minifiziert (
*.min.*, ~71 KB → ~48 KB). Gast-Nonces entfernt (Full-Page-Caching möglich); CannaDaily-REST-Nonce nur noch für eingeloggte Nutzer. - Sharepics werden nicht mehr bei jedem Seitenaufruf neu gerendert (
file_exists-Guard; vorher 2 GD-Renderings pro View inkl. OG-Crawler). - Grow-Feed: Token→ID- und ICS-Ergebnis-Caching (Transients, Invalidierung bei Eintrags-Änderungen),
ETag/304 +Cache-Control: privatestattno-store. - Öffentlicher Kalender (
/kalender/…): ICS-Transient + `Cache-Control: public, max-age=3600+ETag`/304 (Inhalt ist generisch, voll cachebar). - Mastodon-Post entkoppelt (Single-Event via WP-Cron) — blockierte vorher das Eintrag-Speichern mit bis zu 40 s externen Requests; Wetter-Timeout 8 s → 4 s.
- DB:
Diary::getEntries()mit Per-Request-Memoization;coverPhotoId()lädt nur noch den neuesten Eintrag mit Foto statt aller Einträge;GrowSchedule::getEvents()(30-KB-Literal) einmal pro Request;cannacal_user_strain_photo()memoized; neuer Helpercannadaily_next_planned_event()für das NavWeed-Dashboard (kein Einträge-Volllast). - Autoload-Flags korrigiert (einmalige Migration beim Update): kleine Per-Request- Optionen (Seiten-IDs, Rewrite-Marker) → autoload, große Admin-Inhalte (Infotainment/Werbepartner-JSON) → kein autoload.
0.30.0 — Foto-Galerie: Wischen in der Lightbox (Mobil)
Die Vollbild-Lightbox der Grow-Foto-Galerie (Detail- und geteilte Seite) reagiert jetzt auf
Touch-Wischgesten: horizontal wischen blättert zum vorigen/nächsten Foto. Schwelle 40px,
horizontale Bewegung muss die vertikale übersteigen — so bleibt vertikales Scrollen/Schließen
unberührt. Rein additiv zu den bestehenden ‹ ›-Buttons, Pfeiltasten und dem Zähler; kein CSS,
kein neues Markup.
0.29.0 — Foto-Upload: Live-Kamera im Eintragsformular (In-Page-Sucher)
Instagram-artiger Aufnahme-Flow, im Rahmen dessen, was das Web hergibt: das Mediathek-Grid
liefert der native Foto-Picker (Galerie-Button, unverändert), neu ist der Live-Sucher in der Seite.
- Live-Kamera als natives
<dialog>(#cd-camera): getUserMedia-Viewfinder mit großem Auslöser (Kamera-App-Optik, dunkles Umfeld), Kamera-Wechsel vorn/hinten (Frontkamera in der Vorschau gespiegelt, Aufnahme ungespiegelt), Schließen/Esc stoppt den Stream sauber (Track-Cleanup). - Aufnahme → bestehende Pipeline: der Auslöser zeichnet den Video-Frame auf ein Canvas (JPEG 0.92 —
toBlob-WebP kann Safari nicht überall), legt die Datei perDataTransferins bestehendecd_photo-Input und feuertchange— **Optimierung (1600px/WebP/EXIF-Strip) und Sofort-Vorschau laufen unverändert mit** (ein Codepfad für Kamera + Galerie). - Robuster Fallback: ohne
getUserMedia/<dialog>/Secure Context oder bei verweigerter Berechtigung öffnet der Kamera-Button wie bisher die native Kamera-App (capture-Attribut, wird nach Gebrauch entfernt, damit der Galerie-Button sauber bleibt). - Edit-Modus: „Foto entfernen" ist jetzt ein ✕ direkt auf dem Bestandsfoto (Tap togglet, ↩ macht rückgängig; Foto wird ausgegraut). Die Checkbox bleibt als Formularfeld erhalten (visuell versteckt) — kein Server-Change.
- A11y: Vorschau-Box mit
aria-live="polite"(„Bild wird optimiert …"/„✅ bereit"), Hinweiszeile im Dialog alsrole="status", Auslöser-Animation respektiertprefers-reduced-motion, Safe-Area-Padding unter den Controls.
0.28.0 — Eigene Tagebuch-Ansicht bekommt die Foto-Galerie
- Die eigene Tagebuch-Seite zeigt jetzt dieselbe Foto-Galerie (Grid + JS-Lightbox, alt → jung) wie die geteilte Seite — als gemeinsamer Baustein
cannadaily_gallery_html()(ein Codepfad, Share-Seite + Eigen-Ansicht). - Formular „Neuer Eintrag" bleibt oben; die per-Eintrag-Aktionen (Bearbeiten/Teilen/Löschen, Titelbild setzen) bleiben in der Liste darunter erhalten.
0.27.0 — Auto-Post neuer Einträge auf Mastodon (Opt-in pro Grow)
- Mastodon-Auto-Post: Ist bei einem Grow „automatisch posten" aktiv, löst jeder neue Eintrag einen öffentlichen Mastodon-Post aus (Grow-Name/Run + Notiz + Link zum geteilten Eintrag + Foto als Medium).
- Konto pro User: Instanz + Zugangstoken werden als User-Meta gespeichert (einmal im Grow-Setup gesetzt, gilt für alle eigenen Tagebücher). Token maskiert; leer lassen behält den bestehenden.
- Direkt aus WordPress (
includes/Mastodon.php): Medien-Upload (v2) + Status (v1), fire-and-forget, kurzer Timeout, Doppelpost-Marker (cc_mastodon_posted). Fehler blockieren das Speichern nicht. - Beim Posten wird der Eintrag automatisch geteilt, damit der Link öffentlich funktioniert.
0.26.5 — Lightbox nutzt Design-System-Buttons + Hero volle Breite
- Lightbox-Buttons verwenden jetzt die vorhandene Icon-Button-Komponente
.we-act(statt eigener Styles) — behebt die ovalen Buttons (Astras globalebutton-Regeln blähten die feste Größe auf) und ist konsistent zum Styleguide. .we-share-heroohnemax-width— das Sharepic oben nutzt die volle Breite.
0.26.4 — Sharepic-Feinschliff + Lightbox-Look + WP-Standard-Bilder
- Sharepic: Kicker „WEEDERKENNEN" (statt CANNADAILY); Titel überlappt den Kicker nicht mehr (mehr Abstand, Foto etwas kleiner); Sorte inkl. Breeder (nw_breeder); Anzahl Einträge entfernt; **Run # steht jetzt in derselben Zeile wie die Domain** (Footer).
- Galerie/Lightbox nutzt WordPress-Standardbilder: Thumbnails über
wp_get_attachment_image(responsive srcset + lazy), Lightbox lädt die Größelargestatt des Originals → deutlich schneller. - Lightbox-Look überarbeitet: runde Buttons, Pfeile seitlich, Schließen oben rechts, Bildunterschrift als Pille unten.
0.26.3 — Sharepic wie navweed + JS-Lightbox
- Sharepic: nutzt jetzt navweeds gebündelte Font + Schriftgrößen (behebt das Mojibake, das vom System-Font-Fallback kam — rohes UTF-8 wie navweed statt Entity-Trick). Einzelbild (neuestes Foto) statt 2×2-Collage. Auf der Seite ganz oben als Hero.
- Galerie-Reihenfolge alt → jung, damit das Durchblättern den Verlauf zeigt.
- Lightbox neu (JS): sauberes Overlay mit Vor/Zurück, Pfeiltasten (←/→), Esc/Backdrop zum Schließen, Positionsanzeige. Behebt den Bug, dass „✕" vorwärts blätterte (native Popover-Navigation ersetzt).
0.26.2 — Geteilte Grow-Seite: Feinschliff
- Sharepic wieder sichtbar auf der Seite (eigener Abschnitt „Sharepic" unter der Galerie), zusätzlich zu og:image + Download.
- Lightbox zum Durchklicken: Vor/Zurück/Schließen direkt in der Foto-Lightbox (natives Popover mit Umlauf, kein JS), inkl. Positionsanzeige (z. B. „3/10").
- Mehr Abstand über der Headline (Kopfbereich war zu knapp).
- Strain verlinkt: Der Sortenname in der Meta-Zeile führt jetzt zur Sorten-Seite.
0.26.0 — Geteilte Grow-Seite: Galerie + Sharepic-Fix, Tagebuch-Löschen als Button
- Öffentliche Grow-Seite (
/geteilt/grow/…) neu: zeigt jetzt eine Galerie aller Grow-Fotos (Grid + native Popover-Lightbox) statt nur eines Bildes + leerer Datumszeilen. „Verlauf" listet nur Einträge mit Notiz. Layout über daswe--Design-System statt Inline-CSS. - Sharepic (GD-Grafik) aufgehübscht: Mojibake behoben (
·/Eintrâ→ korrekte Umlaute/Trennzeichen viamb_encode_numericentityvorimagettftext); größeres Foto-Band; für Grows 2×2-Collage der neuesten Fotos statt einzelnem Cover; kompaktes Info-Band ohne die frühere Riesenlücke. Bleibt als og:image + Download. - Tagebuch löschen ist jetzt ein sichtbarer Secondary-Button (statt blassem Textlink); Bestätigungsdialog bleibt.
0.25.0 — Tagebuch: Speicher-Feedback + letztes Foto als Titel
- Speicher-Loader: Beim Absenden eines Eintrags erscheint ein Overlay („Wird gespeichert …"), das bis zum Neuladen sichtbar bleibt — zeigt klar, wann Upload/Speichern abgeschlossen ist. Während der clientseitigen Bildoptimierung ist der Speichern-Button gesperrt (kein Original-Upload).
- Letztes Bild = Titelbild:
addEntrysetztcc_coverjetzt aktiv auf das neu hochgeladene Foto (vorher nur Anzeige-Fallback). Das neueste Foto wird automatisch zum Titelbild des Grows. - Nach dem Speichern zu den Einträgen: Redirect springt per Anker
#cd-entriesdirekt zur Einträge-Liste. Darüber eine Zeile: links „← Alle Tagebücher", rechts die Bestätigung „✅ Eintrag gespeichert". Die Eintrags-Meldung wandert von oben in diese Zeile.
0.24.1 — Fix: Fatal bei doppeltem Plugin-Verzeichnis
- Doppel-Last-Schutz in
cannacal.php: Lädt WordPress versehentlich zwei Kopien des Plugins (z. B.cannacalundcannacal-1, wie es beim Hochladen eines Zips ohne umschließenden Ordner entstehen kann), bricht der zweite Ladevorgang jetzt sauber ab (if (defined('CANNACAL_VERSION')) return;). Vorher: „Constant already defined"-Warnungen + Fatal, weilCANNACAL_DIRder einen Kopie auf die andere zeigte. - Zip-Struktur korrigiert: Das Release-Zip enthält die Dateien jetzt im umschließenden Ordner
cannacal/, damit WordPress beim Installieren/Aktualisieren kein zweites Verzeichniscannacal-1anlegt.
0.24.0 — DSGVO: Tagebücher beim Konto-Löschen entfernen
- Löschfunktion (
includes/Privacy.php):cannadaily_delete_user_data()löscht alle Tagebücher + Einträge + zugehörige Foto-Dateien eines Nutzers (unwiderruflich). Strains bleiben unberührt. - Registriert einen WP-Privacy-Eraser (Admin: Tools → Daten löschen). Die Self-Service-Konto-Löschung (navweed) ruft dieselbe Funktion auf.
0.23.0 — DSGVO: Datenexport (Tagebücher + Fotos)
- Datensammlung für den Export (
includes/Privacy.php):cannadaily_export_user_data()liefert alle Tagebücher des Nutzers mit Einträgen (Datum/Notiz/Wetter) + die zugehörigen Foto-Dateien. - Registriert einen WP-Privacy-Exporter (Admin: Tools → Daten exportieren). Der eigentliche Self-Service-Download (ZIP mit Fotos) liegt im navweed-Plugin (Konto-Seite) und holt sich diese Daten per
function_exists()— lose gekoppelt.
0.22.0 — Farbe pro Tagebuch (Kalenderansicht)
- Jedes Tagebuch hat jetzt eine wählbare Farbe (Farbfeld im Tagebuch-Formular, neu + bearbeiten). Sie markiert die Termine/Einträge dieses Tagebuchs im Grow-Kalender — praktisch bei mehreren Tagebüchern.
- Auflösung über Helper
cannadaily_grow_color(): gewähltecc_color(Hex) oder sonst eine stabile Palette-Farbe pro Grow. Speicherung sicher persanitize_hex_color().
0.21.5 — Titelbild standardmäßig das letzte Foto
- Tagebuch-Titelbild ist jetzt standardmäßig das neueste Eintrags-Foto — kein manuelles Setzen mehr nötig. Auflösung beim Anzeigen: manuell gewähltes
cc_cover(falls die Datei noch existiert) hat Vorrang, sonst automatisch das letzte Foto (HelperDiary::coverPhotoId()). Greift auch für bestehende Tagebücher und fängt gelöschte Titelbilder ab. Die Lightbox-Auswahl „★ Als Titelbild verwenden" bleibt als Override.
0.21.4 — Fix: Grow-Seite (Slug grow-beta) wird erkannt
- Mobile-Menü „Übersicht"/„Dashboard" zeigte nicht auf die Grow-Seite:
cannadaily_grow_page_url()suchte nur Sluggrow/TitelGrow— die Seite heißt abergrow-beta(„Grow (beta)"). Die Auflösung scheiterte → Fallback aufs Bewertungs-Dashboard. Jetzt werden Slugsgrow/grow-beta/grow-bereichund TitelGrow/Grow (beta)/Grow-Bereichgeprüft (per Filter weiterhin überschreibbar).
0.21.3 — Changelog neueste-zuerst
- CHANGELOG.md strikt absteigend sortiert (neueste Version oben) und das
array_reversein der Changelog-Ausgabe entfernt — die On-Site-Anzeige zeigt jetzt korrekt die aktuellste Version zuerst.
0.21.2 — Fix: diary.css wurde nicht geladen (Handle-Kollision)
- Regression aus dem
we--Rename behoben:frontend.css/frontend.jsunddiary.css/diary.jshatten nach der Umbenennung dasselbe Enqueue-Handle (we-frontend) — WordPress verwarf das zweite, alsodiary.css/diary.js. Folge: auf den Grow-Seiten fehlten die Diary-Styles (doppelte „Tagebuch"-Überschrift, Karten gestapelt statt im Raster). Jetzt eindeutige Handles:we-cal(Generator) undwe-diary(Tagebuch). - Damit greifen wieder Astra-Titel-Unterdrückung, Karten-Raster, Eintrags-Styles, Foto-Lightbox + JS-Resize.
0.21.1 — Foto-Upload optimiert + Titelbild per Lightbox
- Clientseitige Bild-Optimierung vor dem Upload: Fotos werden im Browser auf max. 1600 px verkleinert und als WebP (Q 0.82) exportiert, bevor sie hochgeladen werden. Spart auf dem Handy massiv Zeit (Voll-Auflösung 5–12 MB → ~200–400 KB); EXIF/GPS fällt beim Reencode automatisch weg. Server akzeptiert WebP bereits. Fallback: bei fehlender WebP-Unterstützung das Original.
- Titelbild jetzt über eine Foto-Lightbox: Tippen aufs Eintragsfoto öffnet ein Popover mit großem Bild und großem Button „★ Als Titelbild verwenden" (statt des winzigen ☆ auf dem Thumbnail). Das aktuelle Titelbild wird mit einem ★-Badge markiert.
0.21.0 — Design-System Stufe C–E: ein Namensraum we- + Dark-Mode CSS-only
- Alle Klassen auf
.we-*(vorhercannadaily-/cannacal-): einheitlicher Namensraum über beide Plugins, Markup + CSS + JS im Gleichschritt, inkl. Element-IDs (Kalender) + Handles. Look unverändert (per-Page-Isolation). - Dark-Mode CSS-only: keine JS-Theme-Umschaltung mehr. Dark greift über
html:has(#we-theme-dark:checked); ein verstecktes Checkbox (Footer, von Weederkennen) +<label>-Toggle schalten um. 2 Modi (Hell/Dunkel), ohne Persistenz (Reset je Seitenwechsel) — bewusst so gewählt. - Token-Quelle bleibt
--we-*(we-core). Hinweis: das altedata-nw-theme-Attribut entfällt; einige Kontrast-Regeln bleiben inert (Kontrast-Modus entfällt im CSS-only-Schalter).
0.20.3 — Design-System Stufe B: Buttons auf .we-btn
- Alle Button-Klassen (
cannadaily-btn*,cannacal-btn*) in Markup und CSS auf.we-btn/.we-btn--*(BEM) vereinheitlicht. Look unverändert (Regeln im Gleichschritt umbenannt). we-core stylt Buttons vorerst nicht (kein Lade-Order-Konflikt); die Zusammenführung auf eine Definition folgt.
0.20.2 — Design-System Stufe A: Token-Vokabular vereinheitlicht
- CSS-Tokens
--nw-*→--we-*(Weederkennen). Reine Umbenennung über alle CSS-Dateien, identische Werte + Fallbacks → kein optischer Bruch. Eine Quelle der Wahrheit (Child-Themewe-core.css/tokens.css). - Vorbereitung für die folgende Klassen-Vereinheitlichung auf den
we--Präfix (eigene Stufen, mit Vorschau). - Hinweis: das Dark-Mode-Attribut
data-nw-themebleibt vorerst; es wird mit den Klassen umbenannt.
0.20.1 — Kalender mobil als Liste + schmaleres Datums-Feld
- Mein Grow-Kalender startet auf Mobil (≤ 640 px) direkt in der Listen-Ansicht (
listMonth) statt im Monats-Grid, das auf kleinen Screens kaum lesbar ist. Umschalter Liste/Monat bleibt. - „Dein persönlicher Grow-Kalender": das Datums-Feld zieht sich auf Mobil **nicht mehr über die volle Breite** (linksbündig, inhaltsbreit) — der „Kalender erstellen"-Button bleibt voll.
0.20.0 — Kopfzeilen aufgeräumt (eigener Seitentitel, Icons statt Emojis)
- Eigene Seiten-Kopfzeile statt Astra-H1. Auf den CannaDaily-Seiten wird der Astra-Seitentitel per CSS unterdrückt (Body-Class
cannadaily-page); der Shortcode rendert die Überschrift selbst. - Grow-Liste: „📓 Meine Grow-Tagebücher / CannaDaily · privat" entfällt; Titel „Tagebuch" links, „Neues Tagebuch" als Icon-Button oben rechts.
- Tagebuch-Detail: Grow-Titel als Überschrift, rechts daneben **Bearbeiten/Kalender/Teilen nur als Icons** (
.cannadaily-act, mit Tooltip/aria-label), Meta („Run #… · …") darunter. Eintragsformular steht als erstes im Kasten. - Emojis → SVG-Icons überall im Tagebuch-Kopf, im „Neuer Eintrag"-Titel, in den Popover-Titeln und bei den Foto-Buttons (Kamera/Galerie), die jetzt linksbündig sind. Neue Icons: camera, image, plus.
- Mobile: Eintrags-Thumbnails ~1/3 kleiner (92→61 px).
- „Übersicht"/„Alle Tagebücher" zeigen jetzt auf die „Grow"-Seite (Helper
cannadaily_grow_page_url(), Auflösung Sluggrow→ Titel „Grow" → Fallback Dashboard). - Auch die Neu-/Bearbeiten-Formulare (Grow + Eintrag) nutzen die neue, emojifreie Kopfzeile.
0.19.4 — Eintragszeile kompakter (Datum + Wetter neben das Bild)
- Die separate Kopfzeile (Datum links / Icons rechts) entfällt. Die Eintragszeile ist jetzt Thumbnail | Body | Icons: im Body stehen Datum und Wetter nebeneinander (
.cannadaily-entry-meta), darunter die Notiz. Das leere Mittelfeld verschwindet, auch bei Einträgen ohne Foto. - Icons (Bearbeiten/Teilen/Löschen) bleiben oben rechts, oben ausgerichtet.
- Aufräumen: tote
.cannadaily-entry-head-CSS-Regeln entfernt.
0.19.3 — Aktionsleiste als Button-Reihe + SVG-Icons
- Bearbeiten / Kalender abonnieren / Tagebuch teilen sitzen jetzt nebeneinander in einer Button-Reihe (
.cannadaily-toolbar, flex + wrap) statt untereinander. - Emojis → SVG-Icons: die drei Buttons nutzen das vorhandene Icon-Set (
cannadaily_share_svg); neuescalendar-Icon ergänzt. Konsistent mit den Eintrags-Aktionen (Bearbeiten/Teilen/Löschen). - Die zwei aufklappbaren Boxen (Abonnieren, Teilen) sind jetzt Popovers (Wiederverwendung von
.cannadaily-share-popwie beim Eintrag-Teilen) — kein Inline-Aufklappen mehr, das die Reihe sprengt. - Fix: SVG in Buttons mit
flex: 0 0 auto, damit Astra das Icon nicht auf Breite 0 schrumpft.
0.19.2 — Klapp-Header als Buttons
- „Tagebuch bearbeiten", „Kalender abonnieren", „Ganzes Tagebuch teilen" nutzen jetzt die bestehende Button-Optik (
.cannadaily-btn-secondary) statt Text-Link/Klappkasten — konsistent mit den übrigen Buttons. Die<details>-Boxen verlieren ihren Doppel-Rahmen; der Inhalt klappt unter dem Button auf.
0.19.1 — Eintrags-Icons + Versatz (im echten Browser verifiziert)
- Leere Teilen-/Löschen-Icons behoben: Astra quetschte das SVG im
<button>per Flexbox auf Breite 0 (Höhe blieb) — der Bearbeiten-Link (<a>) war nicht betroffen, daher nur er sichtbar. Fix:flex: 0 0 auto+ erzwungene SVG-Breite und Button-Größe. (Live per DevTools bestätigt: Button-SVG 0px → 19px.) - Versatz behoben: Astra setzte 20px
padding-leftaufsul.cannadaily-entries→ mitpadding: 0 !importantüberschrieben.
0.19.0 — Tagebuch bearbeiten
- Bestehendes Tagebuch bearbeiten: neuer Link „✏️ Tagebuch bearbeiten" im Kopf der Detailseite öffnet das Setup-Formular vorbefüllt (Name, In-/Outdoor, Sorte, Standort, Run, Startdatum). Speichern über die neue Aktion
update_grow(Diary::updateGrow, mit Eigentümer-Prüfung). - Alles editierbar inkl. Startdatum (verschiebt bewusst Plan/Kalender). Beim Wechsel **Outdoor → Indoor bleiben die Standortdaten erhalten** (nur die Wetter-Anzeige pausiert) — sie werden nur im Outdoor-Modus überschrieben.
0.18.2 — Tagebuch-Detail aufgeräumt
- Datum/Icons fluchten jetzt: Der Eintrags-Kopf (Datum + Icons) sitzt über der Foto-Zeile und ist immer volle Breite — vorher rutschte er bei Einträgen mit Foto nach rechts (Versatz zu Einträgen ohne Foto).
- Klarere Abgrenzung: Überschriften „✏️ Neuer Eintrag" und „Bisherige Einträge (N)" (mit Trennlinie) trennen Eingabe von der Liste.
- Icons sichtbar (zweiter Anlauf): Icon-Farbe wird jetzt mit
!importanterzwungen — das Theme (Astra) überschrieb die Button-Textfarbe und machte die SVGs unsichtbar. Löschen rot, beides auch im Dark-Theme.
0.18.1 — Eintrags-Icons: Fixes
- Leere Icons behoben: Die Aktions-
<button>erbten die (weiße) Button-Textfarbe des Themes → Icons unsichtbar (nur der „Bearbeiten"-Link war grün). Icon-Farbe wird jetzt auf.cannadaily-act svghart gesetzt; Löschen rot. - Aktionsreihe entzerrt: nur noch 3 Icons (Bearbeiten/Teilen/Löschen), kleiner (32px) und umbruchsicher → läuft auf dem Handy nicht mehr aus dem Eintrag.
- Titelbild-Stern als Overlay direkt auf dem Foto (★ = aktuelles Titelbild, ☆ = als Titelbild setzen) statt als eigenes Icon in der Reihe.
0.18.0 — Kompakte Tagebuch-Einträge
- Einträge als kompakte Liste statt hoher Karten: quadratisches Foto-Thumbnail links (
object-fit: cover, 1:1 gecroppt; Tippen öffnet das Bild groß), rechts Datum/Notiz/Wetter. - Aktionen als Icons (wie im Bewertungs-Dashboard): ✎ Bearbeiten, ↗ Teilen, 🗑 Löschen und ★ Titelbild.
- Teilen als Popover (native Popover-API) statt aufgeklappter Box — öffnet Link/X/Mastodon/Sharepics bzw. „Teilen aktivieren". Backend (Löschen, Teilen, Titelbild) unverändert; reiner Frontend-Umbau.
0.17.0 — Mobile Grow-Navigation + Foto-Auswahl
- Helfer für die kontextabhängige Mobil-Navigation (von Weederkennen genutzt, lose gekoppelt):
cannadaily_is_grow_page(),cannadaily_grow_entry_url()undcannadaily_nav_entry_data()(liefert je nach Anzahl Tagebücher den Modus neu/direkt/Auswahl + die Tagebuch-Liste). Das Eintragsformular hat jetzt einen Anker#cd-entryfür den Direktsprung. - Foto-Upload „Instagram-like": statt des nackten Datei-Felds zwei Buttons 📷 Kamera und 🖼️ Galerie, die denselben (versteckten)
cd_photo-Input auslösen — Kamera mitcapture="environment", Galerie ohne. Sofort-Vorschau, Server-Validierung und EXIF-Strippung unverändert. Ein Foto pro Eintrag wie bisher.
0.16.1 — Kalender-Popover: Fixes
- Pointer-Cursor auf Kalender-Events: FullCalendar setzt bei
eventClick(statturl) keinen Hand-Cursor – jetzt per CSS ergänzt, damit Events sichtbar klickbar wirken. - Kodierung repariert: Tagebuch-Name/Titel zeigten texturierte Entities (
–statt „–"), weilget_the_title()durchwptexturizeläuft und die Werte pertextContentausgegeben werden. Jetzt serverseitig viahtml_entity_decode()zu echten UTF-8-Zeichen dekodiert (Name, Plan-Titel, Eintragszeile).
0.16.0 — Web-Kalender: Event-Popover
- Klick auf einen Kalender-Eintrag öffnet ein Popover (FullCalendar-
eventClick) mit Titel, Datum, Tagebuch-Badge und Typ (📋 Plan-Schritt / 📓 Tagebuch-Eintrag) sowie einem Button „Zum Tagebuch öffnen" (Detailseite des jeweiligen Grows via?cd_grow=ID). Schließt bei Außenklick/ESC, bleibt im Viewport. - Dafür tragen die Kalender-Events jetzt
growId+ Detail-URL inextendedProps. Dynamische Texte werden pertextContentgesetzt (keininnerHTML), da Titel aus Nutzer-Notizen stammen. Styling über--nw-*-Tokens inkl. Dark-Theme.
0.15.0 — Grow-Glossar
- Neuer Shortcode
[canna_glossar]: öffentliches Endnutzer-Fachlexikon für den Autoflower-Anbau (Pflanzentypen, Phasen, Licht/Klima, Training, Pflanzenteile, Substrat/Nährstoffe, Recht/KCanG) aus der mitgeliefertenGLOSSAR.md. Alphabetisch sortiert, A–Z-Sprungnavigation, Live-Suchfilter und Anker je Begriff (Deep-Link, z. B.…/glossar/#term-autoflower). - Eigenständig, keine Kopplung an navweed (eigene Datei, eigener Inhalt). Styling über die
--nw-*-Tokens inkl. Dark-Theme; standalone greifen die Fallback-Farben. Inhalt inGLOSSAR.mdjederzeit erweiterbar.
0.14.6 — FullCalendar update-sicher laden
- Der Web-Kalender (
[canna_daily_calendar]) sucht die self-hosted FullCalendar-Datei jetzt zuerst im Plugin (assets/vendor/) und sonst inwp-content/uploads/cannacal/— letzteres überlebt Plugin-Updates (im Plugin-Ordner würde die Datei bei jedem Update überschrieben). Gilt auch für die Locales-Datei. - Admin-Hinweis + READ_ME aktualisiert (empfohlener Ablageort = uploads/cannacal/).
0.14.5 — CannaDaily-Teilen mit Social-Icon-Reihe
- In der Teilen-Box (Eintrag & Grow) jetzt die gleiche Icon-Reihe wie bei navweed: **Kopieren · X · Mastodon · Sharepic 1:1 · 4:5** (Icons 1.9rem, Buttons 44px). Kopieren/Mastodon via kleinem JS (
diary.js). - Sharepics (1:1 + 4:5) werden beim Teilen erzeugt (
Share::buildSharepics), damit die Download-Links sofort funktionieren; URL-HelperShare::sharepicUrl().
0.14.4 — Sharepic-Text repariert + Layout + Sorten-Vorbefüllung
- Sharepic-Text gefixt: HTML-Entities (z. B.
–→ „–") werden dekodiert, Emojis/Symbole entfernt (GD-Schrift hat dafür keine Glyphen → vorher Müllzeichen wie „đ"/„Ś"), sauberes Kürzen ohne kaputte Zeichen. - Layout/Schrift: Kicker „CANNADAILY" + großer Titel + Akzent-Subzeile (wie bei den Reviews), deutlich größere Schrift; Bug behoben (Sorte im Grow-Sharepic). Footer „weederkennen.de".
- Setup-Vorbefüllung: kommt der Nutzer über „Jetzt growen" von einer Sorte (
?cd_strain_pre=ID), ist die Sorte im Tagebuch-Setup bereits ausgewählt.
0.14.3 — Sharepic sichtbar machen
- Auf der geteilten Seite (
/geteilt/…) wird das Sharepic jetzt inline angezeigt (1:1 als Hero-Bild), nicht nur als Download. Die 4:5-Variante bleibt als Download. - In der Teilen-Box im Tagebuch gibt es einen klaren Link „👁️ Vorschau & Sharepic öffnen ↗" zum geteilten Link — so findet man das Bild sofort.
0.14.2 — Sharepic auch im Hochformat (4:5)
- Zusätzlich zum quadratischen Sharepic (1:1) gibt es jetzt eine 4:5-Variante (1080×1350) je geteiltem Eintrag/Grow. Auf der geteilten Seite stehen beide als Download („Quadrat (1:1)" · „Hochformat (4:5)").
Share::sharepic($type, $post, $ratio)mitsquare|portrait; Foto-Band + Textbereich passen sich der Höhe an.
0.14.1 — Foto-Upload: Sofort-Vorschau
- Beim Tagebuch-Eintrag zeigt das Foto-Feld jetzt direkt nach der Auswahl ein Thumbnail + Dateiname/Größe (
assets/js/diary.js), mit „✕ Foto entfernen". Der Upload passiert weiterhin beim Speichern — aber der Nutzer sieht sofort, dass ein Bild gewählt ist. - Client-Warnung bei falschem Typ (nur JPG/PNG/WebP) oder > 5 MB, damit nicht still verworfen wird.
0.14.0 — Tagebuch teilen (Eintrag & Grow, mit Bild)
- Öffentliches Teilen wie bei Reviews (
includes/Share.php): pro Element ein geheimer Token + Opt-in (cc_shared), Route/geteilt/(eintrag|grow)/{token}/mit öffentlicher Seite + OG-Tags + GD-Sharepic. - Einheit: beides — einzelner Eintrag (Datum, Notiz, Foto, Wetter; Foto-Option
cc_share_photo) und ganzes Tagebuch/Grow (Titelbild, Sorte, Run, Stats, letzte Einträge). - Teilen-UI im Tagebuch: je Eintrag „🔗 Eintrag teilen" (mit „Foto mitteilen") und „🔗 Ganzes Tagebuch teilen"; jeweils Link anzeigen + „Nicht mehr teilen" (zieht den öffentlichen Zugriff zurück).
- Sharepic: 1080², Foto als Cover-Band oben + Text (TTF mit System-Font-Fallback), Footer „weederkennen.de".
- Hinweis: Geteilte Links sind über das Token öffentlich erreichbar (kein Login) — bewusst, wie bei den Reviews. Nach Update den Permalink-Cache ggf. einmal neu speichern (neue Route).
0.13.2 — Changelog-Anzeige: neueste Version oben
[cannacal_changelog]rendert die Versionen jetzt neueste zuerst (Sektionen werden im Renderer umgedreht; die Datei bleibt chronologisch, neue Einträge weiterhin unten anhängbar).
0.13.1 — Härtung: persönliche Seiten leiten auf Login
- Gäste werden auf
[canna_daily]/[canna_daily_dashboard]/[canna_daily_calendar]-Seiten jetzt **hart zur Login-Seite umgeleitet** (auth_redirectauftemplate_redirect), statt nur eine Hinweis-Zeile zu zeigen. - Kein bekanntes Datenleck vorher: anonyme Abrufe zeigten bereits nur den Login-Hinweis (Shortcodes prüfen Login), Seiten sind
noindex,nofollow. Diese Änderung macht das Verhalten konsistent mit dem Weederkennen-Katalog und robuster gegenüber Caching. - Hinweis: Nach Deploy den Seiten-Cache leeren (PWA/Cache-Plugin), damit eine evtl. gecachte Hinweis-Seite durch den Redirect ersetzt wird.
0.13.0 — Changelog-Shortcode/Block
- Neuer Shortcode
[cannacal_changelog]+ Block „CannaCal Changelog" (includes/Changelog.php): rendert dieseCHANGELOG.mdals HTML (Überschriften, Listen, fett,code). Vorher gab es das nur als Datei – der Shortcode wurde daher nicht interpretiert. Pendant zu Weederkennens[navweed_changelog].
0.12.0 — Feinschliff CannaDaily
- Button-Schrift weiß: Anchor-Buttons (z. B. „Neues Tagebuch") erzwingen jetzt weiße Schrift auf Grün — die Theme-Linkfarbe (blau) wurde per Spezifität überschrieben.
- Redirect nach Eintrag: zeigt zuverlässig zurück auf die Grow-Tagebuchseite (deterministisch über die Detailseiten-URL) statt über Referer/Home auf dem Weederkennen-Dashboard zu landen. Nach „Tagebuch löschen" → Übersichtsseite.
- Grow-Run-Nummer: Setup-Feld „Dein Grow-Run (Nummer)" (Auto-Vorschlag = nächster Lauf, anpassbar), gespeichert als
cc_run; Anzeige als „Run #N" auf Dashboard-Karte und Tagebuch-Kopf. - Plan-Abgleich: Unter der Eintrags-Eingabe erscheint der heutige Plan-Hinweis, wenn für den Grow-Tag eine Aufgabe ansteht (z. B. Düngen) — „📋 Heute im Plan (Tag X): …" (aus dem GrowSchedule).
0.11.0 — Web-Kalender (Gesamt-Kalender im Frontend, iCal optional)
- Neuer Shortcode
[canna_daily_calendar]+ Block „CannaDaily Kalender": zeigt den Gesamt-Kalender des Nutzers direkt auf der Website — alle Tagebücher (Anbau-Plan ab jeweiligem Start + alle Einträge), farbig je Grow. Damit wird das iCal-Abo optional (bleibt aber bestehen). - Renderer: FullCalendar v6 (MIT), self-hosted unter
assets/vendor/fullcalendar.min.js(assets/js/calendar.js, Monats-/Listen-Ansicht). Events werden serverseitig aggregiert und inline geliefert (kein externer Request, nur eigene Daten, login-gated). - Graceful Fallback: fehlt die FullCalendar-Datei, rendert PHP automatisch eine Agenda-Liste (kommende Termine) — nie leer. Admin-Hinweis + Anleitung unter
assets/vendor/READ_ME_FULLCALENDAR.txt. - Die FullCalendar-Datei kann ich nicht mitliefern (MIT-Lizenz, aber aus der Build-Umgebung nicht beschaffbar); einmalig herunterladen + ablegen (Pfad/Anleitung beigelegt).
0.10.0 — Seiten-Split: Übersicht vs. Detailseite
- Neuer Übersichts-Shortcode
[canna_daily_dashboard]+ Block „CannaDaily Übersicht": zeigt nur die Tagebuch-Karten. Damit kannst du eine Übersichtsseite bauen mit[autoflower_calendar]+[canna_daily_dashboard](Kalender + alle Tagebücher nebeneinander). - Die Karten verlinken auf die Detailseite mit
[canna_daily](auto-erkannt über den Shortcode, Option-Cache). Das einzelne Tagebuch + Einträge + Bearbeiten leben dort. - Back-Links („← Alle Tagebücher") führen zur Übersichtsseite, sofern vorhanden.
[canna_daily]bleibt abwärtskompatibel: ohne Übersichtsseite zeigt es weiterhin selbst das Dashboard.
0.9.0 — Pro-Grow-Kalenderfeed (Einträge im Kalender)
- Neuer privater, tokengeschützter ICS-Feed je Tagebuch: Route
/grow-kalender/{token}/(includes/GrowFeed.php). Enthält Anbau-Schema (ab dem Startdatum dieses Grows) + Tagebuch-Einträge als Termine + die wöchentliche Erinnerung. ICalBuildererweitert:setDiaryEntries()(Einträge als VEVENTs) undsetUidSalt()— Letzteres gibt jedem Grow eindeutige Event-UIDs, damit zwei Grows mit gleichem Startdatum (z. B. dieselbe Sorte in- & outdoor) sich in Kalender-Apps nicht überlagern.- Abo-Link in der Tagebuchseite (aufklappbar). Token = Bearer-Geheimnis (Tagebuch ist privat → Link nicht öffentlich teilen). Rewrite-Regel wird nach dem Update einmalig automatisch geflusht.
- Der bestehende anonyme Datums-Kalender (
/kalender/{base64}/) bleibt unverändert.
0.8.0 — Mehrere Tagebücher, Dashboard, editierbare Einträge (Refactor)
- Einträge sind jetzt ein eigener CPT
cc_entry(post_parent= Tagebuch) statt JSON-Meta — Grundlage für Bearbeiten pro Eintrag und späteres Teilen (analog Reviews). Einmalige, idempotente Migration der alten JSON-Einträge (cc_entries) incc_entry-Posts; Roh-JSON bleibt als Fallback erhalten. - Mehrere Tagebücher parallel je Nutzer (z. B. gleiche Sorte in- & outdoor).
[canna_daily]ist jetzt ein Router: ohne Auswahl → Dashboard (Karten je Tagebuch mit Cover, „Tag X" seit Keimstart und Eintrags-Anzahl, Button „Neues Tagebuch");?cd_grow=ID→ Tagebuchseite (changelog-artige Eintragsliste);?cd_grow=ID&cd_edit=ENTRY→ Eintrag bearbeiten; sonst Setup.- Jeder Eintrag editierbar (Datum, Notiz, Foto ersetzen/entfernen) und einzeln löschbar; Titelbild weiterhin pro Tagebuch markierbar. Alle Aktionen führen die konkrete Grow-/Eintrags-ID mit (Eigentümer-geprüft).
- Read-API
cannacal_user_strain_photo()und DSGVO-Eraser aufcc_entryumgestellt; Foto-Upload/EXIF-Strip/ Wetter-Stempel unverändert, hängen jetzt am Eintrag. - Teilen pro Eintrag ist damit vorbereitet, aber noch nicht gebaut (Folge-Schritt).
0.7.0 — Gutenberg-Blöcke (neben den Shortcodes)
- Zwei dynamische Blöcke als dünne Hülle um die bestehenden Shortcodes (kein Markup-Duplikat, kein Build-Step – reines
wp.*-JS):includes/Blocks.php+assets/js/blocks.js. - „CannaCal Grow-Kalender" (
cannacal/calendar, render =cannacal_render_shortcode), mit optionalem Überschrift-Attribut. - „CannaDaily Tagebuch" (
cannacal/diary, render =cannadaily_render_shortcode). - Im Editor je ein Platzhalter (Live-Vorschau nicht sinnvoll: Kalender braucht JS, Tagebuch Login); das Frontend rendert das echte Widget. Shortcodes bleiben unverändert nutzbar.
0.6.0 — CannaDaily Phase 2a: Fotos + Sorten-Verknüpfung (Quelle)
- Foto-Upload pro Eintrag (
media_handle_upload, multipart): Typ (jpg/png/webp) + Größe (≤ 5 MB) serverseitig geprüft, Attachment am Grow. Abonnenten-Upload via temporär gewährtemupload_files. - EXIF/GPS-Strip beim Upload (GD-Neukodierung) — kein Grow-Standort in den Metadaten.
- Grow ↔ Sorte:
cc_strain_ref(nw_strain-ID), Sortenwahl im Setup per Weederkennen-REST-Autocomplete (/wp-json/navweed/v1/strains,diary.js). Nur wenn Weederkennen aktiv (sonst Feld ausgeblendet → standalone). - Titelbild: Nutzer markiert ein Eintrags-Foto (
cc_cover, Aktionset_cover, Eigentümer-geprüft). - Read-API
cannacal_user_strain_photo($userId, $strainId)(global,helpers.php): liefert Titelbild, sonst neuestes Foto — Grundlage für Phase 2b (Anzeige in Weederkennen-Review + Sharepic). - DSGVO: Grow-Attachments werden bei „Grow löschen" und im Personal-Data-Eraser mitgelöscht.
- Noch offen (2b): Anzeige des Fotos in der Weederkennen-Review und auf dem Sharepic (Opt-in) — separater Schritt im navweed-Plugin.
0.5.0 — CannaDaily: Standort (Photon) + DWD-Wetter
- Standort-Autocomplete im Setup (outdoor): custom Photon-Feld (OpenStreetMap, kein Key, kein Google),
assets/js/diary.js. Auswahl speichert Ort-Label + lat/lng (+ PLZ) ins Meta — datensparsam, debounced (ab 3 Zeichen). Ausrichtung (Himmelsrichtung) bleibt separat. Bewusst kein ACF (komplett custom). - DWD-Wetter pro Eintrag: neuer
WeatherProvider(includes/WeatherProvider.php) holt das Tageswetter via Bright Sky (DWD Open Data) für die Koordinaten des Grows und stempelt es an jeden neuen Outdoor-Eintrag (Emoji + Lage + Temperatur + Luftfeuchte). Transient-Cache (6 h) pro Ort/Tag, graceful: kein/kaputtes Ergebnis → Eintrag ohne Wetter. - Anzeige: Wetter-Chip je Eintrag; Pflicht-Attribution „DWD via Bright Sky · OpenStreetMap/Photon".
- Hinweis: Photon/Bright Sky sind öffentliche Dritt-Instanzen (Rate-Limit, self-hostbar) — für DSGVO/Last ggf. später Self-Host. Foto-Upload weiterhin offen (Phase 2).
0.4.0 — CannaDaily: Grow-Tagebuch (MVP, ohne Wetter)
- Neues, eigenständiges Tagebuch auf WP-Core (CPT
cc_grow,post_author= Nutzer; Einträge als JSON-Metacc_entries). Kein eigenes Login, keine Weederkennen-Kopplung. (includes/Diary.php) - Shortcode
[canna_daily](frontend/diary.php): nur eingeloggt; Setup (indoor/outdoor; bei outdoor PLZ + Ausrichtung; Startdatum rückdatierbar bis 30 Tage), datierte Text-Einträge, Eintragsliste (neueste zuerst), „Grow löschen". Formulare per Nonce + PRG-Redirect. - CSS
assets/css/diary.cssin den Weederkennen-Tokens (--nw-*mit Fallbacks) inkl. Dunkel-Mode. - Wöchentliche Tagebuch-Erinnerung im Kalender-Feed: wiederkehrendes Event (
RRULE:FREQ=WEEKLY;COUNT=16) ab Tag 7 — zustandslos, in jedem generierten ICS (ICalBuilder). - DSGVO: in den WP-Personal-Data-Eraser eingehängt (löscht alle Grows eines Nutzers).
- Bewusst noch NICHT enthalten: Wetter-Stempel (DWD). Grund: das im Konzept geplante Bündeln der PLZ→Koordinaten-CSV ist aus der Build-Umgebung nicht möglich → Geocoding-Quelle muss vor 0.5.0 entschieden werden (siehe
CannaCal_Konzept_Tagebuch.md). Foto-Upload ebenfalls Phase 2.
0.3.1 — Startdatum: Rückdatieren möglich
- Startdatum-Feld erlaubt jetzt Vergangenheitsdaten bis 30 Tage zurück („schon angesetzt"), statt nur ab heute (
shortcode.php:min= heute−30). Label klarer: „Wann hast du die Samen angesetzt – oder wann planst du es?". - Bewusst keine separate Checkbox: das Datum kodiert geplant (Zukunft) vs. bereits gestartet (Vergangenheit) — keine redundante zweite Bedienlogik.
- Hinweis: Rückdatieren verkürzt die verbleibende Link-Gültigkeit (145 Tage ab Startdatum).
0.3.0 — Nachernte: Fermentierung + Curing (+4 Wochen)
- Schema um eine zweistufige Nachernte verlängert (Tag 85 → ~113):
- Stufe 1 Fermentierung (Tag 85 Start, Tag 92 Woche 1, tägliches Burpen).
- Stufe 2 Curing (Tag 99 Beginn, Tag 106 Woche 3, Tag 113 abgeschlossen).
- Neue Phasen
fermentation+curing(GrowSchedule::getPhases()), Emoji 🫙 inICalBuilder. - Der „nächster Zyklus"-Hinweis + §34-Hinweis wandern ans neue Ende (Tag 113).
- Gekoppelter Pflicht-Fix: Abo-Ablauf von 90 → 145 Tage angehoben (
Server::EXPIRY_DAYS, genutzt inisExpired, PROPFIND-Fenster und Fehlertext) — sonst stürben die Curing-Events hinter der alten 90-Tage-Grenze. Frontend (frontend.js EXPIRY_DAYS, Shortcode-Anzeige „145 Tage", Termin-Zähler) synchron nachgezogen.
0.2.0 — Weederkennen-Integration (Phase 1a + 1b)
Design (1a)
assets/css/frontend.csskomplett von der eigenen--cc-*-Glassmorphism-Optik auf die Weederkennen-Tokens (--nw-green,--nw-line,--nw-surface-soft,--nw-ink,--nw-star,--nw-radius*) umgestellt — flach, ohne Gradients/Glow/Float-Animation.- Tokens werden per
var(--nw-*, fallback)referenziert: mit aktivem Weederkennen erbt das Widget dessen Marke; Dunkel-Mode viahtml[data-nw-theme="dark"]-Overrides; standalone greifen die Fallbacks.
Branding (1a)
- iCal-Feed rebranded:
PRODID,X-WR-CALNAME, UID-Domain (@weederkennen.de) und Footer (🌐 weederkennen.de) inICalBuilder.php; PROPFIND-displayname/-Beschreibung + ICS-Dateiname inCalDAV/Server.php; Legal-Footer-Link im Shortcode (cannacal.io→weederkennen.de). - Naming „CannaCal" → „Weederkennen Grow" (im Feed/Abo sichtbar).
Kopplung (1b)
- Neuer globaler Helper
cannacal_calendar_page_url(int $strainId = 0)(frontend/helpers.php, bewusst global fürfunction_exists()-Detection durch Weederkennen): findet die Seite mit dem[autoflower_calendar]-Shortcode (Option-Cache + Revalidierung), hängt optional?nw_strain=IDan. - Shortcode nimmt den Sorten-Kontext (
?nw_strain) auf und zeigt ihn als Chip „Für deine Sorte: …"; cached zugleich die eigene Seiten-ID für den Helper. - Gegenstück in Weederkennen (
strain-view.php, ab navweed 0.35.7): CTA „🌱 Grow-Kalender starten" nur auf Autoflower-Sorten,function_exists()-gekapselt.
0.1.0 — Erststand (Bestandsaufnahme)
- Autoflower-Grow-Kalender als CalDAV/ICS-Abo.
- Rewrite-Route
/kalender/{base64-datum}/; CalDAV-Server (GET/HEAD/OPTIONS/PROPFIND), Slug- Decode +checkdate-Validierung, 90-Tage-Ablauf (410). - RFC-5545-iCal: All-Day-VEVENTs, 24h-VALARM, Text-Escaping, 75-Oktett-Folding, Europe/Berlin.
- Statisches Schema (
GrowSchedule): ~25 Events, Phasen Vorbereitung→Ernte, Biobizz-Düngung, Ernte-Fenster Tag 70–85 (bewusst beibehalten). - Per-Tag-Content-Blöcke
infotainment+werbepartner(JSON in wp_options);basis= Event- eigene Beschreibung (die separatebasis-Option ist vestigial/ungenutzt). - Shortcode
[autoflower_calendar](Datum → URL, Kopieren, Plattform-Tabs); Admin mit 2 Tabs. - Moderne Code-Basis: Namespace
CannaCal\,declare(strict_types=1), OOP/Singleton.