Documentazione · Documentazione tecnica
Bootstrap e ciclo di vita del plugin
Questo documento descrive come si carica il plugin ADP Car Market Hub, cosa succede durante l'attivazione, la disattivazione e la disinstallazione, e quali migrazioni esegue il plugin all'avvio.
Quando usare questo documento
Leggere questo documento se si ha la necessità di:
- Tracciare l'ordine in cui viene eseguito il codice del plugin durante una richiesta WordPress.
- Comprendere quali azioni vengono eseguite all'attivazione e alla disattivazione (funzionalità, pagine predefinite, tabelle personalizzate, eventi pianificati).
- Pianificare un aggiornamento o risolvere i problemi di una migrazione che non è stata applicata.
- Decidere dove agganciare il codice personalizzato in modo che venga eseguito dopo che i servizi del plugin sono disponibili.
Panoramica
Il plugin viene avviato dal file principale adp-car-market-hub.php. Questo file è breve per progettazione ed esegue solo il lavoro che deve avvenire al momento del caricamento del file. Tutto il codice delle funzionalità viene caricato tramite un autoloader in stile PSR-4 e collegato dal singleton AS24CI\Plugin sull'azione plugins_loaded.
Costanti definite al caricamento
adp-car-market-hub.php definisce le seguenti costanti prima dell'esecuzione di qualsiasi hook:
AS24CI_VERSION— Versione corrente del plugin (mantenuta in sincrono con l'intestazione del plugin ereadme.txt).AS24CI_PLUGIN_FILE— Percorso assoluto del file principale del plugin.AS24CI_PLUGIN_DIR— Directory del plugin (con barra finale).AS24CI_PLUGIN_URL— URL della directory del plugin, utile per l'accodamento degli asset.
Il file chiama anche require_once AS24CI_PLUGIN_DIR . 'src/Core/Helpers.php' per caricare gli helper procedurali condivisi e definisce in modo condizionale gli helper globali as24ci_format() e as24ci_get_available_ai_models() se non è stata dichiarata in precedenza alcuna funzione con lo stesso nome.
Autoloader
Subito dopo le costanti, il file registra un piccolo autoloader compatibile con PSR-4 per lo spazio dei nomi AS24CI\. I nomi delle classi sono mappati su nomi di file nel formato class-as24ci-<lower-dashed-name>.php. L'autoloader cerca prima in includes/ e ripiega su includes/admin/ per le classi destinate solo all'amministrazione.
Registrazione degli hook al caricamento
Il file principale registra i seguenti hook prima dell'esecuzione di qualsiasi codice di funzionalità:
| Hook | Callback | Scopo |
|---|---|---|
plugins_loaded (priorità 1) | as24ci_load_textdomain | Carica il text domain adp-car-market-hub da /languages. |
plugins_loaded (priorità predefinita) | AS24CI\Plugin::init | Costruisce il singleton e registra tutti gli hook delle funzionalità. |
register_activation_hook | AS24CI\Plugin::activate | Viene eseguito una volta all'attivazione del plugin. |
register_deactivation_hook | AS24CI\Plugin::deactivate | Viene eseguito una volta alla disattivazione del plugin. |
cron_schedules | as24ci_add_custom_cron_intervals | Registra l'intervallo WP-Cron personalizzato as24ci_every_5_minutes (300 s). |
plugin_action_links_<basename> | as24ci_add_plugin_action_links | Aggiunge i link "Attivazione licenza" e "Impostazioni" nella schermata Plugin di WordPress. |
plugin_row_meta | as24ci_add_plugin_row_meta | Aggiunge un link "Documentazione" ai metadati di riga del plugin. |
Il file principale avvia anche il modulo Content Studio al momento del caricamento, indipendentemente dal router AS24CI\Plugin:
register_activation_hook→AS24CI\Content_Studio_Repository::maybe_create_tables(crea le tabelle di Content Studio all'attivazione).admin_menu(priorità 30) →AS24CI\Admin_Tab_Content_Studio::register_menu.plugins_loaded(priorità 20) →AS24CI\Content_Studio_Admin_Worker::register_hooks.
L'intervallo WP-Cron personalizzato viene registrato incondizionatamente in modo che WordPress ne sia sempre a conoscenza, anche quando le singole opzioni delle funzionalità che lo utilizzano sono disabilitate.
Sequenza di bootstrap (richiesta normale)
Quando WordPress carica il plugin durante una normale richiesta, si verificano i seguenti passaggi in ordine:
- Il file principale viene incluso; vengono registrati le costanti, l'autoloader e gli hook sopra elencati.
- WordPress attiva
plugins_loadedalla priorità 1:as24ci_load_textdomain()esegueload_plugin_textdomain()in modo che le traduzioni siano disponibili prima del rendering di qualsiasi stringa traducibile. - WordPress attiva
plugins_loadedalla priorità predefinita:AS24CI\Plugin::init()costruisce il singleton. - Il costruttore di
AS24CI\Plugin: - Istanzia i servizi condivisi:Logger,Client,Image_Importer,Vehicle_Repository,Importer,Scheduler. - ChiamaVehicle_Field_Resolver::set_repository()in modo che il risolutore di campi centrale possa leggere dalla tabella dei veicoli. - ChiamaVehicle_Deleter::set_repository()eVehicle_Deleter::register_hooks()in modo che ogni percorso di eliminazione permanente (il WordPress nativo, la sincronizzazione completa dell'importatore, l'azione di massa) passi attraverso un'unica pulizia idempotente. - Chiamaregister_hooks()per collegare tutte le funzionalità per la richiesta corrente. register_hooks()collega due callbackadmin_init(vengono collegati duranteplugins_loadedma si attivano solo su un successivoadmin_initinwp-admin): -AS24CI\Plugin::maybe_upgrade_caps()— assicura che i ruoli e le funzionalità esistano per la versione corrente del plugin. -AS24CI\Plugin::maybe_upgrade()— esegue le migrazioni di opzioni/dati.register_hooks()registra quindi gli hook specifici di ciascun sottosistema: - Sempre attivi: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(con pianificazione giornaliera),Financing_Calculator,Rest_Api,Locations,Seller_Profile_Fields, oltre al pianificatore. Anche il metodo privatoUpdaterè collegato qui, limitato ai contesti admin / WP-Cron / WP-CLI. - Vincolati dalle opzioni delle funzionalità suAS24CI\Options:Schema(piùSeo_Compatibility),Sitemap,Social_Share,Pdf_Datasheet,Favorites,Compare,Export,Bulk_Actions,Search_Agent. - Solo per amministratori (is_admin()vero): il controllerAS24CI\Admin,Admin_Team(CMH Team),Update_VisibilityeAdmin_Setup_Wizard, e — quandoOptions::FEATURE_DASHBOARD_WIDGETè abilitato — il widget della bacheca.- WordPress procede con il resto del ciclo di vita della richiesta. La maggior parte delle classi di funzionalità registra hook aggiuntivi su azioni successive come
init(tipi di post, tassonomie, creazione di tabelle per gli agenti di ricerca),rest_api_init(rotte REST),wp_footer(pixel di tracciamento di analytics) oadmin_init(aggiornamenti delle tabelle solo per l'amministrazione).
Attivazione
AS24CI\Plugin::activate() è registrato con register_activation_hook e viene eseguito una volta quando un amministratore attiva il plugin. Esegue il seguente lavoro, in ordine:
- Chiama
seed_safe_defaults(), che utilizzaadd_option()per installare valori predefiniti conservativi per la prima configurazione. I valori esistenti non vengono mai sovrascritti. Valori predefiniti degni di nota: -as24ci_default_currency=EUR. -as24ci_default_post_status=draftin modo che gli amministratori possano rivedere le mappature prima della pubblicazione. -as24ci_max_images=30(un limite finito anziché illimitato). -as24ci_full_sync=0(l'eliminazione definitiva rimane opzionale). - Le funzionalità orientate al frontend (sitemap, schema, preferiti, confronto, finanziamento, widget della bacheca, esportazione, caricamento differito, layout manager) sono attive per impostazione predefinita; le funzionalità di tracciamento, esterne, in batch e a rischio (analytics, REST API, AI Assistant, condivisione social, PDF datasheet, test drive) sono disattivate per impostazione predefinita. - Chiama
add_option( Options::SETUP_FIRST_ACTIVATION_AT, gmdate('c') )per registrare il timestamp della prima attivazione utilizzato dall'avviso amministrativo della Configurazione guidata. Poichéadd_option()non esegue alcuna operazione quando il valore esiste, le riattivazioni preservano la data originale. - Chiama
ensure_roles_and_caps()che: - Crea il ruoloas24ci_editorse non esiste. - Concede il set di funzionalitàas24ci_car/as24ci_carssia aas24ci_editorche aadministrator. - Aggiunge la funzionalitàmanage_as24_imports(la costantePlugin::CAP_MANAGE) solo agli amministratori. Questa funzionalità vincola l'interfaccia utente dell'importatore, delle impostazioni, degli strumenti e dei log. - Imposta
as24ci_caps_versionsu1in modo che la migrazione delle funzionalità non venga eseguita nuovamente sulle richieste successive. - Imposta
as24ci_db_versionsu5in modo che le migrazioni dei dati definite inmaybe_upgrade()vengano saltate su una nuova installazione. - Chiama
maybe_create_default_pages()per creare facoltativamente le pagineCars,Compare CarseFavoritese memorizzare i loro ID post inas24ci_page_archive_id,as24ci_page_compare_ideas24ci_page_favorites_id. Il comportamento è vincolato dall'opzioneas24ci_create_default_pagese dai filtrias24ci_default_pages_enabledeas24ci_default_pages. - Chiama
Analytics::maybe_create_table()per creare la tabella di analytics. - Chiama
Vehicle_Repository::maybe_create_table()per creare la tabella dedicata ai veicoli. - Pianifica la pulizia giornaliera della conservazione dei dati di analytics (
as24ci_daily_cleanup) se non è già pianificata. - Chiama
License_Manager::ensure_cron_scheduled()per pianificare l'evento giornaliero di riconvalida della licenza (as24ci_license_refresh). - Chiama
CPT::register_post_type()e poiflush_rewrite_rules()in modo che l'archivio/carsfunzioni immediatamente dopo l'attivazione. - Registra
Plugin activated (v<version>).tramiteAS24CI\Logger.
Le tabelle di Content Studio vengono create da un hook di attivazione separato (Content_Studio_Repository::maybe_create_tables) registrato nel file principale del plugin, non da Plugin::activate().
activate() deliberatamente non inserisce URL API predefiniti. La configurazione mancante viene evidenziata attraverso l'interfaccia utente dello stato/salute del sistema e tramite errori del client quando l'importatore viene eseguito.
Migrazioni di funzionalità e dati
Due metodi statici sono collegati su admin_init (non plugins_loaded) per mantenere le installazioni esistenti sincronizzate con la versione corrente del plugin. L'aggancio su admin_init evita di forzare il caricamento anticipato dello stack di autenticazione pluggabile su ogni richiesta:
maybe_upgrade_caps()— Collegato suadmin_init. Protegge da richieste AJAX, cron e REST (ritornando anticipatamente in tali contesti) e utilizza una protezione statica per richiesta in modo che il corpo della migrazione venga eseguito al massimo una volta. Non è vincolato amanage_options. Confrontaas24ci_caps_versioncon il valore di destinazione (1al momento della scrittura) e riesegueensure_roles_and_caps()se necessario.maybe_upgrade()— Collegato suadmin_init; ritorna anticipatamente a meno cheis_admin(). Confrontaas24ci_db_versioncon il valore di destinazione (5) e applica eventuali passaggi di migrazione in sospeso. Ogni passaggio è idempotente:- Migrazione 1: solo marcatore, nessuna modifica ai dati.
- Migrazione 2: forza l'opzione del consenso di analytics (
Options::ANALYTICS_REQUIRE_CONSENT) su0. Gli amministratori possono riabilitarla dall'interfaccia utente delle impostazioni. - Migrazione 3: migra l'opzione legacy
FINANCING_PLACEMENTalle nuove zone del Layout Manager. La migrazione scrive in una zona del Layout Manager solo se tale zona non è stata ancora salvata, in modo da preservare i layout esistenti. - Migrazione 4: riapplica
seed_safe_defaults()in modo che le installazioni esistenti ricevano eventuali nuovi valori predefiniti sicuri senza sovrascrivere i valori che l'amministratore ha già impostato. - Migrazione 5: protegge i segreti in chiaro a riposo. I segreti reversibili (
Options::CLIENT_SECRET,Options::HUB_API_KEY,Options::WEBHOOK_SECRET) vengono racchiusi tramiteSecrets::encrypt(), e il token cron (Options::CRON_TOKEN) viene sostituito con il suo hash HMAC con chiave tramiteSecrets::hash_token(). La migrazione è idempotente (le righe già protette vengono saltate) e il token di accesso OAuth memorizzato nella cache viene cancellato in modo da essere memorizzato nuovamente tramite il percorso crittografato. Dopo tutti i passaggi applicabili, l'opzione viene aggiornata alla versione di destinazione corrente.
Disattivazione
AS24CI\Plugin::deactivate() viene eseguito una volta quando un amministratore
disattiva il plugin. I dati esistenti vengono preservati. Il metodo:
- Chiama
wp_clear_scheduled_hook( Scheduler::CRON_HOOK )per rimuovere gli eventias24ci_scheduled_importin sospeso. - Chiama
wp_clear_scheduled_hook( Analytics::ANALYTICS_CLEANUP_CRON_HOOK )per rimuovere l'evento di conservazione giornaliera di Analytics. - Chiama
Ai_Assistant::clear_ai_queue_schedule()per rimuovere l'evento cron della coda AI in background. - Chiama
Pricing_Engine::clear_schedule()per rimuovere l'evento cron giornaliero del motore di determinazione dei prezzi. - Chiama
License_Manager::clear_cron()per rimuovere l'evento giornaliero di ri-validazione della licenza (as24ci_license_refresh). - Chiama
wp_clear_scheduled_hook( 'as24ci_competitor_watcher_cron' )solo come pulizia legacy — la funzionalità Competitor Watcher (e la sua classe) è stata rimossa; il nome dell'hook è codificato qui in modo che qualsiasi evento pianificato rimasto sulle installazioni aggiornate da versioni precedenti venga comunque rimosso. - Elimina il transient
Scheduler::LOCK_TRANSIENT(as24ci_cron_import_running) nel caso in cui il plugin venga disattivato mentre è in corso un'importazione. - Chiama
flush_rewrite_rules()e registraPlugin deactivated.
Poiché la disattivazione non tocca le tabelle del database, i custom post type o le opzioni, la riattivazione del plugin ripristina lo stato precedente.
Disinstallazione
Quando il plugin viene eliminato dall'amministrazione di WordPress (non solo
disattivato), WordPress esegue uninstall.php. Lo script:
- Carica
AS24CI\Options(se il file esiste) in modo che l'elenco autorevole delle chiavi delle opzioni possa essere derivato daOptions::get_all_keys(), oltre a un piccolo set di chiavi aggiuntive (as24ci_models_cache_keys,as24ci_page_archive_id,as24ci_page_compare_ide la legacyas24ci_api_total_cache). Viene utilizzato un elenco di fallback codificato se la classe non può essere caricata. - Elimina i transient del plugin
(
as24ci_access_token,as24ci_cron_import_running,as24ci_image_queue_running). - Annulla la pianificazione degli eventi in sospeso per
as24ci_scheduled_importeas24ci_daily_cleanup. - Legge l'opzione
as24ci_delete_data_on_uninstall. Quando il valore è1, lo script elimina: - Tutti i postas24ci_car(forzato). - Tutti gli ID degli allegati memorizzati nel postmeta_as24ci_image_idsdi ciascuna auto. Gli allegati della galleria manuale (_as24ci_manual_image_ids) non vengono intenzionalmente non eliminati. - L'immagine in evidenza allegata a ciascuna auto (pulizia difensiva). - Tutti i postas24ci_lead. - Le pagine Cars, Compare e Favorites create all'attivazione. - Rilascia sempre le tabelle personalizzate (indipendentemente dal flag di opt-in):
-
{$wpdb->prefix}as24ci_analytics-{$wpdb->prefix}as24_vehicles-{$wpdb->prefix}as24ci_search_agents-{$wpdb->prefix}as24ci_content_studio_assets-{$wpdb->prefix}as24ci_content_studio_jobsAnche le opzioni della versione dello schema corrispondenti (as24ci_vehicles_db_version,as24ci_search_agent_db_version,as24ci_content_studio_db_version) vengono rimosse. - Elimina tutte le chiavi delle opzioni raccolte per il sito.
- Sulle installazioni multisito, la stessa routine viene eseguita una volta per sito tramite
switch_to_blog().
Riferimento di configurazione
Il comportamento di bootstrap e ciclo di vita è influenzato dalle seguenti
opzioni (tutte definite come costanti su AS24CI\Options). Il catalogo
completo è documentato nel documento Archiviazione di opzioni e impostazioni;
qui sono elencate solo le voci rilevanti per il ciclo di vita.
| Chiave opzione | Costante | Utilizzato da |
|---|---|---|
as24ci_caps_version | Options::CAPS_VERSION | maybe_upgrade_caps() per decidere se eseguire le capacità. |
as24ci_db_version | Options::DB_VERSION | maybe_upgrade() per decidere quali migrazioni applicare. |
as24ci_create_default_pages | Options::CREATE_DEFAULT_PAGES | maybe_create_default_pages() durante l'attivazione. |
as24ci_page_archive_id | n/a | Memorizza l'ID della pagina Cars creata all'attivazione. |
as24ci_page_compare_id | n/a | Memorizza l'ID della pagina Compare creata all'attivazione. |
as24ci_page_favorites_id | n/a | Memorizza l'ID della pagina Favorites creata all'attivazione. |
as24ci_delete_data_on_uninstall | Options::DELETE_DATA_ON_UNINSTALL | uninstall.php per decidere se eliminare i contenuti. |
Note operative
register_activation_hookviene attivato solo quando un amministratore attiva il plugin dalla schermata dei Plugin. L'aggiornamento dei file del plugin non attiva l'attivazione; ecco perché esistemaybe_upgrade().- Poiché
maybe_upgrade()emaybe_upgrade_caps()sono agganciati aadmin_inite vengono eseguiti solo durante i caricamenti reali delle pagine di amministrazione (non AJAX, REST o cron), le richieste solo frontend non pagano il costo dei controlli di migrazione. Il primo caricamento della pagina di amministrazione dopo un aggiornamento applica qualsiasi migrazione in sospeso. - I TTL di blocco WP-Cron del plugin sono conservativi: il blocco di importazione
(
Scheduler::LOCK_TTL) è di circa 40 minuti. Se un processo viene interrotto a metà esecuzione, il blocco viene rilasciato automaticamente alla scadenza del transient. Il ripristino manuale è descritto nella documentazione dello scheduler. - La disinstallazione elimina sempre le tabelle di analytics, veicoli e search-agent
perché potrebbero contenere dati personali o dei visitatori. I post e le
opzioni vengono rimossi solo quando l'amministratore ha acconsentito tramite l'impostazione
as24ci_delete_data_on_uninstall.
Risoluzione dei problemi
- L'attivazione non crea la pagina Cars. Verificare che
as24ci_create_default_pagessia impostato su1e che nessun tema o altro plugin stia filtrandoas24ci_default_pages_enabledsufalse. La pagina non viene ricreata anche se esiste già una pagina con lo stesso titolo; in tal caso il suo ID viene riutilizzato. - Mancano le capacità personalizzate per un amministratore. Visitare qualsiasi
pagina di amministrazione in modo che
maybe_upgrade_caps()possa essere eseguito suadmin_init, oppure eliminare temporaneamenteas24ci_caps_versiondawp_optionsper forzare la riesecuzione della migrazione. La migrazione viene saltata sulle richieste AJAX, REST e cron, quindi deve essere eseguita durante un caricamento reale della pagina di amministrazione. - Un passaggio di migrazione non è stato applicato. Controllare il valore di
as24ci_db_version. Se è già uguale alla destinazione, la migrazione è già stata eseguita. Abbassare il valore manualmente solo se si comprendono le conseguenze per la propria installazione. - L'archivio
/carsrestituisce un errore 404 subito dopo l'attivazione. L'attivazione chiama giàflush_rewrite_rules(). Se l'archivio non è ancora raggiungibile, visitare Impostazioni → Permalink e salvare una volta per forzare WordPress a ricostruire la sua cache di riscrittura.