| @@ -93,8 +93,17 @@ | ||
| 93 | 93 | // Integrations that clear OTHER plugins' caches of rendered output |
| 94 | 94 | // (Elementor's element cache + generated CSS). Registers a listener |
| 95 | 95 | // only; nothing runs until Cache::purge_render_caches() asks. |
| 96 | 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(); | |
| 97 | 106 | |
| 98 | 107 | // Register Free modules via the same action xspeed-pro uses, so |
| 99 | 108 | // the bootstrap path is symmetric across tiers. |
| 100 | 109 | add_action( 'xspeed_register_modules', array( $this, 'register_free_modules' ) ); |
| @@ -260,8 +269,9 @@ | ||
| 260 | 269 | // cache-coverage features (404 / search / feed / REST / rules / |
| 261 | 270 | // maintenance) into one sidebar sub-item (FBS-83633). |
| 262 | 271 | Module_Registry::register( new \XSpeed\Modules\CacheCoverage\CacheCoverageModule() ); |
| 263 | 272 | Module_Registry::register( new \XSpeed\Modules\Fonts\FontsModule() ); |
| 273 | + Module_Registry::register( new \XSpeed\Modules\TurboRender\TurboRenderModule() ); | |
| 264 | 274 | Module_Registry::register( new \XSpeed\Modules\ResourceHints\ResourceHintsModule() ); |
| 265 | 275 | // AI Privacy (GDPR off-switch) ships in Free even though every AI |
| 266 | 276 | // *feature* is Pro — privacy is a right, not a paid tier. FEATURES.md |
| 267 | 277 | // §AI row 6 mandates it. Without this registration the module was dead |
| @@ -278,8 +288,12 @@ | ||
| 278 | 288 | // snapshot is onboarding/diagnostics, not a paid value-add, so every |
| 279 | 289 | // user gets it. The snapshot degrades gracefully without Pro (Pro |
| 280 | 290 | // version/license fields fall back to defaults via defined()/get_option). |
| 281 | 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() ); | |
| 282 | 296 | // MCP remote control (AI assistants) — Free. The plugin serves the |
| 283 | 297 | // MCP protocol at the site's own /xspeed/mcp URL; the only gate is |
| 284 | 298 | // the per-site connection token an admin mints via Connect. No |
| 285 | 299 | // license, no hosted infra. See IMPLEMENTATION.md §17. |
| @@ -294,10 +308,11 @@ | ||
| 294 | 308 | public function start_plugin_tracking(): void { |
| 295 | 309 | $this->usage_tracker = Usage_Tracker::get_instance( |
| 296 | 310 | XSPEED_FILE, |
| 297 | 311 | array( |
| 298 | - 'opt_in' => true, | |
| 299 | - '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, | |
| 300 | 315 | ) |
| 301 | 316 | ); |
| 302 | 317 | $this->usage_tracker->init(); |
| 303 | 318 | } |