Schlagwort: 🏠

  • familien-bestellungen


    Familien-Bestellungen


    Das Familien-Bestellungen-Modul vereinfacht wiederkehrende Sammelbestellungen innerhalb einer Gruppe – ob Familie, Freundeskreis oder Community. Jedes Mitglied trĂ€gt seine Menge pro Position ein, ein Koordinator behĂ€lt die GesamtĂŒbersicht.

    Allgemein

    Eine Bestellung erstellen


    Ein Koordinator legt eine Sammelbestellung mit Titel, Beschreibung, optionalem Shop-Link, einer Liste von Positionen und einer Einsendefrist an. AusgewĂ€hlte Mitglieder werden per E-Mail ĂŒber die neue Bestellung informiert.

    Mengen eintragen


    Solange eine Bestellung offen ist, tragen Mitglieder ihre gewĂŒnschte Menge pro Position direkt im Frontend ein – mehrfach anpassbar, bis die Frist erreicht ist.

    Fristen & automatische E-Mails


    Ein stĂŒndlicher Hintergrundjob prĂŒft alle offenen Bestellungen: LĂ€uft die Frist in weniger als sieben Tagen ab, wird einmalig eine Erinnerungsmail verschickt (an die ursprĂŒnglich benachrichtigten Mitglieder UND alle, die bereits eine Menge eingetragen haben). Ist die Frist erreicht, schließt das Modul die Bestellung automatisch und verschickt eine Abschluss-Zusammenfassung.

    Koordinator-Übersicht & Export


    Der Koordinator sieht eine GesamtĂŒbersicht aller Positionen mit Mengen pro Nutzer und kann die Bestellung als CSV exportieren.

    Shortcodes

    ShortcodeBeschreibung
    weinhold_family_ordersRendert die BestellĂŒbersicht: offene und abgeschlossene Bestellungen, Erstell-Formular, Detail-/Mengen-Ansicht

    Dateien

    modules/family_orders.php – einzige Datei des Moduls: Datenbank, Cron-Job, Frontend-Formularverarbeitung, drei E-Mail-Versandfunktionen, CSV-Export, Shortcode, Admin-Seite, Cleanup.

    FĂŒr Entwickler

    Datenbank


    TabelleSpalten(Auswahl)
    weinhold_family_orderstitle, description, shop_url, status(open/closed), deadline_gmt, notify_user_ids, launch_mail_sent, reminder_mail_sent, closed_mail_sent
    weinhold_family_order_itemsorder_id, name, item_url, sort_order
    weinhold_family_order_entriesorder_id, item_id, user_id, quantity(unique je Kombination aus allen dreien)

    Cron-Job


    weinhold_family_orders_cron_tick lĂ€uft stĂŒndlich (registriert 15 Minuten nach der Modul-Aktivierung, WP-Cron-Standardintervall hourly). weinhold_family_orders_run_cron_tick() schließt Bestellungen mit abgelaufener Frist automatisch und löst dabei die Abschluss-Mail aus, verschickt außerdem fĂŒr Bestellungen mit Frist innerhalb der nĂ€chsten sieben Tage einmalig die Erinnerungsmail (Flags launch_mail_sent/reminder_mail_sent/closed_mail_sent verhindern Mehrfachversand).

    Drei E-Mail-Funktionen


    FunktionWannEmpfÀnger
    weinhold_family_orders_send_launch_mail($order_id)BeiErstellung Konfigurierte notify_user_ids
    weinhold_family_orders_send_reminder_mail($order)Fristin unter 7 Tagen notify_user_ids PLUS alle, die bereits eine Menge eingetragen haben
    weinhold_family_orders_send_closed_summary_mail($order_id)Fristerreicht notify_user_ids

    Besonderheiten

    Die Erinnerungsmail geht NICHT nur an Mitglieder ohne Eintrag, sondern zusĂ€tzlich an alle, die bereits eine Menge eingetragen haben – vermutlich damit auch Teilnehmer, die schon mitgemacht haben, ihre Mengen vor Fristende noch anpassen können.

    Alle drei E-Mail-Funktionen nutzen direktes wp_mail() statt des zentralen Template-Systems des E-Mail-Versand-Moduls – anders als z. B. GerĂ€tesicherheit oder Security Manager, die ihre Benachrichtigungen ĂŒber weinhold_send_module_mail() mit anpassbaren Vorlagen versenden.

    Eigenes TabellenprĂ€fix wpdb prefix statt des sonst im Framework ĂŒblichen wpdb base_prefix – wie beim Bastard-des-Monats-Modul ist dieses Modul bewusst nicht Multisite-ĂŒbergreifend gedacht.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • analyse


    Analyse


    Das Analyse-Modul bietet einen dedizierten Bereich fĂŒr Match-Analysen mit Video- und TexteintrĂ€gen. Eingeloggte Nutzer können Analysen erstellen, bearbeiten, als Favorit markieren und kommentieren.

    Allgemein

    Video- & Text-EintrÀge


    Jede Analyse hat einen Titel und wahlweise einen Video-Link oder einen ausfĂŒhrlichen Textinhalt. Video-Links werden automatisch eingebettet: unterstĂŒtzt werden YouTube (inkl. Shorts), Twitch-VODs und Twitch-Clips. FĂŒr YouTube wird zusĂ€tzlich automatisch ein Vorschaubild aus dem Video gezogen.

    Favoriten & Kommentare


    EintrĂ€ge lassen sich als Favorit markieren und in der Übersicht danach filtern. Die Kommentarfunktion erlaubt den direkten Austausch zu einzelnen EintrĂ€gen. Kombiniert mit dem Reactions-Modul lassen sich Kommentare zusĂ€tzlich mit Likes/Dislikes bewerten.

    Berechtigungen


    Über das Benutzerverwaltungs-Modul lĂ€sst sich genau steuern, wer Analysen lesen (view) und wer sie erstellen oder bearbeiten (edit) darf – unabhĂ€ngig pro Subsite. Beide Berechtigungen setzen zusĂ€tzlich einen eingeloggten Nutzer voraus, auch fĂŒr reines Lesen gibt es keinen Gastzugang.

    Shortcodes

    ShortcodeBeschreibung
    weinhold_analyseRendert den vollstĂ€ndigen Analyse-Bereich mit Übersicht, Such- und Favoriten-Filter sowie Detail-/Bearbeiten-Ansichten

    Dateien

    modules/analyse.php – einzige Datei des Moduls: Datenbank, Einbettungs-Erkennung, Frontend-Formularverarbeitung, Übersichts-/Detail-/Bearbeiten-Ansichten, Shortcode, Admin-Seite, Cleanup.

    FĂŒr Entwickler

    Datenbank


    TabelleSpalten(Auswahl)
    weinhold_analyse_entriescreator_user_id, caption, description, video_url, content_type, site_id
    weinhold_analyse_commentsentry_id, user_id, comment_text
    weinhold_analyse_favoritesentry_id, user_id(Unique je Kombination)

    Versionierte Migration: DB-Version 1 zu 2 fĂŒgt nachtrĂ€glich die Spalte content_type sowie die komplette Favoriten-Tabelle hinzu (weinhold_analyse_maybe_install() prĂŒft den gespeicherten Versionsstand und wendet nur die fehlenden Schritte an).

    Video-Einbettung erkennen


    weinhold_analyse_get_embed_url($url) erkennt per regulĂ€rem Ausdruck YouTube-Videos (inkl. Shorts), Twitch-VODs und Twitch-Clips und baut daraus die passende iframe-Embed-URL, inklusive korrektem parent-Parameter fĂŒr Twitch (aus der aktuellen Domain abgeleitet). weinhold_analyse_get_thumbnail_url($url) liefert zusĂ€tzlich ein Vorschaubild, aktuell nur fĂŒr YouTube implementiert.

    Wichtige Funktionen


    FunktionBeschreibung
    weinhold_analyse_get_entries($site_id,$search,$offset,$per_page,$only_favorites,$user_id)Gefilterte, paginierte Liste der EintrÀge
    weinhold_analyse_is_favorited($entry_id,$user_id)Ob ein Nutzer einen Eintrag favorisiert hat
    weinhold_analyse_current_user_can()/_can_edit()BerechtigungsprĂŒfungen, beide verlangen zusĂ€tzlich einen eingeloggten Nutzer

    Besonderheiten

    Twitch-Embeds benötigen zwingend den korrekten parent-Parameter (die eigene Domain) – ohne ihn verweigert Twitch die Einbettung im iframe. Das Modul leitet ihn automatisch aus home_url() ab, keine manuelle Konfiguration nötig.

    Rich-Text-Editor wird gezielt erzwungen: An zwei Stellen im Bearbeiten-Formular wird der Filter user_can_richedit kurzzeitig mit hoher PrioritĂ€t auf wahr gesetzt, damit der volle WordPress-Editor auch fĂŒr Nutzer ohne die sonst dafĂŒr nötige Berechtigung zur VerfĂŒgung steht.

    Content-Type als einfaches Integer-Flag: content_type unterscheidet Video- von Text-EintrĂ€gen als tinyint statt als beschreibender String – bei Erweiterung um weitere Inhaltstypen wĂ€re eine Umstellung auf lesbare Werte sinnvoll.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • wunschliste


    Wunschliste


    Das Wunschlisten-Modul ermöglicht gemeinsame Wunschlisten fĂŒr Mitglieder einer Webseite. Der clevere Trick: Andere Nutzer können WĂŒnsche als „gekauft“ markieren – der Listenbesitzer sieht das aber erst nach einem selbst festgelegten Datum.

    Allgemein

    WĂŒnsche verwalten


    Jeder Wunsch besteht aus Name, optionalem Link und Menge. Die Verwaltung der eigenen Liste (Titel, Kurzbeschreibung, ausfĂŒhrliche Beschreibung, Reihenfolge der WĂŒnsche, Verbergen-Datum) erfolgt direkt im Frontend, solange die Liste noch verborgen ist.

    Verdeckte Kaufmarkierung


    Sobald ein anderer Nutzer einen Wunsch als „gekauft“ markiert, sieht der Listenbesitzer bis zum eingestellten Datum ausschließlich „Bis Datum verborgen“ – unabhĂ€ngig vom tatsĂ€chlichen Status. Erst nach Ablauf der Frist wird sichtbar, was gekauft wurde und von wem. Hat ein anderer Nutzer einen Wunsch bereits markiert, können weitere Nutzer ihn nicht zusĂ€tzlich markieren oder entmarkieren – nur wer selbst markiert hat, kann die Markierung wieder rĂŒckgĂ€ngig machen.

    Zugriff


    Sichtbar sind nur Wunschlisten von Mitgliedern der jeweiligen Website (bei Multisite: Mitgliedschaft auf der konkreten Subsite, Netzwerk-Administratoren sehen immer alles).

    Shortcodes

    ShortcodeBeschreibung
    weinhold_wishlistRendert die Wunschlisten-Übersicht. Eingeloggte Nutzer sehen ihre eigene Liste und können die Listen anderer Mitglieder einsehen

    Dateien

    modules/wishlist.php – einzige Datei des Moduls: Datenbank, Datum-/Zeitzonen-Hilfsfunktionen, Frontend-Formularverarbeitung, Listen- und Detailansicht, Shortcode, Cleanup.

    FĂŒr Entwickler

    Datenbank


    TabelleSpalten(Auswahl)
    weinhold_wishlistsowner_user_id, title, caption, description, reveal_at_gmt
    weinhold_wishlist_itemswishlist_id, name, item_url, quantity, sort_order, purchased_by, purchased_at_gmt

    Beide Tabellen nutzen das site-lokale wpdb prefix, keine eigene site_id-Trennung auf Item-Ebene (die liegt nur auf der Listen-Tabelle).

    Zeitzonen-Handling


    reveal_at_gmt wird konsequent in UTC gespeichert. weinhold_wishlist_parse_local_datetime() wandelt die lokale Eingabe aus dem datetime-local-Formularfeld in UTC um, weinhold_wishlist_get_datetime_input_value() den umgekehrten Weg fĂŒrs erneute BefĂŒllen des Formulars, weinhold_wishlist_format_local_datetime() fĂŒr die reine Anzeige in der Zeitzone der Website.

    Wichtige Funktionen


    FunktionBeschreibung
    weinhold_wishlist_user_has_access($user_id,$site_id)PrĂŒft Mitgliedschaft auf der Site (Multisite: is_user_member_of_blog, Super-Admins immer erlaubt)
    weinhold_wishlist_get_lists_for_site($site_id,$mode)Listet Listen einer Site, Modus open oder revealed (nach reveal_at_gmt gefiltert)
    weinhold_wishlist_render_detail($list,$user_id,$site_id)Rendert eine einzelne Liste inkl. der komletten Sichtbarkeitslogik fĂŒr Kaufstatus

    Besonderheiten

    Die Verbergung ist konsequent serverseitig: Der Kaufstatus wird dem Besitzer schlicht nie ausgeliefert, solange reveal_at_gmt in der Zukunft liegt – nicht nur per CSS versteckt, sondern gar nicht erst unterscheidbar von „nicht gekauft“ gerendert.

    Kein PrioritĂ€ts- oder Bildfeld je Wunsch: Anders als man vom Namen „Wunschliste“ erwarten könnte, unterstĂŒtzt das Datenmodell aktuell nur Name, Link und Menge pro Eintrag – keine PrioritĂ€tsstufen, keine Bilder.

    Formulare werden auf der wp-Action verarbeitet (weinhold_wishlist_handle_frontend_actions(), vor dem Template-Rendering), das im Framework ĂŒbliche Muster fĂŒr Frontend-POST-Verarbeitung.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • about-page


    About Page


    Das About-Page-Modul stellt eine persönliche Über-mich-Seite bereit, die direkt ĂŒber einen Shortcode auf jeder WordPress-Seite eingebunden werden kann. Zweisprachige Inhalte und ein eigenes Styling sind inklusive.

    Allgemein

    Mehrsprachigkeit


    Inhalte können in beiden Sprachen gepflegt werden, ohne eine zweite Seite anzulegen – ist nur eine Sprache vorhanden, wird der Umschalter automatisch ausgeblendet. Die Sprachwahl wird im Browser gemerkt (localStorage) und mit der Sprachwahl der ĂŒbrigen Framework-Seiten (Blog-Listen-Modul) synchron gehalten, auch wenn die About-Seite ihren Umschalter technisch eigenstĂ€ndig implementiert.

    In der Praxis


    Auf weinify.de wird der weinhold_about-Shortcode fĂŒr die persönliche Vorstellungsseite eingesetzt. Das Modul liefert dabei ein konsistentes, zum restlichen Framework passendes Design.

    Shortcodes

    ShortcodeBeschreibung
    weinhold_aboutWrapper-Shortcode – umschließt weinhold_about_de/_en, baut den Sprachumschalter und lĂ€dt Styles/JS
    weinhold_about_deDeutscher Inhalt, nur innerhalb von weinhold_about
    weinhold_about_enEnglischer Inhalt, nur innerhalb von weinhold_about
    about_deutschLegacy-Alias fĂŒr weinhold_about_de – bereits in bestehenden BeitrĂ€gen im Einsatz, in neuen BeitrĂ€gen weinhold_about_de verwenden
    about_englischLegacy-Alias fĂŒr weinhold_about_en – in neuen BeitrĂ€gen weinhold_about_en verwenden

    Beispiel: weinhold_about als Ă€ußerer Wrapper, darin je ein Block weinhold_about_de mit deutschem und weinhold_about_en mit englischem Inhalt.

    Dateien

    modules/about_page.php – einzige Datei des Moduls: Shortcode-Registrierung, Wrapper-Rendering, Sprachumschalter (Inline-CSS/JS), Admin-Hilfeseite.

    FĂŒr Entwickler

    Wie der Wrapper funktioniert


    weinhold_about_page_render_wrapper() setzt vor dem Rendern eine globale Zwischenablage ($weinhold_about_page_blocks) zurĂŒck und ruft do_shortcode() auf dem umschlossenen Inhalt auf. Die inneren Shortcodes weinhold_about_de/_en schreiben ihren gerenderten Inhalt nur in diese Zwischenablage und geben selbst einen leeren String zurĂŒck – der eigentliche HTML-Aufbau (Umschalter + beide Sprachblöcke) passiert erst danach im Wrapper. Ist nur eine der beiden Sprachen vorhanden, entfĂ€llt der Umschalter komplett.

    Sprachumschalter


    EigenstĂ€ndige, kleine Inline-JS-Implementierung (kein Shortcode-Nesting wie beim Blog-List-Modul): blendet per CSS display den jeweils inaktiven Sprachblock aus und schreibt die Wahl in localStorage (SchlĂŒssel weinhold_lang) – derselbe SchlĂŒssel, den auch das Blog-List-Modul verwendet, wodurch die Sprachwahl seitenĂŒbergreifend konsistent bleibt.

    Besonderheiten

    Die Admin-Hilfeseite (Weinhold → About Page) dokumentiert weiterhin nur die Legacy-Aliase about_deutsch/about_englisch als Beispiel, nicht die kanonischen weinhold_about_de/_en-Tags – funktional identisch, aber bei neuem Modul-Code sollte die Doku-Seite kĂŒnftig die kanonischen Tags zeigen.

    Style-Parameter des weinhold_about-Wrappers (style=“default“) wird aktuell nur als CSS-Klasse weinhold-about-style-{wert} durchgereicht, ohne eigene vordefinierte Styles im Framework – Platzhalter fĂŒr zukĂŒnftige Varianten.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • reactions


    Reactions


    Das Reactions-Modul ergĂ€nzt Analyse-Kommentare, WordPress-BlogbeitrĂ€ge und WordPress-Kommentare um eine Like/Dislike-Funktion. Nur eingeloggte Nutzer können reagieren – so bleiben Reactions aussagekrĂ€ftig und frei von Spam.

    Allgemein

    Funktionsweise


    Unter jedem unterstĂŒtzten Inhalt erscheinen zwei SchaltflĂ€chen – Daumen hoch und Daumen runter. Die Stimme wird per AJAX ohne Seitenreload ĂŒbermittelt. Ein erneuter Klick auf die bereits aktive Reaktion entfernt sie wieder, ein Klick auf die jeweils andere wechselt die Reaktion. Die aktuelle Verteilung der Likes und Dislikes wird in Echtzeit angezeigt.

    Wo Reactions erscheinen


    Automatisch integriert, ohne separate Ein-/Ausschalter pro Bereich: unter Analyse-Kommentaren (wenn das Analyse-Modul sie rendert), am Ende jedes WordPress-Blogbeitrags („War dieser Beitrag hilfreich?“) sowie unter jedem WordPress-Kommentar – jeweils nur sichtbar fĂŒr eingeloggte Nutzer.

    Admin-Übersicht


    Unter Weinhold → Reactions zeigt eine reine Auswertungsseite die Gesamtzahl an Likes/Dislikes sowie die zehn am meisten gelikten Inhalte mit direktem Link. Keine Einstellungen, nur Statistik.

    Dateien

    modules/reactions.php – einzige Datei des Moduls: Datenbank, AJAX-Handler, Rendering fĂŒr alle drei Integrationspunkte, Admin-Auswertungsseite.

    FĂŒr Entwickler

    Datenbank


    SpalteTypBedeutung
    object_typevarchar(50)analyse_comment, post oder wp_comment
    object_idbigintID des bewerteten Objekts
    user_idbigintWer reagiert hat
    reactionenum(‚like‘,’dislike‘)Die Reaktion
    created_at_gmtdatetimeZeitstempel (UTC)

    Unique-Key auf (object_type, object_id, user_id) – genau eine Reaktion pro Nutzer und Objekt, ein Wechsel ĂŒberschreibt statt zu duplizieren.

    Eigene Inhalte anbinden


    FĂŒr einen neuen Inhaltstyp genĂŒgt ein Aufruf von weinhold_reactions_render($object_type, $object_id) an der gewĂŒnschten Stelle (per do_action(‚weinhold_reactions_render‘, $type, $id), wie es das Analyse-Modul fĂŒr seine Kommentare tut) oder ein eigener Content-Filter analog zu weinhold_reactions_append_to_post(). weinhold_reactions_get_counts($object_type, $object_id) liefert Like-/Dislike-Zahlen sowie die eigene Reaktion des aktuell eingeloggten Nutzers.

    AJAX


    Einziger Endpunkt wp_ajax_weinhold_reaction_toggle (kein nopriv-Pendant – nicht eingeloggte Anfragen werden mit 403 abgelehnt). Erwartet object_type, object_id, reaction und einen Nonce.

    Besonderheiten

    Keine Konfigurationsmöglichkeit, wo Reactions erscheinen sollen – die drei Integrationspunkte (Analyse-Kommentare, BlogbeitrĂ€ge, WP-Kommentare) sind fest im Code verdrahtet, nicht ĂŒber Einstellungen abschaltbar.

    object_type ist bewusst ein freier String statt eines festen Enums in der Anwendungslogik (die Datenbank erlaubt jeden Wert bis 50 Zeichen) – die AJAX-Validierung schrĂ€nkt aktuell zwar auf analyse_comment/post/wp_comment ein, weitere Typen lassen sich aber ohne Schema-Änderung ergĂ€nzen.

    the_content und the_excerpt werden beide gefiltert, damit Reactions sowohl auf Einzelbeitrags- als auch auf Übersichtsseiten erscheinen, je nachdem welche Funktion das aktive Theme nutzt.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • subsite-404-redirect


    404-Weiterleitung


    Das Subsite-404-Redirect-Modul ersetzt die Standard-WordPress-404-Seite durch eine saubere Weiterleitung auf ein konfigurierbares Ziel. Statt einer nackten Fehlerseite landen Besucher bei einem Tippfehler in der URL auf der Startseite, einer bestimmten Seite oder einer frei angegebenen URL.

    Allgemein

    Konfiguration


    Das Weiterleitungsziel wird pro Subsite im Dashboard unter Weinhold → 404 Redirect definiert – zur Wahl stehen die Startseite, eine bestimmte WordPress-Seite aus einer Auswahlliste, oder eine frei eingegebene URL. ZusĂ€tzlich lĂ€sst sich zwischen temporĂ€rer (302) und dauerhafter (301) Weiterleitung wĂ€hlen, und ob eingeloggte Nutzer sowie Administratoren ebenfalls umgeleitet werden sollen (Admins standardmĂ€ĂŸig ausgenommen, zum Debuggen).

    Ausnahmepfade


    Eigene Pfade (einer pro Zeile, z. B. api/webhook) lassen sich von der Weiterleitung ausnehmen. Technische WordPress-Pfade (wp-json, wp-login.php, wp-cron.php, xmlrpc.php, robots.txt, favicon.ico, Feeds) sowie AJAX- und REST-Requests sind fest eingebaut immer ausgenommen.

    Pro Site


    Da jede Subsite im Netzwerk unterschiedliche Inhalte und Strukturen haben kann, ist die Konfiguration bewusst pro Site getrennt. Eine öffentliche Seite kann z. B. auf die Startseite weiterleiten, wÀhrend eine interne Site auf die Login-Seite umleitet. Subsites ohne aktivierte Konfiguration behalten die Standard-WordPress-404-Seite.

    Dateien

    modules/subsite_404_redirect.php – einzige Datei des Moduls: Weiterleitungslogik, Einstellungen, Admin-Seite, Cleanup.

    FĂŒr Entwickler

    Einstellungen (Option weinhold_subsite_404_redirect_settings)


    SchlĂŒsselBedeutung
    target_modehome, page oder custom_url
    target_page_idZiel-Seiten-ID bei target_mode=page
    target_custom_urlZiel-URL bei target_mode=custom_url
    status_code301 oder 302
    apply_for_logged_inAuch eingeloggte Nutzer umleiten
    allow_admin_debugAdministratoren von der Weiterleitung ausnehmen
    append_from404HĂ€ngt from404=1 und den fehlenden Pfad als missing-Parameter an die Ziel-URL an
    exception_custom_pathsZusÀtzliche, frei definierte Ausnahmepfade

    Ablauf


    HĂ€ngt an template_redirect und greift nur bei echten 404-Antworten außerhalb des Admin-Bereichs. Reihenfolge der PrĂŒfungen: aktiver Wartungsmodus bricht sofort ab, dann Modul aktiv?, dann technische/Ausnahmepfade, dann Admin-Debug-Ausnahme, dann eingeloggte Nutzer, dann eigene Ausnahmepfade. Zeigt die aufgelöste Ziel-URL zufĂ€llig auf den aktuellen (404-)Pfad, wird ebenfalls nicht umgeleitet – verhindert eine Weiterleitung auf sich selbst.

    Besonderheiten

    Wartungsmodus hat Vorrang: Ist das Wartungsmodus-Modul aktiv, greift die 404-Weiterleitung gar nicht erst – die eigene Weiterleitung des Wartungsmodus soll nicht ĂŒberschrieben werden.

    REST- und AJAX-Requests sind immer ausgenommen, auch ohne manuelle Konfiguration – ein 404 innerhalb der REST-API soll als echter API-Fehler beim aufrufenden System ankommen, nicht als HTML-Weiterleitung.

    Beim Modul-Reset werden zusĂ€tzlich mehrere Legacy-Optionen frĂŒherer Versionen entfernt (enabled/target/status/exceptions/exception_page_ids einzeln) – Überbleibsel, bevor die Einstellungen in ein einziges Array zusammengefĂŒhrt wurden.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • maintenance-mode


    Wartungsmodus


    Das Maintenance-Mode-Modul versetzt eine Subsite in den Wartungsmodus. Besucher werden auf eine automatisch erstellte, konfigurierbare Wartungsseite weitergeleitet – Administratoren sehen standardmĂ€ĂŸig weiterhin die normale Seite und können ungestört weiterarbeiten.

    Allgemein

    Zeitplan


    Der Wartungsmodus kann mit einem optionalen Start- und Endzeitpunkt versehen werden. Vor dem Start bleibt die Seite trotz aktivierter Checkbox normal erreichbar, nach dem Endzeitpunkt schaltet sich der Wartungsmodus beim nÀchsten Seitenaufruf automatisch selbst wieder aus.

    Ausnahmen


    Bestimmte WordPress-Seiten (per Checkliste) oder frei eingegebene Pfade können vom Wartungsmodus ausgenommen werden – z. B. eine Kontaktseite oder ein Webhook-Endpunkt, der weiterhin erreichbar bleiben muss. ZusĂ€tzlich lĂ€sst sich per Checkbox erlauben, dass alle eingeloggten Nutzer die Seite normal sehen (nicht nur Administratoren, die ohnehin immer durchgelassen werden).

    Vorschau & Test


    Ein spezieller Vorschau-Link (?weinhold_maintenance_preview=1) erzwingt den Wartungsmodus nur fĂŒr den eigenen Aufruf, ohne ihn fĂŒr alle anderen Besucher zu aktivieren – zum schnellen Gegencheck der Wartungsseite.

    Konfiguration


    Alles wird im Dashboard unter Weinhold → Maintenance Mode konfiguriert. Kein Shortcode nötig – das Modul arbeitet vollstĂ€ndig automatisch.

    Dateien

    modules/maintenance_mode.php – einzige Datei des Moduls: Einstellungen, Wartungsseiten-Erzeugung/-Pflege, Weiterleitungslogik, Admin-OberflĂ€che, Cleanup.

    FĂŒr Entwickler

    Wartungsseite als echte WordPress-Seite


    Bei der ersten Aktivierung wird automatisch eine normale WordPress-Seite mit dem Slug maintenance-mode angelegt (weinhold_create_maintenance_page()), deren Inhalt aus den konfigurierten Zeitfenster- und Beschreibungstexten zusammengesetzt wird. Bei jeder EinstellungsĂ€nderung wird ihr Inhalt aktualisiert (weinhold_update_maintenance_page()). Beim Deaktivieren wird die Seite bewusst NICHT gelöscht, sondern bleibt erhalten (eigener Löschen-Button in der Admin-OberflĂ€che fĂŒr den expliziten Fall).

    Ablauf


    HĂ€ngt an template_redirect. Reihenfolge: Ist das Endzeitfenster bereits erreicht, wird der Wartungsmodus automatisch deaktiviert und die Funktion bricht ab. Dann werden Systempfade (Admin, AJAX, REST, XML-RPC, Cron sowie fest ausgenommene technische Pfade wie wp-login.php, wp-json, robots.txt) immer durchgelassen. Danach greift die Admin-Ausnahme, die allow_logged_in-Ausnahme und zuletzt die konfigurierten Ausnahmepfade. Bleibt keine Ausnahme ĂŒbrig, liefert die Wartungsseite selbst HTTP 503 mit Retry-After-Header, alle anderen URLs werden per 302 dorthin weitergeleitet.

    Einstellungen (Option weinhold_maintenance_mode_settings)


    SchlĂŒsselBedeutung
    enabledWartungsmodus aktiv
    allow_logged_inAlle eingeloggten Nutzer zusÀtzlich zu Administratoren durchlassen
    start_date,end_dateOptionales Zeitfenster
    descriptionFreitext, der auf der Wartungsseite erscheint
    page_idID der automatisch erzeugten Wartungsseite
    exception_page_ids,exception_custom_pathsAusgenommene Seiten bzw. frei eingegebene Pfade

    Besonderheiten

    Weder IP-basierte noch rollenbasierte Ausnahmen vorhanden – Bypass funktioniert ausschließlich ĂŒber Administratorrechte, die allow_logged_in-Option (alle eingeloggten Nutzer pauschal) und Pfad-Ausnahmen. Eine feingranulare Steuerung nach Rolle oder IP-Adresse gibt es nicht.

    HTTP-Statuscode ist korrekt 503 (nicht 200 oder 302) mit Retry-After-Header, wenn die Wartungsseite direkt aufgerufen wird – wichtig fĂŒr Suchmaschinen, damit die Seite wĂ€hrenddessen nicht aus dem Index fĂ€llt. Bei allen anderen URLs erfolgt dagegen ein 302-Redirect zur Wartungsseite.

    Das andere 404-Weiterleitungs- und das Login-Redirect-Modul prĂŒfen jeweils selbst, ob der Wartungsmodus aktiv ist, und greifen dann nicht ein – die Module sind bewusst so verzahnt, dass Wartungsmodus stets Vorrang hat.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • login-redirect


    Login Redirect


    Das Login-Redirect-Modul leitet nicht eingeloggte Besucher automatisch zur Login-Seite weiter. So lĂ€sst sich der Zugang zu einer gesamten Subsite auf eingeloggte Nutzer beschrĂ€nken – ohne komplizierte WordPress-Rollen-Konfiguration.

    Allgemein

    Ausnahmen definieren


    Bestimmte Seiten werden von der Weiterleitung ausgenommen – mindestens die Login-Seite selbst. Weitere Ausnahmen (z. B. Impressum, Startseite, DatenschutzerklĂ€rung) können im Dashboard unter Weinhold → Login Redirect als Liste angekreuzt werden – dort erscheinen automatisch alle vorhandenen WordPress-Seiten der Site.

    In der Praxis


    Auf privaten Subsites im Weinhold-Netzwerk – etwa Community-Bereichen oder internen Projekten – sorgt dieses Modul dafĂŒr, dass Inhalte wirklich nur fĂŒr Mitglieder sichtbar sind. Kein Shortcode, keine Anpassungen pro Seite nötig.

    Dateien

    modules/login_redirect.php – einzige Datei des Moduls: Weiterleitungslogik, Admin-Einstellungsseite, Cleanup.

    FĂŒr Entwickler

    Weiterleitungslogik


    HĂ€ngt an template_redirect und greift nur, wenn der Besucher weder eingeloggt noch im Admin-Bereich ist. Die Ziel-URL kommt aus der zentral im Benutzerverwaltung-Modul konfigurierten Login-Seite (weinhold_user_management_get_auth_page_url()); ist dort keine Seite hinterlegt, dient /login/ als Fallback. Das aktuelle Ziel wird per redirect_to-Parameter an die Login-Seite angehĂ€ngt (ĂŒber weinhold_user_management_add_redirect_to_url(), damit derselbe Open-Redirect-Schutz wie im Benutzerverwaltung-Modul greift).

    Schutz vor Redirect-Schleifen


    Zwei unabhÀngige Sperren verhindern eine Endlosschleife: Erstens wird nicht weitergeleitet, wenn der aktuelle Pfad bereits die Login-, Registrierungs- oder Passwort-vergessen-Seite ist. Zweitens wird nicht weitergeleitet, wenn die Anfrage bereits einen redirect_to- oder redirect_url-Parameter enthÀlt (dann lÀuft man vermutlich schon in einem Auth-Flow).

    ZusĂ€tzlich greift das Modul gar nicht erst, wenn der Wartungsmodus aktiv ist (weinhold_maintenance_mode_settings) – dessen eigene Umleitung hat Vorrang.

    Speicherung


    Ausnahmeliste in der Option weinhold_login_redirect_exceptions (Array aus Seiten-Slugs, die Startseite als leerer String). Gecheckt ĂŒber weinhold_path_matches_exceptions() aus den Framework-Helpern.

    Besonderheiten

    Betrifft nur das Frontend einer einzelnen Site (Module Scope: site) – jede Subsite konfiguriert ihre Ausnahmeliste unabhĂ€ngig, es gibt keine netzwerkweite Einstellung.

    allowed_redirect_hosts wird um alle Domains des Multisite-Netzwerks erweitert (gleicher Mechanismus wie im Benutzerverwaltung-Modul), damit wp_safe_redirect() auch netzwerkinterne Ziele akzeptiert.

    Beim Modul-Reset werden zusĂ€tzlich mehrere Legacy-Optionen aus frĂŒheren Versionen entfernt (page_id/blog_id/site_id/login_url) – Überbleibsel einer Ă€lteren Implementierung, die die Login-Seite noch selbst verwaltete statt sie vom Benutzerverwaltung-Modul zu beziehen.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • cookie-consent


    Cookie Consent


    Das Cookie-Consent-Modul stellt einen DSGVO-konformen Cookie-Banner bereit. Auch auf weinify.de ist dieses Modul aktiv – der Banner, der beim ersten Besuch erscheint, kommt direkt aus diesem Modul.

    Allgemein

    Einwilligungskategorien


    Die Einwilligung wird in vier Kategorien unterteilt: Notwendig (immer aktiv, nicht abwÀhlbar), Funktional, Statistik und Marketing. Banner-Titel, Text und alle SchaltflÀchenbeschriftungen lassen sich pro Subsite individuell anpassen.

    Seitenspezifische Texte


    FĂŒr einzelne Seiten lĂ€sst sich der Standard-Bannertext ĂŒberschreiben – etwa um auf einer speziellen Landingpage einen abweichenden Hinweistext zu zeigen. Ist keine Überschreibung hinterlegt, gilt der allgemeine Text der Subsite.

    Datenschutz- & Impressum-Links


    Der Banner kann Links zu DatenschutzerklĂ€rung und Impressum anzeigen. Beide Quellen sind pro Subsite frei wĂ€hlbar: eine lokale WordPress-Seite, eine manuell eingetragene URL, oder – im Multisite-Netzwerk – eine netzwerkweit zentral hinterlegte URL (unter Weinhold Netzwerk → Cookie Consent), die sich alle Subsites teilen können.

    Erneut öffnen


    Ein dauerhaft sichtbarer Button (optional nur als Icon) sowie der Shortcode weinhold_cookie_settings erlauben es Besuchern, ihre Cookie-Einstellungen jederzeit nachtrĂ€glich zu Ă€ndern – ideal platziert auf einer Datenschutzseite.

    Shortcodes

    ShortcodeBeschreibung
    weinhold_cookie_settingsButton, der das Cookie-Einstellungspanel erneut öffnet

    Dateien

    modules/cookie_consent.php – einzige PHP-Datei des Moduls: Einstellungen, Netzwerk-Links, Frontend-Konfiguration, Admin-OberflĂ€chen (Site + Netzwerk), Cleanup. Frontend-Verhalten (Banner ein-/ausblenden, Cookie setzen) lĂ€uft ĂŒber assets/weinhold_cookie_consent_front.js und die zugehörige CSS-Datei.

    FĂŒr Entwickler

    Übergabe an das Frontend


    weinhold_cookie_consent_build_frontend_config() stellt ein Konfigurationsobjekt zusammen (Cookie-Name, Lebensdauer in Tagen, Texte, Button-Beschriftungen, aufgelöste Datenschutz-/Impressum-Links) und ĂŒbergibt es per wp_localize_script() als weinholdCookieConsentConfig an das Frontend-JS. Die eigentliche Banner-Logik (Anzeigen, Speichern der Auswahl als Cookie, Wiederöffnen) lĂ€uft vollstĂ€ndig im JS, PHP liefert nur Konfiguration und das leere HTML-GrundgerĂŒst.

    Einstellungen (Option weinhold_cookie_consent_settings, pro Site)


    SchlĂŒsselBedeutung
    enabledModul auf dieser Site aktiv
    consent_lifetime_daysGĂŒltigkeitsdauer der Einwilligung (30–3650 Tage)
    banner_title,banner_text_defaultStandardtexte des Banners
    page_text_overridesArray Seiten-ID zu Override-Text
    privacy_link_source,imprint_link_sourcelocal_page/manual_url/network_global bzw. disabled/manual_url/network_global
    button_accept_all,button_necessary_only,button_save_selection,button_customize,manage_button_labelAlle Button-Beschriftungen einzeln konfigurierbar

    Netzwerkweite Datenschutz-/Impressum-URLs liegen separat in der Netzwerk-Option weinhold_cookie_consent_network_links.

    Besonderheiten

    AbwĂ€rtskompatibilitĂ€t beim Impressum: War imprint_link_source frĂŒher auf disabled gespeichert, aber inzwischen ist eine netzwerkweite Impressum-URL hinterlegt, wird beim Auslesen automatisch auf network_global umgestellt – Ă€ltere Installationen zeigen das Impressum dann ohne manuelles Nachpflegen an.

    Cleanup ist zweistufig: weinhold_cookie_consent_cleanup() löscht nur die Einstellungen der aktuellen Site, weinhold_cookie_consent_network_cleanup() rÀumt zusÀtzlich die Netzwerk-Links auf UND löscht die Site-Einstellungen aller Subsites im Netzwerk einzeln.

    Der Banner wird nie im Admin-Bereich oder bei AJAX-Requests ausgegeben (eigene PrĂŒfung in Enqueue- und Render-Funktion) – verhindert, dass er versehentlich im WordPress-Backend oder in AJAX-Antworten auftaucht.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.


  • custom-footer


    Custom Footer


    Das Custom-Footer-Modul funktioniert genauso wie der Custom Header – nur fĂŒr den unteren Bereich der Seite. Den Footer, den du gerade auf weinify.de siehst, wurde mit diesem Modul gestaltet.

    Allgemein

    Buttons & Drag and Drop


    Buttons werden ĂŒber den Platzhalter –buttons– in den Footer-Inhalt eingefĂŒgt und können per Drag & Drop sortiert werden. Sub-Buttons fĂŒr verschachtelte MenĂŒs sind ebenfalls möglich, öffnen im Footer aber nach oben statt nach unten. Pro Button lĂ€sst sich die Sichtbarkeit festlegen: immer, nur fĂŒr eingeloggte oder nur fĂŒr ausgeloggte Besucher.

    Freies HTML


    Der Footer-Inhalt kann beliebiges HTML enthalten – Texte, Links, Icons, Copyright-Hinweise oder ganze Layout-Strukturen.

    Pro Site, kein Shortcode


    Wie beim Header ist jede Subsite vollstĂ€ndig unabhĂ€ngig konfiguriert. Der Footer wird automatisch auf allen Seiten der Subsite ausgegeben, sobald er im Dashboard konfiguriert und aktiviert wurde – ohne Shortcode.

    Dateien

    modules/custom_footer.php – dĂŒnner Modul-Stub (Init, Admin-Seite, Cleanup), delegiert die komplette Logik an das gemeinsam mit Custom Header genutzte includes/weinhold_custom_layout_helpers.php.

    FĂŒr Entwickler

    Gemeinsamer Unterbau mit Custom Header


    Header und Footer sind keine zwei getrennten Implementierungen, sondern dieselbe Logik in includes/weinhold_custom_layout_helpers.php, parametrisiert ĂŒber $layout (‚header‘ oder ‚footer‘). FĂŒr den Footer liefert weinhold_custom_layout_get_config(‚footer‘) entsprechend den Hook wp_footer, öffnende Sub-MenĂŒs nach oben statt unten, und keinen –auth—Platzhalter (der ist dem Header vorbehalten).

    Speicherung (Optionen pro Site)


    OptionInhalt
    weinhold_custom_footer_enabledOb der Footer aktiv ausgegeben wird
    weinhold_custom_footer_htmlDer HTML-Inhalt mit dem Platzhalter –buttons–
    weinhold_custom_footer_linksArray der Buttons (Beschriftung, Ziel-URL, ĂŒbergeordneter Button fĂŒr Sub-Buttons, Sichtbarkeit)

    Wichtige Funktionen


    FunktionBeschreibung
    weinhold_custom_layout_init($layout)HĂ€ngt den Render-Callback an wp_footer, baut das Button-HTML inkl. Sub-Buttons zusammen
    weinhold_custom_layout_resolve_link_url($value)Löst Spezial-Tokens in Button-Zielen auf
    weinhold_custom_layout_sanitize_html($html)Bereinigt gespeichertes HTML ĂŒber eine eigene, erweiterte Erlaubnisliste (weinhold_custom_layout_allowed_html())
    weinhold_custom_layout_get_button_visibility_class($link)Übersetzt die Sichtbarkeitseinstellung eines Buttons in die CSS-Klasse weinhold-show-on-login bzw. weinhold-show-on-logout

    AusfĂŒhrlichere Details zum gemeinsamen Unterbau (inkl. RĂŒckwĂ€rtskompatibilitĂ€t Ă€lterer Buttons) siehe der Custom-Header-Beitrag.

    Besonderheiten

    Wird auf Auth-Seiten (Login, Registrierung, Profil, Passwort-vergessen) automatisch unterdrĂŒckt – weinhold_user_management_is_auth_page() prĂŒft das vor jeder Ausgabe.

    Freies HTML ohne Whitelisting von Grund auf – erlaubt sind bewusst mehr Tags/Attribute als WordPress‘ Standard-Editor zulĂ€sst, damit auch komplexere Layout-Strukturen im Footer möglich sind.

    Sub-Button-MenĂŒs öffnen im Footer nach oben (statt wie im Header nach unten) – rein visuell, damit das Dropdown nicht aus dem sichtbaren Bereich am unteren Seitenrand herausragt.

    Versionshistorie

    VersionDatumÄnderung
    1.0.022.09.2026EinfĂŒhrung der Versionierung.