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 undreadme.txtsynchron 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:
| Hook | Callback | Zweck |
|---|---|---|
plugins_loaded (Priorität 1) | as24ci_load_textdomain | Lädt die Textdomain adp-car-market-hub aus /languages. |
plugins_loaded (Standardpriorität) | AS24CI\Plugin::init | Erstellt das Singleton und registriert alle Feature-Hooks. |
register_activation_hook | AS24CI\Plugin::activate | Wird einmal ausgeführt, wenn das Plugin aktiviert wird. |
register_deactivation_hook | AS24CI\Plugin::deactivate | Wird einmal ausgeführt, wenn das Plugin deaktiviert wird. |
cron_schedules | as24ci_add_custom_cron_intervals | Registriert das benutzerdefinierte WP-Cron-Intervall as24ci_every_5_minutes (300 s). |
plugin_action_links_<basename> | as24ci_add_plugin_action_links | Fügt die Links "Lizenzaktivierung" und "Einstellungen" auf der WordPress-Plugin-Seite hinzu. |
plugin_row_meta | as24ci_add_plugin_row_meta | Fü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_hook→AS24CI\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:
- Die Hauptdatei wird eingebunden; Konstanten, Autoloader und die oben aufgeführten Hooks werden registriert.
- WordPress löst
plugins_loadedmit Priorität 1 aus:as24ci_load_textdomain()führtload_plugin_textdomain()aus, damit Übersetzungen verfügbar sind, bevor übersetzbare Zeichenketten gerendert werden. - WordPress löst
plugins_loadedmit der Standardpriorität aus:AS24CI\Plugin::init()erstellt das Singleton. - Der Konstruktor von
AS24CI\Plugin: - Instanziiert die gemeinsam genutzten Dienste:Logger,Client,Image_Importer,Vehicle_Repository,Importer,Scheduler. - RuftVehicle_Field_Resolver::set_repository()auf, damit der zentrale Feld-Resolver aus der Fahrzeugtabelle lesen kann. - RuftVehicle_Deleter::set_repository()undVehicle_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. - Ruftregister_hooks()auf, um alle Features für die aktuelle Anfrage zu verknüpfen. register_hooks()verknüpft zweiadmin_init-Callbacks (sie werden währendplugins_loadedverknüpft, aber erst bei einem späterenadmin_initinwp-adminausgelö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.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 privateUpdaterwird hier ebenfalls verknüpft, beschränkt auf Admin- / WP-Cron- / WP-CLI-Kontexte. - Eingeschränkt durch Feature-Optionen aufAS24CI\Options:Schema(plusSeo_Compatibility),Sitemap,Social_Share,Pdf_Datasheet,Favorites,Compare,Export,Bulk_Actions,Search_Agent. - Nur Admin (is_admin()ist true): derAS24CI\Admin-Controller,Admin_Team(CMH Team),Update_VisibilityundAdmin_Setup_Wizardsowie — wennOptions::FEATURE_DASHBOARD_WIDGETaktiviert ist — das Dashboard-Widget.- 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) oderadmin_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:
- Ruft
seed_safe_defaults()auf, dasadd_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. - 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. Daadd_option()wirkungslos bleibt, wenn der Wert bereits existiert, bleibt das ursprüngliche Datum bei Reaktivierungen erhalten. - Ruft
ensure_roles_and_caps()auf, was: - Die Rolleas24ci_editorerstellt, falls sie nicht existiert. - Den Berechtigungssatzas24ci_car/as24ci_carssowohl füras24ci_editorals auch füradministratorerteilt. - Die Berechtigungmanage_as24_imports(die KonstantePlugin::CAP_MANAGE) ausschliesslich für Administratoren hinzufügt. Diese Berechtigung schützt die Benutzeroberfläche für Importer, Einstellungen, Werkzeuge und Logs. - Setzt
as24ci_caps_versionauf1, damit die Berechtigungsmigration bei nachfolgenden Anfragen nicht erneut ausgeführt wird. - Setzt
as24ci_db_versionauf5, damit die inmaybe_upgrade()definierten Datenmigrationen bei einer Neuinstallation übersprungen werden. - Ruft
maybe_create_default_pages()auf, um optional die SeitenCars,Compare CarsundFavoriteszu erstellen und deren Post-IDs inas24ci_page_archive_id,as24ci_page_compare_idundas24ci_page_favorites_idzu speichern. Dieses Verhalten wird durch die Optionas24ci_create_default_pagesund die Filteras24ci_default_pages_enabledundas24ci_default_pagesgesteuert. - Ruft
Analytics::maybe_create_table()auf, um die Analytics-Tabelle zu erstellen. - Ruft
Vehicle_Repository::maybe_create_table()auf, um die dedizierte Fahrzeugtabelle zu erstellen. - Plant die tägliche Bereinigung der Analytics-Aufbewahrung (
as24ci_daily_cleanup), falls noch nicht geplant. - Ruft
License_Manager::ensure_cron_scheduled()auf, um das tägliche Ereignis zur Lizenz-Revalidierung (as24ci_license_refresh) zu planen. - Ruft
CPT::register_post_type()und anschliessendflush_rewrite_rules()auf, damit das/cars-Archiv sofort nach der Aktivierung funktioniert. - Protokolliert
Plugin activated (v<version>).überAS24CI\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 aufadmin_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 vonmanage_optionsabhängig. Vergleichtas24ci_caps_versionmit dem Zielwert (zum Zeitpunkt der Erstellung dieses Dokuments1) und führtensure_roles_and_caps()bei Bedarf erneut aus.maybe_upgrade()— Verknüpft aufadmin_init; bricht vorzeitig ab, ausser wennis_admin(). Vergleichtas24ci_db_versionmit 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) auf0. Administratoren können diese in den Einstellungen wieder aktivieren. - Migration 3: Migriert die veraltete Option
FINANCING_PLACEMENTin 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 überSecrets::encrypt()verschlüsselt, und das Cron-Token (Options::CRON_TOKEN) wird durch seinen keyed HMAC-Hash überSecrets::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:
- Ruft
wp_clear_scheduled_hook( Scheduler::CRON_HOOK )auf, um ausstehendeas24ci_scheduled_import-Events zu entfernen. - Ruft
wp_clear_scheduled_hook( Analytics::ANALYTICS_CLEANUP_CRON_HOOK )auf, um das tägliche Analytics-Retention-Event zu entfernen. - Ruft
Ai_Assistant::clear_ai_queue_schedule()auf, um das Cron-Event für die AI-Hintergrund-Queue zu entfernen. - Ruft
Pricing_Engine::clear_schedule()auf, um das tägliche Cron-Event der Pricing-Engine zu entfernen. - Ruft
License_Manager::clear_cron()auf, um das tägliche Event zur Lizenz-Revalidierung (as24ci_license_refresh) zu entfernen. - 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. - Löscht den Transient
Scheduler::LOCK_TRANSIENT(as24ci_cron_import_running), falls das Plugin deaktiviert wird, während ein Import läuft. - Ruft
flush_rewrite_rules()auf und protokolliertPlugin 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:
- Lädt
AS24CI\Options(falls die Datei existiert), damit die massgebliche Liste der Optionsschlüssel ausOptions::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_idund das veralteteas24ci_api_total_cache). Eine fest codierte Fallback-Liste wird verwendet, falls die Klasse nicht geladen werden kann. - Löscht Plugin-Transients (
as24ci_access_token,as24ci_cron_import_running,as24ci_image_queue_running). - Löscht geplante Events für
as24ci_scheduled_importundas24ci_daily_cleanup. - Liest die Option
as24ci_delete_data_on_uninstall. Wenn der Wert1ist, löscht das Skript: - Alleas24ci_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). - Alleas24ci_lead-Beiträge. - Die bei der Aktivierung erstellten Seiten für Fahrzeuge (Cars), Vergleich (Compare) und Favoriten (Favorites). - 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_jobsDie passenden Schema-Version-Optionen (as24ci_vehicles_db_version,as24ci_search_agent_db_version,as24ci_content_studio_db_version) werden ebenfalls entfernt. - Löscht alle gesammelten Optionsschlüssel für die Website.
- 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üssel | Konstante | Verwendet von |
|---|---|---|
as24ci_caps_version | Options::CAPS_VERSION | maybe_upgrade_caps(), um zu entscheiden, ob Capabilities ausgeführt werden müssen. |
as24ci_db_version | Options::DB_VERSION | maybe_upgrade(), um zu entscheiden, welche Migrationen angewendet werden sollen. |
as24ci_create_default_pages | Options::CREATE_DEFAULT_PAGES | maybe_create_default_pages() während der Aktivierung. |
as24ci_page_archive_id | n/a | Speichert die ID der bei der Aktivierung erstellten Cars-Seite. |
as24ci_page_compare_id | n/a | Speichert die ID der bei der Aktivierung erstellten Compare-Seite. |
as24ci_page_favorites_id | n/a | Speichert die ID der bei der Aktivierung erstellten Favorites-Seite. |
as24ci_delete_data_on_uninstall | Options::DELETE_DATA_ON_UNINSTALL | uninstall.php, um zu entscheiden, ob Inhalte gelöscht werden sollen. |
Betriebliche Hinweise
register_activation_hookwird 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 existiertmaybe_upgrade().- Da
maybe_upgrade()undmaybe_upgrade_caps()anadmin_initgekoppelt 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_uninstallaktiviert hat.
Fehlerbehebung
- Die Aktivierung erstellt die Cars-Seite nicht. Vergewissern Sie sich, dass
as24ci_create_default_pagesauf1gesetzt ist und dass kein Theme oder anderes Pluginas24ci_default_pages_enabledauffalsefiltert. 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()aufadmin_initausgeführt werden kann, oder löschen Sie vorübergehendas24ci_caps_versionauswp_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 bereitsflush_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.