webGefaehrte Membership Suite
WordPress plugin for WebGefährte membership, checkout, LMS access, user profiles, offers, orders, and integrations with GenerateBlocks and Contact Form 7.
by Jan (webGefährte) · github.com/locke85/wg-membership-suite · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/locke85/wg-membership-suite/archive/refs/heads/main.zipZweck des Plugins:
- Migration der Membership-, Checkout-, Login-, 2FA-, LMS-, Admin- und Frontend-Logik aus einem GeneratePress-Child-Theme in ein wiederverwendbares Plugin
- Erhalt bestehender
wg_*-Kompatibilitaet - Erhalt bestehender CPT-Slugs, Meta Keys, Shortcodes und Rollenlogik
Abhaengigkeiten
Pflicht:
- WordPress
Optional und defensiv behandelt:
- Contact Form 7
- CF7 Multi-Step
- GeneratePress
- GenerateBlocks
Hinweis:
- GeneratePress und GenerateBlocks sind Frontend-Kontext, aber keine harte Voraussetzung.
- Contact Form 7 fehlt darf die Website nicht brechen.
CPTs
wg_angebotwg_bestellungwg_rechnung
Shortcodes
[render_etappe_progress][wg_punkte][wg_punkte_transaktionen][user_avatar_form][benutzerdaten_vorschau][bestelluebersicht][wg_login_form][wg_password_reset_form][user_pdf_downloads]
Settings
Option-Key:
wg_membership_suite_settings
Relevante Werte und Datentypen:
cf7_step2_form_id: Integercf7_step3_form_id: Integerlogin_page_id: Integerpassword_reset_page_id: Integercheckout_page_ids[step_1]: Integercheckout_page_ids[step_2]: Integercheckout_page_ids[step_3]: Integercheckout_page_ids[step_4]: Integersite_enabled: Booleantwo_factor_enabled: Booleanallowed_countries: Array von Stringsallowed_payment_methods: Array von Keysdebug_mode: Boolean
Legacy-Fallbacks bleiben erhalten:
- Checkout-Slugs
/login-secure/- CF7 Step-2 Legacy-ID/Titel
- CF7 Step-3 Titel-/Formstruktur-Erkennung
Zentrale globale Kompatibilitaetsfunktionen
Beispiele:
wg_debug_log()wg_build_angebot_pricing()wg_get_prefill_user_data()wg_save_user_profile_data()wg_store_order_context()wg_get_order_context()wg_process_checkout_order_submission()wg_finalize_bestellung_account_flow()wg_get_bestellung_admin_edit_link()wg_get_order_resolution_link()wg_login_form_shortcode()wg_password_reset_form_shortcode()wg_user_has_2fa_enabled()wg_session_requires_2fa()
Die Wrapper liegen in includes/Compatibility.php und sind function_exists()-geschuetzt.
Zentrale Hooks und Integrationen
Checkout / CF7:
wpcf7_initwpcf7_form_tagwpcf7_form_elementswpcf7_before_send_mail
WordPress Login / 2FA:
login_urlsite_urlwp_loginlogin_redirectrest_api_init
Admin / Profile / CPTs:
add_meta_boxessave_postshow_user_profileedit_user_profilepersonal_options_updateedit_user_profile_update
Frontend / Assets:
render_blockwp_enqueue_scriptstemplate_redirectwp_ajax_benutzerdaten_vorschau_refreshrest_api_initfuercustom/v1/spickzettel-url
Migrationshinweise aus dem Child Theme
- Die reduzierte Theme-
functions.phpbleibt Bridge und enthaelt keine alte Business-Logik mehr. - Bestehende globale
wg_*-Funktionsnamen werden im Plugin weiter bereitgestellt. - Der REST-Endpoint
custom/v1/spickzettel-urlliegt in der Membership Suite. - Die Nonce-Injection
window.wpRestNonceist site-spezifisch und bleibt in der jeweiligen Theme-functions.php. - Keine destruktive Datenmigration.
- Keine Datenloeschung bei Deaktivierung.
- Bestehende Bestellungen, Angebote, Rechnungen und User-Meta bleiben lesbar.
- Rollenlogik
abonnent_<angebot_id>bleibt unveraendert. - Erweiterungen erzeugen keine Rollen.
- Die alte AJAX-Step-3-Bestelluebersicht wurde bewusst nicht wieder eingefuehrt.
Spickzettel REST-Endpoint
- Namespace:
custom/v1 - Route:
/spickzettel-url - Methode:
GET - Runtime-Ort: Membership Suite
- Site-spezifische
window.wpRestNonce-Bereitstellung gehoert nicht ins Plugin. - Der Endpoint liefert nur fuer den aktuell eingeloggten Nutzer die eigene
spickzettel_url. - Response-Struktur bleibt kompatibel:
user_idundurl
Multisite-Status
- Single Site wird unterstuetzt.
- Multisite mit site-lokaler Aktivierung wird unterstuetzt.
- Multisite mit Network Activation wird unterstuetzt.
- Fachliche Settings bleiben pro Site.
- CF7-Formular-IDs muessen pro Site gesetzt werden.
- Page-IDs muessen pro Site gesetzt werden.
- Bei Network Activation werden bestehende Sites initialisiert.
- Neue Sites werden ueber
wp_initialize_siteinitialisiert, wenn das Plugin network activated ist. - Der Schalter
Membership Suite auf dieser Site aktivist ein site-lokaler Runtime-Schalter. site_enabled = 1aktiviert die Membership-Suite-Runtime auf dieser Site.site_enabled = 0registriert Frontend-, Checkout-, Shortcode-, 2FA- und LMS-Runtime-Module auf dieser Site nicht.- CPTs, Settings und Admin-Grundfunktionen bleiben erreichbar.
- Es werden keine Daten, Optionen, Rollen oder Inhalte geloescht.
- Der Schalter ersetzt nicht die WordPress-Plugin-Aktivierung.
- Deaktivierung loescht keine Daten.
- Es gibt keine destruktive Migration.
Technische Network-Information:
wg_membership_suite_network_activatedist eine Network-Option und wird technisch ueberget_site_option(),update_site_option()unddelete_site_option()verwaltet, um die netzwerkweite Aktivierung zu markieren.
Bewusst site-lokal bleibende Settings:
cf7_step2_form_idcf7_step3_form_idlogin_page_idpassword_reset_page_idcheckout_page_idsallowed_countriesallowed_payment_methodstwo_factor_enableddebug_modesite_enabled
Verhalten bei Deaktivierung
- Deaktivierung loescht keine Daten.
uninstall.phpfuehrt keine destruktive Bereinigung aus.- Network Deactivation flusht Rewrites pro Site, loescht aber keine Inhalte, Rollen oder Optionen.
Manuelle Testcheckliste
Allgemein:
- Plugin aktivieren ohne Fatal Error
- Plugin deaktivieren ohne Fatal Error
- Permalinks nach Aktivierung einmal speichern
- Debug-Modus aus
- Debug-Modus an
Settings:
- Integer-IDs speichern
- Leere IDs ohne Fatal Error
- Legacy-Fallbacks bei leerer Konfiguration
site_enabled = 0site_enabled = 1nach vorheriger Deaktivierung
CPTs:
wg_angebotregistriertwg_bestellungregistriertwg_rechnungregistriert- Vorhandene Posts aller drei Typen lesbar
Checkout / CF7:
- Verhalten ohne Contact Form 7
- Verhalten ohne GenerateBlocks
- Step 1 Weiterleitung
- Step 2 Formularerkennung via gespeicherter Formular-ID
- Step 2 Legacy-Fallback
- Step 2 Prefill
- Step 2 Speichern
- Step 3 Formularerkennung via gespeicherter Formular-ID
- Step 3 Legacy-Fallback
- Step 3 serverseitige Ausgabe ueber
[bestelluebersicht] - Wiederholte Submits mit gleichem
checkout_tokenerzeugen keine Duplikate - Erweiterung wird in Summary und Bestellung separat gefuehrt
- Gast-/
wg_ot-Flow, falls auf der Site genutzt
Bestellung / Account-Finalisierung:
- Exakter Dubletten-Treffer verknuepft bestehendes Konto
- Konfliktfall landet in
pending_admin_review - Admin-Resolve-Links funktionieren
- Neues Konto wird nur im Finalisierungspfad angelegt
Rollen:
- Rollenvergabe nur fuer Hauptangebot
- Keine Rollenvergabe fuer Erweiterungen
Zahlungsart und Preislogik:
- Angebots-Hard-Rule fuer
zahlungsformgreift - Step-3-Summary und gespeicherte Bestellung zeigen dieselbe effektive Zahlungsart
- Zentrale Preislogik bleibt ueber
wg_build_angebot_pricing()
Login / Reset / 2FA:
[wg_login_form redirect="/schreibtisch"]- Reset-Flow ueber
[wg_password_reset_form] - 2FA deaktiviert: keine stoerenden Rewrite-/Redirect-/REST-Seiteneffekte
- 2FA aktiviert: Pending-State, Verify, Resend
- Redirect nach erfolgreicher 2FA mit und ohne
redirect_to
Frontend / Avatar / Downloads:
[user_avatar_form][user_pdf_downloads]- Eingeloggter Nutzer ruft
custom/v1/spickzettel-urlmit gueltiger REST-Nonce auf - Gast wird am Spickzettel-Endpoint abgelehnt
- Fehlende oder ungueltige REST-Nonce wird am Spickzettel-Endpoint abgelehnt
- Response-Struktur von
custom/v1/spickzettel-urlbleibt kompatibel [benutzerdaten_vorschau]- Avatar negativer Test: falscher Dateityp
- Avatar negativer Test: Datei groesser als 2 MB
- Avatar negativer Test: ungueltige Nonce
- Avatar negativer Test: Gastzugriff
- AJAX-Refresh
benutzerdaten_vorschau_refreshmit gueltiger Nonce - AJAX-Refresh negativer Test: ohne Nonce
- AJAX-Refresh negativer Test: ungueltige Nonce
- AJAX-Refresh negativer Test: Gastzugriff
LMS / Punkte:
[render_etappe_progress][wg_punkte][wg_punkte_transaktionen]- Quiz-/Aktivitaets-Sync auf Zielseite
MediaElement:
- Normale Seiten ohne Medien laden keine Speed-Assets
- Medienseiten mit Audio/Video laden Speed-Assets
- Filter
wg_membership_load_mediaelement_speed_assetskann das Verhalten ueberschreiben
Multisite:
- Multisite mit site-lokaler Aktivierung
- Multisite mit Network Activation
- Neue Site im Netzwerk nach Network Activation
site_enabled = 0und wieder1auf einer einzelnen Site- Network Deactivation loescht keine Daten
Scope
WordPress plugin for WebGefaehrte membership, checkout, LMS access, user profiles, offers, orders, and integrations with GenerateBlocks and Contact Form 7.
Architecture
wg-membership-suite: Membership, checkout, LMS, login, orders, offerscustom-functionality-deployment: shared site-wide functionality- child theme
functions.php: site-specific exceptions only
Status
Private internal WordPress plugin.