Dokumentation · Technische Dokumentation
Architektur-Übersicht
Dieses Dokument beschreibt die übergeordnete Architektur des ADP Car Market Hub WordPress-Plugins: wie der Quellcode organisiert ist, welche Klassen die Hauptverantwortung tragen und wie die wichtigsten Funktionen zur Laufzeit miteinander verknüpft sind.
Wann Sie dieses Dokument verwenden sollten
Lesen Sie dieses Dokument, wenn Sie Folgendes tun müssen:
- Einen Überblick über die PHP-Codebasis des Plugins erhalten, bevor Sie sich in ein bestimmtes Subsystem vertiefen.
- Verstehen, welche Klasse für eine bestimmte Funktion verantwortlich ist.
- Eine Anpassung, Integration oder ein Code-Review planen.
Für die schrittweise Bootstrap-Reihenfolge siehe Plugin Bootstrap And Lifecycle. Für Details zur Speicherung siehe Data Model und Database Schema.
Übersicht
Das Plugin ist in PHP implementiert und folgt den Standardkonventionen für WordPress-Plugins. Es verwendet:
- Eine einzige Root-Datei (
adp-car-market-hub.php), die Plugin-Konstanten definiert, einen Autoloader registriert und Bootstrap-Callbacks einhängt. - Einen PHP-Namespace
AS24CI\für alle Klassen. - Die WordPress-Core-APIs für Custom Post Types, Taxonomien, Optionen,
WP-Cron, REST-API, AJAX-Handler und von
dbDeltaverwaltete benutzerdefinierte Tabellen. - Ein zentrales
AS24CI\Plugin-Singleton, das jede Funktion bei derplugins_loaded-Action miteinander verknüpft.
Verzeichnisstruktur auf oberster Ebene
Das Repository ist wie folgt organisiert (es sind nur Verzeichnisse aufgeführt, die für die Laufzeitarchitektur relevant sind):
adp-car-market-hub.php— Haupt-Plugin-Datei. Definiert Konstanten, registriert den Autoloader, lädt die Textdomain, registriert Aktivierungs-/Deaktivierungs-Hooks, registriert benutzerdefinierte WP-Cron-Intervalle und bootstrappt dasAS24CI\Plugin-Singleton aufplugins_loaded.includes/— Gemeinsam genutzte und Frontend-PHP-Klassen, eine Klasse pro Datei. Dateinamen folgen dem Musterclass-as24ci-<name>.phpund werden über den Autoloader zur KlasseAS24CI\<Name>aufgelöst.includes/admin/— Nur für den Admin-Bereich bestimmte PHP-Klassen (Einstellungs-Tabs, List-Table-Hilfsklassen, Dashboard-Widgets). Werden vom selben Autoloader als Fallback aufgelöst, wenn eine Klasse unterincludes/nicht gefunden wird.src/Core/Helpers.php— Gemeinsam genutzte prozedurale Hilfsfunktionen, die bedingungslos aus der Haupt-Plugin-Datei geladen werden.templates/— Frontend-Templates und Template-Teile, die von Themes überschrieben werden können.assets/— Admin- und Frontend-CSS, JavaScript und Bilder.languages/— Übersetzungsdateien; die Textdomain istadp-car-market-hub.uninstall.php— Wird ausgeführt, wenn das Plugin aus WordPress gelöscht wird, und entfernt Plugin-Optionen sowie (optional) importierte Inhalte.
Autoloader
adp-car-market-hub.php registriert einen kleinen PSR-4-kompatiblen Autoloader
für das Präfix AS24CI\. Klassennamen werden in die Dateinamenskonvention
class-as24ci-<lower-case-name-with-dashes>.php konvertiert. Der
Autoloader sucht zuerst in includes/ und dann in includes/admin/,
sodass gemeinsam genutzte und nur für den Admin-Bereich bestimmte Klassen einen einzigen Namespace teilen können.
Kernklassen und ihre Aufgaben
Die folgenden Klassen bilden das Rückgrat des Plugins. Die Namen sind in ihrer vollqualifizierten Form (AS24CI\<Class>) angegeben.
Bootstrap und gemeinsam genutzte Dienste
AS24CI\Plugin— Singleton-Einstiegspunkt. Erstellt die gemeinsam genutzten Dienstinstanzen (Logger,Client,Image_Importer,Vehicle_Repository,Importer,Scheduler), verknüpft alle WordPress-Hooks für den aktiven Funktionsumfang und stellt die statischenactivate()/deactivate()/init()-Callbacks bereit.AS24CI\Logger— Leichtgewichtiger Logger, der im gesamten Plugin für Importer- und Scheduler-Meldungen verwendet wird.AS24CI\Options— Zentrales Register für Optionsschlüssel, die als Klassenkonstanten bereitgestellt werden (z. B.Options::DB_VERSION,Options::DEFAULT_CURRENCY,Options::AUTO_IMPORT_ENABLED). Das Skriptuninstall.phpverwendetOptions::get_all_keys(), um Optionen bei der Deinstallation des Plugins zu bereinigen.
Daten und Speicherung
AS24CI\CPT— Registriert den Custom Post Typeas24ci_carmit benutzerdefiniertem Berechtigungs-Mapping (as24ci_car/as24ci_cars) und der kombinierten Metabox "AutoScout24 API Import".AS24CI\Taxonomies— Registriert die 15 Fahrzeugattribut-Taxonomien, die anas24ci_carangehängt sind (Marke, Modell, Karosserieform, Kraftstoffart, Getriebe, Antrieb, Zustand, Aussen-/Innenfarbe, Schadstoffklasse, Energieetikette, Fahrzeugkategorie, Garantieart, Garantiedetails, Zylinderanordnung).AS24CI\Leads_CPT— Registriert den Custom Post Typeas24ci_lead, der zur Speicherung von Kontaktformular-Anfragen verwendet wird, mit Statuskonstanten fürnew,contacted,closedundspam.AS24CI\Vehicle_Repository— Repository für die dedizierte benutzerdefinierte Tabelle{$wpdb->prefix}as24_vehicles, die Fahrzeugfelddaten enthält (anstelle vonwp_postmeta). Bietet Schema-Verwaltung (maybe_create_table()), CRUD-Hilfsmethoden sowie Filter- und Sortierungs-Whitelists, die vonfind()verwendet werden.AS24CI\Vehicle_Field_Resolver— Zentraler Reader, der Fahrzeugfelder auflöst, indem er Repository-Daten mit manuellen Überschreibungen kombiniert. Wird während der Erstellung vonPluginüberVehicle_Field_Resolver::set_repository()verknüpft.AS24CI\Vehicle_Deleter— Einziger, idempotenter Bereinigungspfad, der immer dann verwendet wird, wenn ein Fahrzeug dauerhaft gelöscht wird (natives WP-Löschen, Vollsynchronisations-Löschung des Importers, Massenaktion). Wird während der Erstellung vonPluginverknüpft.
Import-Pipeline
AS24CI\Client— HTTP-Client für die AutoScout24-API. Übernimmt die Authentifizierung und die Ausführung von Anfragen.AS24CI\Mapper— Weist eingehende AutoScout24-Fahrzeugdaten der internen Feldstruktur des Repositories zu und schreibt die_as24ci_listing_id-Postmeta aus Gründen der Abwärtskompatibilität.AS24CI\Importer— Koordiniert den Import pro Fahrzeug: Ruft Daten überClientab, transformiert sie überMapper, speichert Fahrzeuge über das Repository und verfolgt die Änderungserkennung über die Postmeta-Schlüssel_as24ci_content_hashund_as24ci_images_hash.AS24CI\Image_Importer— Lädt Fahrzeugbilder herunter und hängt sie an, optional unter Konvertierung in WebP. Speichert Attachment-IDs in der_as24ci_image_ids-Postmeta.AS24CI\Scheduler— Verwaltet die WP-Cron-Hooksas24ci_scheduled_importundas24ci_image_queue_process, die Run-Lock-Transients (as24ci_cron_import_running,as24ci_image_queue_running) und das manuelle Batch-Wizard-Warteschlangen-Transientas24ci_batch_queue. Derselberun_import()-Ablauf wird von WP-Cron, dem REST-Cron-Endpunkt und der Admin-Schaltfläche "Jetzt ausführen" verwendet.AS24CI\Cron_Endpoint— REST-Endpunkt, der es externen Servern ermöglicht, Importe über eine mit einem Token gesicherte URL auszulösen.
Connections-Importer
Ein zweites, herstellerunabhängiges Import-Frontend (Admin-Bereich "Connections", Slug as24ci-universal-import; interne Klasse AS24CI\Universal_Importer), das dieselbe AS24CI\Importer-Pipeline speist wie der AutoScout24-Pfad (über Importer::upsert_external_listing()):
AS24CI\Universal_Importer— Orchestriert einen Durchlauf: Parsen → Zuordnen → Validieren → Upsert → optionale quellspezifische Vollsynchronisation.AS24CI\Import_Reader— Format-Dispatcher (CSV / XML / XLSX / JSON / ZIP), der eine einheitliche{ header, rows }-Struktur zurückgibt, unterstützt durchImport_Csv_Reader,Import_Xml_Reader,Import_Xlsx_Reader,Import_Json_ReaderundImport_Zip_Reader.AS24CI\Import_Encoding— Normalisiert Quelltext zu UTF-8 (Windows-1252 / ISO-8859 / BOM-Handling).AS24CI\Import_Template— Ordnet Quellspalten AutoScout24-strukturierten Feldern mit numerischer/boolescher Normalisierung und Wertetabellen zu.AS24CI\Import_Feed,AS24CI\Import_Mail,AS24CI\Import_Carcuro,AS24CI\Import_Mobile— Die benannten geplanten Konnektoren (URL/FTP/SFTP-Feed, IMAP-Postfach, carcuro-API und die mobile.de-API,includes/class-as24ci-import-mobile.php), die Einstellungen sowie (falls zutreffend) ein verschlüsseltes Secret überAS24CI\Secretsspeichern und nach Zeitplan importieren. Feed und E-Mail laufen über eigene Cron-Events; carcuro und mobile.de nutzen den zentralenas24ci_scheduled_import-Zeitplan. Initialisiert inAS24CI\Pluginüber den jeweiligenregister_hooks()des Konnektors. Der Admin-Tab Connections (interne KlasseAS24CI\Admin_Tab_Universal_Import) rendert das Konnektor-Akkordeon und den Datei-Upload-Assistenten.
Siehe Import Engine für den Ablauf des Durchlaufs.
Frontend, SEO und Integrationen
AS24CI\Templates— Leitet Fahrzeug-Archiv- und Einzelansichts-Templates durch den Template-Loader des Plugins, was Theme-Überschreibungen ermöglicht.AS24CI\Assets— Registriert und reiht CSS- und JavaScript-Bundles für das Admin- und Frontend ein.AS24CI\Archive_Filters— Rendert die Benutzeroberfläche des Archivfilters und wendet Abfrageänderungen basierend auf der Benutzerauswahl an.AS24CI\Schema— Fügt strukturierte Daten von Schema.org und Open Graph / Twitter Card Meta-Tags zu einzelnen Fahrzeugseiten hinzu. Optional, gesteuert durchOptions::FEATURE_SCHEMA.AS24CI\Sitemap— Integriert Fahrzeuge in die WordPress-Core-Sitemap und ist kompatibel mit Yoast und Rank Math. Optional, gesteuert durchOptions::FEATURE_SITEMAP.AS24CI\Vehicle_Redirects— Wandelt den 404-Fehler, den ein dauerhaft gelöschtes Fahrzeug andernfalls erzeugen würde, in eine 301-Weiterleitung zu einer vorgefilterten Suche nach Marke/Modell um. Beibefore_delete_post(Priorität 5, vorAS24CI\Vehicle_Deleter) zeichnet es den Slug des gelöschten Fahrzeugs sowie seineas24ci_brand/as24ci_modelTerm-Slugs in der Tabelle{$wpdb->prefix}as24ci_redirectsauf; beitemplate_redirectgleicht es den Slug einer 404-Anfrage ab und ermittelt das beste aktive Ziel, wobei esmake+model → make → /cars/ archiveherabstuft, damit es nie auf einem leeren Ergebnis landet. Das Ziel ist immer eine Suchanfrage (nie ein anderes Fahrzeug), sodass keine Weiterleitungsketten entstehen. Optional, gesteuert durchOptions::FEATURE_VEHICLE_REDIRECTSund den Filteras24ci_vehicle_redirects_enabled. Einträge werden nach einem Aufbewahrungsfenster von 365 Tagen bereinigt und aufgelöste Ziele werden für eine Stunde zwischengespeichert.AS24CI\Social_Share,AS24CI\Pdf_Datasheet,AS24CI\Favorites,AS24CI\Compare,AS24CI\Export,AS24CI\Bulk_Actions,AS24CI\Financing_Calculator,AS24CI\Test_Drive,AS24CI\Search_Agent— Optionale Funktionen, die jeweils ihre eigenen Hooks registrieren. Die meisten werden durch einenOptions::FEATURE_*-Schalter gesteuert (sieheseed_safe_defaults()inAS24CI\Pluginfür die Standardeinstellungen bei einer Neuinstallation).AS24CI\Webhooks— Ausgehende Webhooks für CRM- und Integrations-Anwendungsfälle.AS24CI\Rest_Api— Öffentliche REST-API für Fahrzeugangebote, gesteuert durchOptions::REST_API_ENABLED.AS24CI\Analytics— Tracking von Seitenaufrufen, Filtern und Leads. Verwaltet die Tabelle{$wpdb->prefix}as24ci_analyticsund den Aufbewahrungs-Cronas24ci_daily_cleanup.AS24CI\Ai_Assistant— Generiert KI-Beschreibungen, SEO-Metadaten und Ausstattungs-Highlights unter Verwendung der verwalteten Google Gemini-Konfiguration, die vonAS24CI\Ai_Configbereitgestellt wird. Der Gemini-Schlüssel des Kunden wird Server-zu-Server von der API-Plattform bereitgestellt und überAS24CI\Ai_Credential_Managerverschlüsselt gespeichert; in der Admin-Benutzeroberfläche kann kein Anbieter, Modell oder API-Schlüssel ausgewählt werden.AS24CI\Data_Quality_Scanner— Optionaler Detektor für Tippfehler in Taxonomien, der die KI-Integration nutzt.AS24CI\Pricing_Engine— Tägliche Preisanalyse, die über den Hookas24ci_pricing_analysis_cronausgeführt wird.AS24CI\Locations,AS24CI\Seller_Profile_Fields— Standorte der Garage, Öffnungszeiten und Verkäuferprofil-Metadaten.AS24CI\Team/AS24CI\Admin_Team— CMH Team: Verkaufsberater der Garage, die keine WordPress-Benutzerkonten benötigen. Die Speicherung basiert auf Optionen (keine benutzerdefinierte Tabelle oder CPT); Kontakte werden inOptions::TEAM_MEMBERSund zugehörigen Optionsschlüsseln gespeichert, was dem Muster vonLocationsentspricht.Admin_Teamregistriert ein dediziertes Admin-Menü auf oberster Ebene.AS24CI\License_Manager,AS24CI\License_Client,AS24CI\License_Refresh_Signal,AS24CI\License_Signal_Secret— Lizenz- / verwaltete Zugriffsebene der ADP Car Market Hub-API-Plattform.License_Managerverwaltet den täglichen Re-Validierungs-Cron (as24ci_license_refresh), die Speicherung von Funktionsrechten, die Steuerung der Schreibpfade für Betrieb/KI und Admin-Hinweise.License_Refresh_Signalstellt den eingehenden EndpunktPOST /as24ci/v1/license-refresh-signalbereit.AS24CI\Ai_Credential_Manager— Speichert und entschlüsselt die von der API-Plattform bereitgestellten Gemini-Zugangsdaten des Kunden.- Content Studio (
AS24CI\Content_Studio_*, z. B.Content_Studio_Repository,Content_Studio_Options,Content_Studio_Admin_Worker,Admin_Tab_Content_Studio) — Ein weitgehend eigenständiges Modul, das Marketing-Inhalte aus bestehenden Fahrzeugdaten generiert. Es verwaltet eigene Tabellen (as24ci_content_studio_jobs,as24ci_content_studio_assets), eigeneas24ci_content_studio_*-Optionen sowie einen Hintergrund-Worker und wird direkt aus der Hauptdatei des Plugins anstatt über denAdmin-Router initialisiert. Es liest bestehende Fahrzeug-/Importdaten schreibgeschützt aus.
Admin-Benutzeroberfläche
AS24CI\Admin— Admin-Controller auf oberster Ebene, der nur instanziiert wird, wennis_admin()wahr ist. Setzt intern Tab-Klassen ausincludes/admin/zusammen (Importer, Einstellungen, Mapping, Design, Layout-Manager, Leads, AI Assistant, Systemstatus usw.).AS24CI\Dashboard_Widget— Optionales WordPress-Dashboard-Widget, gesteuert durchOptions::FEATURE_DASHBOARD_WIDGET.
Feature-Toggles und "sichere erste Einrichtung"
Die meisten nicht essenziellen Funktionen werden in AS24CI\Plugin::register_hooks() bedingt registriert, basierend auf Optionen, deren Konstanten in AS24CI\Options definiert sind (zum Beispiel FEATURE_SCHEMA, FEATURE_SITEMAP, FEATURE_VEHICLE_REDIRECTS, FEATURE_FAVORITES, FEATURE_COMPARE, FEATURE_PDF_DATASHEET, REST_API_ENABLED, AI_ASSISTANT_ENABLED, ANALYTICS_ENABLED, TEST_DRIVE_ENABLED).
AS24CI\Vehicle_Redirects wird bedingungslos registriert und wertet seinen Toggle zur Laufzeit aus, sodass Weiterleitungen für gelöschte Fahrzeuge ein- oder ausgeschaltet werden können, ohne das Plugin neu zu initialisieren.
Bei einer Neuinstallation setzt das Plugin konservative Standardwerte über AS24CI\Plugin::seed_safe_defaults(). Datenschutzrelevante, externe oder Batch-Funktionen sind standardmässig deaktiviert; frontend-freundliche Funktionen (Sitemap, Schema, Favoriten, Vergleich, Finanzierungsrechner, Dashboard-Widget, Export, Lazy Loading, Layout Manager) sind standardmässig aktiviert. Bestehende Installationen werden nie überschrieben, da der Seeder add_option() verwendet.
Speicher-Layout (High-Level)
Das Plugin verwendet drei Speicherebenen:
- Eigene Datenbanktabellen, verwaltet über
dbDelta: -{$wpdb->prefix}as24_vehicles— Fahrzeug-Felddaten, im Besitz vonAS24CI\Vehicle_Repository. -{$wpdb->prefix}as24ci_analytics— Analytics-Ereignisse, im Besitz vonAS24CI\Analytics. -{$wpdb->prefix}as24ci_search_agents— Suchabo-Abonnements, im Besitz vonAS24CI\Search_Agent. -{$wpdb->prefix}as24ci_sync_state— Letzter Synchronisations-Heartbeat pro Fahrzeug (post_idPK,last_sync), im Besitz vonAS24CI\Sync_Stateund verzögert (lazy) beiadmin_initerstellt, nicht bei der Aktivierung. -{$wpdb->prefix}as24ci_redirects— Weiterleitungs-Map für gelöschte Fahrzeuge (slugunique,make_slug,model_slug,created_at), im Besitz vonAS24CI\Vehicle_Redirects. Erstellt bei der Aktivierung und über die Migration v11, und bereinigt nach einem Aufbewahrungsfenster von 365 Tagen. -{$wpdb->prefix}as24ci_content_studio_jobsund{$wpdb->prefix}as24ci_content_studio_assets— Content Studio-Jobs und generierte Assets, im Besitz vonAS24CI\Content_Studio_Repository. - WordPress-Beiträge und Postmeta:
-
as24ci_car-Beiträge bilden die Grundlage für die WordPress-Permalinks, Taxonomien und Templates für jedes Fahrzeug. Eine kleine Auswahl an Postmeta-Schlüsseln verbleibt aus Gründen der Abwärtskompatibilität inwp_postmeta(zum Beispiel_as24ci_listing_id,_as24ci_content_hash,_as24ci_images_hash,_as24ci_image_ids,_as24ci_manual_image_ids). -as24ci_lead-Beiträge speichern Kontaktformular-Anfragen mit dem in_as24ci_lead_statusgespeicherten Status. wp_options— Alle vom Benutzer konfigurierbaren Einstellungen. Schlüssel sind als Konstanten inAS24CI\Options(und für das Content Studio inAS24CI\Content_Studio_Options) definiert. Schema-Versionen für die eigenen Tabellen werden ebenfalls als Optionen gespeichert (as24ci_db_version,as24ci_vehicles_db_version,as24ci_search_agent_db_version,as24ci_content_studio_db_version). Kontakte des CMH Team werden ebenfalls in den Optionen gespeichert (as24ci_team_*).
Für Details auf Spaltenebene siehe Datenbankschema. Für das logische Entitätsmodell und das Zusammenspiel zwischen Postmeta und der eigenen Tabelle siehe Datenmodell.
Laufzeit-Ablauf im Überblick
Ein typischer Request durchläuft die folgenden Phasen (vereinfacht):
- WordPress lädt
adp-car-market-hub.php, was Plugin-Konstanten definiert, den Autoloader registriert und eigene WP-Cron-Intervalle hinzufügt. - Bei
plugins_loaded(Priorität 1) wird die Textdomain geladen. - Bei
plugins_loaded(Standardpriorität) läuftAS24CI\Plugin::init(), instanziiert das Singleton und registriert alle Hooks für aktive Funktionen. - Feature-Klassen registrieren ihre eigenen Hooks bei
init,rest_api_init,wp_ajax_*,wp_footerusw. - Anschliessende Aktivitäten (ein Cron-Lauf, ein REST-Request, ein Frontend-Seitenaufruf) werden von den registrierten Hooks verarbeitet.
Betriebliche Hinweise
- Das Plugin setzt die im Plugin-Header deklarierten WordPress- und PHP-Versionen voraus (
Requires at least: 6.2,Requires PHP: 8.1). Ältere Versionen werden nicht unterstützt. - Die meisten Subsysteme verwenden
wpdbnur dann direkt, wenndbDeltadas erforderliche Schema oder die Abfrage nicht ausdrücken kann. Direkte Abfragen sind auf das Repository, Analytics, den Suchagenten und den Deinstallations-Code beschränkt. - Die Architektur trennt das Frontend-Rendering bewusst vom Datenimport. Der Importer rendert niemals Templates; die Templates lösen niemals Netzwerkanfragen an AutoScout24 aus.
- Das Plugin fügt über den Filter
plugin_action_links_<basename>einen "Einstellungen"-Link zu seiner Zeile in der WordPress-Plugin-Übersicht hinzu.
Fehlerbehebung
- Eine Funktion scheint sich nicht zu registrieren. Überprüfen Sie den entsprechenden
Options::FEATURE_*-Toggle. Die Methoderegister_hooks()inAS24CI\Pluginüberspringt deaktivierte Funktionen. - Eine Klasse wird nicht gefunden. Überprüfen Sie die Namenskonvention für Dateien (
class-as24ci-<lower-dashed-name>.php) und ob sich die Datei inincludes/oderincludes/admin/befindet. Der Autoloader sucht nur in diesen beiden Verzeichnissen. - Auf eine reine Admin-Klasse wird vom Frontend aus verwiesen. Admin-Klassen werden vom Autoloader bei Bedarf geladen, können jedoch von globalen Variablen oder Berechtigungen abhängen, die nur im Admin-Bereich verfügbar sind. Überprüfen Sie das Verhalten in der aktuellen Plugin-Version, bevor Sie sich darauf verlassen.