| @@ -76,8 +76,12 @@ | ||
| 76 | 76 | // Per-post cache rules (Phase 3.4) — registers postmeta with |
| 77 | 77 | // REST + meta box on edit screens. |
| 78 | 78 | Cache_Meta_Box::boot(); |
| 79 | 79 | |
| 80 | + // Single-URL purge entry points — row actions, the edit-screen | |
| 81 | + // button and the admin-post handler the admin-bar item also uses. | |
| 82 | + Purge_Ui::boot(); | |
| 83 | + | |
| 80 | 84 | // Phase 0 architecture — managers + Free modules. v1 services |
| 81 | 85 | // (Cache/Minifier/Gzip) are NOT yet Modules; they'll be refactored |
| 82 | 86 | // in a follow-up PR with parity tests. |
| 83 | 87 | Conflict_Registry::boot(); |
| @@ -89,8 +93,17 @@ | ||
| 89 | 93 | // Integrations that clear OTHER plugins' caches of rendered output |
| 90 | 94 | // (Elementor's element cache + generated CSS). Registers a listener |
| 91 | 95 | // only; nothing runs until Cache::purge_render_caches() asks. |
| 92 | 96 | Render_Caches::boot(); |
| 97 | + // Forwarding needs no boot(): Cache::dispatch_purge_event() calls | |
| 98 | + // Server_Caches::forward() directly so a throwing third-party listener | |
| 99 | + // cannot skip it. Both built-in server-cache adapters live behind it — | |
| 100 | + // LiteSpeed, and the nginx FastCGI cache reached through the host's | |
| 101 | + // Nginx Helper install (Host_Page_Caches), which is why neither is | |
| 102 | + // booted here. This boot() registers one listener only: the single | |
| 103 | + // purge that runs after an import, which the nginx adapter's import | |
| 104 | + // gate stands down in favour of. | |
| 105 | + Server_Caches::boot(); | |
| 93 | 106 | |
| 94 | 107 | // Register Free modules via the same action xspeed-pro uses, so |
| 95 | 108 | // the bootstrap path is symmetric across tiers. |
| 96 | 109 | add_action( 'xspeed_register_modules', array( $this, 'register_free_modules' ) ); |
| @@ -256,8 +269,9 @@ | ||
| 256 | 269 | // cache-coverage features (404 / search / feed / REST / rules / |
| 257 | 270 | // maintenance) into one sidebar sub-item (FBS-83633). |
| 258 | 271 | Module_Registry::register( new \XSpeed\Modules\CacheCoverage\CacheCoverageModule() ); |
| 259 | 272 | Module_Registry::register( new \XSpeed\Modules\Fonts\FontsModule() ); |
| 273 | + Module_Registry::register( new \XSpeed\Modules\TurboRender\TurboRenderModule() ); | |
| 260 | 274 | Module_Registry::register( new \XSpeed\Modules\ResourceHints\ResourceHintsModule() ); |
| 261 | 275 | // AI Privacy (GDPR off-switch) ships in Free even though every AI |
| 262 | 276 | // *feature* is Pro — privacy is a right, not a paid tier. FEATURES.md |
| 263 | 277 | // §AI row 6 mandates it. Without this registration the module was dead |
| @@ -274,8 +288,12 @@ | ||
| 274 | 288 | // snapshot is onboarding/diagnostics, not a paid value-add, so every |
| 275 | 289 | // user gets it. The snapshot degrades gracefully without Pro (Pro |
| 276 | 290 | // version/license fields fall back to defaults via defined()/get_option). |
| 277 | 291 | Module_Registry::register( new \XSpeed\Modules\Support\SupportModule() ); |
| 292 | + // The dashboard control for usage-analytics consent. Consent used to | |
| 293 | + // be collectable only in the wizard and withdrawable nowhere, while | |
| 294 | + // the wizard and readme both promised a dashboard switch. (#437) | |
| 295 | + Module_Registry::register( new \XSpeed\Modules\Privacy\PrivacyModule() ); | |
| 278 | 296 | // MCP remote control (AI assistants) — Free. The plugin serves the |
| 279 | 297 | // MCP protocol at the site's own /xspeed/mcp URL; the only gate is |
| 280 | 298 | // the per-site connection token an admin mints via Connect. No |
| 281 | 299 | // license, no hosted infra. See IMPLEMENTATION.md §17. |
| @@ -290,10 +308,11 @@ | ||
| 290 | 308 | public function start_plugin_tracking(): void { |
| 291 | 309 | $this->usage_tracker = Usage_Tracker::get_instance( |
| 292 | 310 | XSPEED_FILE, |
| 293 | 311 | array( |
| 294 | - 'opt_in' => true, | |
| 295 | - 'item_id' => defined( 'XSPEED_INSIGHTS_ITEM_ID' ) ? XSPEED_INSIGHTS_ITEM_ID : false, | |
| 312 | + 'opt_in' => true, | |
| 313 | + 'email_marketing' => true, | |
| 314 | + 'item_id' => defined( 'XSPEED_INSIGHTS_ITEM_ID' ) ? XSPEED_INSIGHTS_ITEM_ID : false, | |
| 296 | 315 | ) |
| 297 | 316 | ); |
| 298 | 317 | $this->usage_tracker->init(); |
| 299 | 318 | } |