Dokumentation · Technische Dokumentation

Plugin-Bootstrap und Lebenszyklus

Dieses Dokument beschreibt, wie das ADP Car Market Hub-Plugin geladen wird, was während der Aktivierung, Deaktivierung und Deinstallation geschieht und welche Migrationen das Plugin beim Booten ausführt.

Wann Sie dieses Dokument verwenden sollten

Lesen Sie dieses Dokument, wenn Sie Folgendes tun müssen:

  • Den Ablauf verfolgen, in dem der Plugin-Code während einer WordPress-Anfrage ausgeführt wird.
  • Verstehen, welche Aktionen bei der Aktivierung und Deaktivierung ausgeführt werden (Berechtigungen, Standardseiten, benutzerdefinierte Tabellen, geplante Ereignisse).
  • Ein Upgrade planen oder Fehler bei einer Migration beheben, die nicht angewendet wurde.
  • Entscheiden, wo Sie benutzerdefinierten Code einhaken (hooken) möchten, damit er ausgeführt wird, nachdem die Dienste des Plugins verfügbar sind.

Übersicht

Das Plugin wird aus der Hauptdatei adp-car-market-hub.php gestartet. Diese Datei ist absichtlich kurz gehalten und führt nur Arbeiten aus, die zum Zeitpunkt des Ladens der Datei erfolgen müssen. Der gesamte Feature-Code wird über einen Autoloader im PSR-4-Stil geladen und vom AS24CI\Plugin-Singleton auf der plugins_loaded-Aktion verknüpft.

Beim Laden definierte Konstanten

adp-car-market-hub.php definiert die folgenden Konstanten, bevor Hooks ausgeführt werden:

  • AS24CI_VERSION — Aktuelle Plugin-Version (wird mit dem Plugin-Header und readme.txt synchron gehalten).
  • AS24CI_PLUGIN_FILE — Absoluter Pfad zur Hauptdatei des Plugins.
  • AS24CI_PLUGIN_DIR — Verzeichnis des Plugins (mit abschliessendem Schrägstrich).
  • AS24CI_PLUGIN_URL — URL zum Plugin-Verzeichnis, nützlich für das Einreihen von Assets.

Die Datei ruft auch require_once AS24CI_PLUGIN_DIR . 'src/Core/Helpers.php' auf, um gemeinsam genutzte prozedurale Hilfsfunktionen zu laden, und definiert bedingt die globalen Hilfsfunktionen as24ci_format() und as24ci_get_available_ai_models(), falls zuvor keine Funktion mit demselben Namen deklariert wurde.

Autoloader

Unmittelbar nach den Konstanten registriert die Datei einen kleinen PSR-4-kompatiblen Autoloader für den Namespace AS24CI\. Klassennamen werden auf Dateinamen der Form class-as24ci-<lower-dashed-name>.php abgebildet. Der Autoloader sucht zuerst in includes/ und weicht für reine Admin-Klassen auf includes/admin/ aus.

Hook-Registrierung beim Laden

Die Hauptdatei registriert die folgenden Hooks, bevor Feature-Code ausgeführt wird:

HookCallbackZweck
plugins_loaded (Priorität 1)as24ci_load_textdomainLädt die Textdomain adp-car-market-hub aus /languages.
plugins_loaded (Standardpriorität)AS24CI\Plugin::initErstellt das Singleton und registriert alle Feature-Hooks.
register_activation_hookAS24CI\Plugin::activateWird einmal ausgeführt, wenn das Plugin aktiviert wird.
register_deactivation_hookAS24CI\Plugin::deactivateWird einmal ausgeführt, wenn das Plugin deaktiviert wird.
cron_schedulesas24ci_add_custom_cron_intervalsRegistriert das benutzerdefinierte WP-Cron-Intervall as24ci_every_5_minutes (300 s).
plugin_action_links_<basename>as24ci_add_plugin_action_linksFügt die Links "Lizenzaktivierung" und "Einstellungen" auf der WordPress-Plugin-Seite hinzu.
plugin_row_metaas24ci_add_plugin_row_metaFügt einen "Dokumentation"-Link zu den Zeilen-Metadaten des Plugins hinzu.

Die Hauptdatei initialisiert auch das Content Studio-Modul beim Laden, unabhängig vom AS24CI\Plugin-Router:

  • register_activation_hookAS24CI\Content_Studio_Repository::maybe_create_tables (erstellt die Content Studio-Tabellen bei der Aktivierung).
  • admin_menu (Priorität 30) → AS24CI\Admin_Tab_Content_Studio::register_menu.
  • plugins_loaded (Priorität 20) → AS24CI\Content_Studio_Admin_Worker::register_hooks.

Das benutzerdefinierte WP-Cron-Intervall wird bedingungslos registriert, damit WordPress immer davon weiss, selbst wenn einzelne Feature-Optionen, die es verwenden, deaktiviert sind.

Bootstrap-Ablauf (normale Anfrage)

Wenn WordPress das Plugin während einer normalen Anfrage lädt, erfolgen die folgenden Schritte nacheinander:

  1. Die Hauptdatei wird eingebunden; Konstanten, Autoloader und die oben aufgeführten Hooks werden registriert.
  2. WordPress löst plugins_loaded mit Priorität 1 aus: as24ci_load_textdomain() führt load_plugin_textdomain() aus, damit Übersetzungen verfügbar sind, bevor übersetzbare Zeichenketten gerendert werden.
  3. WordPress löst plugins_loaded mit der Standardpriorität aus: AS24CI\Plugin::init() erstellt das Singleton.
  4. Der Konstruktor von AS24CI\Plugin: - Instanziiert die gemeinsam genutzten Dienste: Logger, Client, Image_Importer, Vehicle_Repository, Importer, Scheduler. - Ruft Vehicle_Field_Resolver::set_repository() auf, damit der zentrale Feld-Resolver aus der Fahrzeugtabelle lesen kann. - Ruft Vehicle_Deleter::set_repository() und Vehicle_Deleter::register_hooks() auf, damit jeder Pfad zum endgültigen Löschen (natives WordPress, vollständige Synchronisierung des Importers, Massenaktion) über eine einzige, idempotente Bereinigung läuft. - Ruft register_hooks() auf, um alle Features für die aktuelle Anfrage zu verknüpfen.
  5. register_hooks() verknüpft zwei admin_init-Callbacks (sie werden während plugins_loaded verknüpft, aber erst bei einem späteren admin_init in wp-admin ausgelöst): - AS24CI\Plugin::maybe_upgrade_caps() — stellt sicher, dass Rollen und Berechtigungen für die aktuelle Plugin-Version existieren. - AS24CI\Plugin::maybe_upgrade() — führt Options-/Datenmigrationen aus.
  6. register_hooks() registriert dann die eigenen Hooks jedes Subsystems: - Immer aktiv: CPT, Taxonomies, Leads_CPT, Contact_Form, Templates, Assets, Ajax, Archive_Filters, Cron_Endpoint, License_Manager, License_Refresh_Signal, Webhooks, Analytics, Ai_Assistant, Data_Quality_Scanner, Pricing_Engine (mit täglichem Zeitplan), Financing_Calculator, Rest_Api, Locations, Seller_Profile_Fields, plus der Scheduler. Das private Updater wird hier ebenfalls verknüpft, beschränkt auf Admin- / WP-Cron- / WP-CLI-Kontexte. - Eingeschränkt durch Feature-Optionen auf AS24CI\Options: Schema (plus Seo_Compatibility), Sitemap, Social_Share, Pdf_Datasheet, Favorites, Compare, Export, Bulk_Actions, Search_Agent. - Nur Admin (is_admin() ist true): der AS24CI\Admin-Controller, Admin_Team (CMH Team), Update_Visibility und Admin_Setup_Wizard sowie — wenn Options::FEATURE_DASHBOARD_WIDGET aktiviert ist — das Dashboard-Widget.
  7. WordPress fährt mit dem Rest des Anfrage-Lebenszyklus fort. Die meisten Feature-Klassen registrieren zusätzliche Hooks bei späteren Aktionen wie init (Post-Typen, Taxonomien, Tabellenerstellung für Suchaufträge), rest_api_init (REST-Routen), wp_footer (Analytics-Tracking-Pixel) oder admin_init (reine Admin-Tabellen-Upgrades).

Aktivierung

AS24CI\Plugin::activate() ist mit register_activation_hook registriert und wird einmal ausgeführt, wenn ein Administrator das Plugin aktiviert. Es führt die folgenden Arbeiten in dieser Reihenfolge aus:

  1. Ruft seed_safe_defaults() auf, das add_option() verwendet, um konservative Standardwerte für die erste Einrichtung zu installieren. Bestehende Werte werden niemals überschrieben. Wichtige Standardwerte: - as24ci_default_currency = EUR. - as24ci_default_post_status = draft, damit Administratoren die Mappings vor der Veröffentlichung überprüfen können. - as24ci_max_images = 30 (eine feste Obergrenze statt unbegrenzt). - as24ci_full_sync = 0 (endgültiges Löschen bleibt Opt-in). - Frontend-freundliche Funktionen (Sitemap, Schema, Favoriten, Vergleich, Finanzierung, Dashboard-Widget, Export, Lazy Loading, Layout Manager) sind standardmässig aktiviert; Tracking, externe, Batch- und risikoreiche Funktionen (Analytics, REST-API, AI Assistant, Social Share, PDF-Datenblatt, Probefahrt) sind standardmässig deaktiviert.
  2. Ruft add_option( Options::SETUP_FIRST_ACTIVATION_AT, gmdate('c') ) auf, um den Zeitstempel der Erstaktivierung zu erfassen, der für den Setup-Assistenten-Admin-Hinweis verwendet wird. Da add_option() wirkungslos bleibt, wenn der Wert bereits existiert, bleibt das ursprüngliche Datum bei Reaktivierungen erhalten.
  3. Ruft ensure_roles_and_caps() auf, was: - Die Rolle as24ci_editor erstellt, falls sie nicht existiert. - Den Berechtigungssatz as24ci_car / as24ci_cars sowohl für as24ci_editor als auch für administrator erteilt. - Die Berechtigung manage_as24_imports (die Konstante Plugin::CAP_MANAGE) ausschliesslich für Administratoren hinzufügt. Diese Berechtigung schützt die Benutzeroberfläche für Importer, Einstellungen, Werkzeuge und Logs.
  4. Setzt as24ci_caps_version auf 1, damit die Berechtigungsmigration bei nachfolgenden Anfragen nicht erneut ausgeführt wird.
  5. Setzt as24ci_db_version auf 5, damit die in maybe_upgrade() definierten Datenmigrationen bei einer Neuinstallation übersprungen werden.
  6. Ruft maybe_create_default_pages() auf, um optional die Seiten Cars, Compare Cars und Favorites zu erstellen und deren Post-IDs in as24ci_page_archive_id, as24ci_page_compare_id und as24ci_page_favorites_id zu speichern. Dieses Verhalten wird durch die Option as24ci_create_default_pages und die Filter as24ci_default_pages_enabled und as24ci_default_pages gesteuert.
  7. Ruft Analytics::maybe_create_table() auf, um die Analytics-Tabelle zu erstellen.
  8. Ruft Vehicle_Repository::maybe_create_table() auf, um die dedizierte Fahrzeugtabelle zu erstellen.
  9. Plant die tägliche Bereinigung der Analytics-Aufbewahrung (as24ci_daily_cleanup), falls noch nicht geplant.
  10. Ruft License_Manager::ensure_cron_scheduled() auf, um das tägliche Ereignis zur Lizenz-Revalidierung (as24ci_license_refresh) zu planen.
  11. Ruft CPT::register_post_type() und anschliessend flush_rewrite_rules() auf, damit das /cars-Archiv sofort nach der Aktivierung funktioniert.
  12. Protokolliert Plugin activated (v<version>). über AS24CI\Logger.

Die Content Studio-Tabellen werden durch einen separaten Aktivierungs-Hook (Content_Studio_Repository::maybe_create_tables) erstellt, der in der Hauptdatei des Plugins registriert ist, nicht durch Plugin::activate().

activate() fügt bewusst keine Standard-API-URLs ein. Fehlende Konfigurationen werden über die Systemstatus- / Systemzustands-UI sowie über Client-Fehler beim Ausführen des Importers sichtbar gemacht.

Berechtigungs- und Datenmigrationen

Zwei statische Methoden sind auf admin_init (nicht plugins_loaded) verknüpft, um bestehende Installationen mit der aktuellen Plugin-Version synchron zu halten. Das Einhaken in admin_init verhindert, dass der erweiterbare Authentifizierungs-Stack bei jeder Anfrage vorzeitig geladen werden muss:

  • maybe_upgrade_caps() — Verknüpft auf admin_init. Schützt vor AJAX-, Cron- und REST-Anfragen (bricht in diesen Kontexten vorzeitig ab) und verwendet eine statische Sperre pro Anfrage, sodass der Migrationskörper höchstens einmal ausgeführt wird. Es ist nicht von manage_options abhängig. Vergleicht as24ci_caps_version mit dem Zielwert (zum Zeitpunkt der Erstellung dieses Dokuments 1) und führt ensure_roles_and_caps() bei Bedarf erneut aus.
  • maybe_upgrade() — Verknüpft auf admin_init; bricht vorzeitig ab, ausser wenn is_admin(). Vergleicht as24ci_db_version mit dem Zielwert (5) und wendet alle ausstehenden Migrationsschritte an. Jeder Schritt ist idempotent:
  • Migration 1: Nur Markierung, keine Datenänderungen.
  • Migration 2: Erzwingt die Analytics-Einwilligungsoption (Options::ANALYTICS_REQUIRE_CONSENT) auf 0. Administratoren können diese in den Einstellungen wieder aktivieren.
  • Migration 3: Migriert die veraltete Option FINANCING_PLACEMENT in die neuen Layout Manager-Zonen. Die Migration schreibt nur dann in eine Layout Manager-Zone, wenn diese Zone noch nicht gespeichert wurde, sodass bestehende Layouts erhalten bleiben.
  • Migration 4: Wendet seed_safe_defaults() erneut an, damit bestehende Installationen neue sichere Standardwerte erhalten, ohne Werte zu überschreiben, die der Administrator bereits festgelegt hat.
  • Migration 5: Schützt Klartext-Geheimnisse im Ruhezustand. Reversible Geheimnisse (Options::CLIENT_SECRET, Options::HUB_API_KEY, Options::WEBHOOK_SECRET) werden über Secrets::encrypt() verschlüsselt, und das Cron-Token (Options::CRON_TOKEN) wird durch seinen keyed HMAC-Hash über Secrets::hash_token() ersetzt. Die Migration ist idempotent (bereits geschützte Zeilen werden übersprungen) und das zwischengespeicherte OAuth-Bearer-Token wird gelöscht, damit es über den verschlüsselten Pfad neu gespeichert wird. Nach allen anwendbaren Schritten wird die Option auf die aktuelle Zielversion aktualisiert.


Deaktivierung

AS24CI\Plugin::deactivate() wird einmal ausgeführt, wenn ein Administrator das Plugin deaktiviert. Bestehende Daten bleiben erhalten. Die Methode:

  1. Ruft wp_clear_scheduled_hook( Scheduler::CRON_HOOK ) auf, um ausstehende as24ci_scheduled_import-Events zu entfernen.
  2. Ruft wp_clear_scheduled_hook( Analytics::ANALYTICS_CLEANUP_CRON_HOOK ) auf, um das tägliche Analytics-Retention-Event zu entfernen.
  3. Ruft Ai_Assistant::clear_ai_queue_schedule() auf, um das Cron-Event für die AI-Hintergrund-Queue zu entfernen.
  4. Ruft Pricing_Engine::clear_schedule() auf, um das tägliche Cron-Event der Pricing-Engine zu entfernen.
  5. Ruft License_Manager::clear_cron() auf, um das tägliche Event zur Lizenz-Revalidierung (as24ci_license_refresh) zu entfernen.
  6. Ruft wp_clear_scheduled_hook( 'as24ci_competitor_watcher_cron' ) auf, nur als Legacy-Bereinigung — die Funktion Competitor Watcher (und ihre Klasse) wurde entfernt; der Hook-Name ist hier fest codiert, damit eventuell verbliebene geplante Events auf Installationen, die von älteren Versionen aktualisiert wurden, dennoch gelöscht werden.
  7. Löscht den Transient Scheduler::LOCK_TRANSIENT (as24ci_cron_import_running), falls das Plugin deaktiviert wird, während ein Import läuft.
  8. Ruft flush_rewrite_rules() auf und protokolliert Plugin deactivated.

Da die Deaktivierung die Datenbanktabellen, Custom Post Types oder Optionen nicht berührt, stellt eine Reaktivierung des Plugins den vorherigen Zustand wieder her.

Deinstallation

Wenn das Plugin aus dem WordPress-Admin gelöscht wird (nicht nur deaktiviert), führt WordPress die Funktion uninstall.php aus. Das Skript:

  1. Lädt AS24CI\Options (falls die Datei existiert), damit die massgebliche Liste der Optionsschlüssel aus Options::get_all_keys() abgeleitet werden kann, plus eine kleine Gruppe zusätzlicher Schlüssel (as24ci_models_cache_keys, as24ci_page_archive_id, as24ci_page_compare_id und das veraltete as24ci_api_total_cache). Eine fest codierte Fallback-Liste wird verwendet, falls die Klasse nicht geladen werden kann.
  2. Löscht Plugin-Transients (as24ci_access_token, as24ci_cron_import_running, as24ci_image_queue_running).
  3. Löscht geplante Events für as24ci_scheduled_import und as24ci_daily_cleanup.
  4. Liest die Option as24ci_delete_data_on_uninstall. Wenn der Wert 1 ist, löscht das Skript: - Alle as24ci_car-Beiträge (erzwungen). - Alle Attachment-IDs, die im _as24ci_image_ids-Postmeta jedes Fahrzeugs gespeichert sind. Manuelle Galerie-Anhänge (_as24ci_manual_image_ids) werden absichtlich nicht gelöscht. - Das Beitragsbild (Featured Image) jedes Fahrzeugs (defensive Bereinigung). - Alle as24ci_lead-Beiträge. - Die bei der Aktivierung erstellten Seiten für Fahrzeuge (Cars), Vergleich (Compare) und Favoriten (Favorites).
  5. Löscht immer die benutzerdefinierten Tabellen (unabhängig vom Opt-in-Flag): - {$wpdb->prefix}as24ci_analytics - {$wpdb->prefix}as24_vehicles - {$wpdb->prefix}as24ci_search_agents - {$wpdb->prefix}as24ci_content_studio_assets - {$wpdb->prefix}as24ci_content_studio_jobs Die passenden Schema-Version-Optionen (as24ci_vehicles_db_version, as24ci_search_agent_db_version, as24ci_content_studio_db_version) werden ebenfalls entfernt.
  6. Löscht alle gesammelten Optionsschlüssel für die Website.
  7. Bei Multisite-Installationen läuft dieselbe Routine einmal pro Website über switch_to_blog().

Konfigurationsreferenz

Das Bootstrap- und Lebenszyklus-Verhalten wird durch die folgenden Optionen beeinflusst (alle als Konstanten auf AS24CI\Options definiert). Der vollständige Katalog ist im Dokument Options And Settings Storage dokumentiert; hier sind nur die für den Lebenszyklus relevanten Einträge aufgeführt.

OptionsschlüsselKonstanteVerwendet von
as24ci_caps_versionOptions::CAPS_VERSIONmaybe_upgrade_caps(), um zu entscheiden, ob Capabilities ausgeführt werden müssen.
as24ci_db_versionOptions::DB_VERSIONmaybe_upgrade(), um zu entscheiden, welche Migrationen angewendet werden sollen.
as24ci_create_default_pagesOptions::CREATE_DEFAULT_PAGESmaybe_create_default_pages() während der Aktivierung.
as24ci_page_archive_idn/aSpeichert die ID der bei der Aktivierung erstellten Cars-Seite.
as24ci_page_compare_idn/aSpeichert die ID der bei der Aktivierung erstellten Compare-Seite.
as24ci_page_favorites_idn/aSpeichert die ID der bei der Aktivierung erstellten Favorites-Seite.
as24ci_delete_data_on_uninstallOptions::DELETE_DATA_ON_UNINSTALLuninstall.php, um zu entscheiden, ob Inhalte gelöscht werden sollen.

Betriebliche Hinweise

  • register_activation_hook wird nur ausgelöst, wenn ein Administrator das Plugin über den Plugins-Bildschirm aktiviert. Das Aktualisieren der Plugin-Dateien löst keine Aktivierung aus; aus diesem Grund existiert maybe_upgrade().
  • Da maybe_upgrade() und maybe_upgrade_caps() an admin_init gekoppelt sind und nur bei echten Admin-Seitenaufrufen (nicht bei AJAX, REST oder Cron) ausgeführt werden, zahlen reine Frontend-Anfragen nicht den Preis für Migrationsprüfungen. Der erste Admin-Seitenaufruf nach einem Update wendet alle ausstehenden Migrationen an.
  • Die WP-Cron-Sperrzeiten (Lock TTLs) des Plugins sind konservativ: Die Importsperre (Scheduler::LOCK_TTL) beträgt ca. 40 Minuten. Wenn ein Prozess mitten im Lauf abgebrochen wird, wird die Sperre automatisch freigegeben, sobald der Transient abläuft. Die manuelle Wiederherstellung ist in der Scheduler-Dokumentation beschrieben.
  • Die Deinstallation löscht immer die Tabellen für Analytics, Fahrzeuge und Suchaufträge, da diese persönliche Daten oder Besucherdaten enthalten können. Beiträge und Optionen werden nur entfernt, wenn der Administrator dies über die Einstellung as24ci_delete_data_on_uninstall aktiviert hat.

Fehlerbehebung

  • Die Aktivierung erstellt die Cars-Seite nicht. Vergewissern Sie sich, dass as24ci_create_default_pages auf 1 gesetzt ist und dass kein Theme oder anderes Plugin as24ci_default_pages_enabled auf false filtert. Die Seite wird auch dann nicht neu erstellt, wenn bereits eine Seite mit demselben Titel existiert; in diesem Fall wird deren ID wiederverwendet.
  • Benutzerdefinierte Capabilities fehlen für einen Administrator. Rufen Sie eine beliebige Admin-Seite auf, damit maybe_upgrade_caps() auf admin_init ausgeführt werden kann, oder löschen Sie vorübergehend as24ci_caps_version aus wp_options, um die erneute Ausführung der Migration zu erzwingen. Die Migration wird bei AJAX-, REST- und Cron-Anfragen übersprungen, sie muss also während eines echten Admin-Seitenaufrufs ausgeführt werden.
  • Ein Migrationsschritt wurde nicht angewendet. Überprüfen Sie den Wert von as24ci_db_version. Wenn er bereits dem Zielwert entspricht, wurde die Migration bereits ausgeführt. Senken Sie den Wert nur dann manuell ab, wenn Sie die Konsequenzen für Ihre Installation verstehen.
  • Das /cars-Archiv gibt unmittelbar nach der Aktivierung einen 404-Fehler zurück. Die Aktivierung ruft bereits flush_rewrite_rules() auf. Wenn das Archiv immer noch nicht erreichbar ist, gehen Sie zu Einstellungen → Permalinks und speichern Sie einmal, um WordPress zu zwingen, seinen Rewrite-Cache neu aufzubauen.

Verwandte Dokumente