| @@ -3,9 +3,9 @@ | ||
| 3 | 3 | /** |
| 4 | 4 | * Plugin Name: ThinkRank |
| 5 | 5 | * Plugin URI: https://thinkrank.ai/ |
| 6 | 6 | * Description: AI-native SEO plugin for WordPress. Automate and enhance your SEO with cutting-edge AI while maintaining editorial control. |
| 7 | - * Version: 2.7.0 | |
| 7 | + * Version: 2.9.0 | |
| 8 | 8 | * Author: WPDeveloper |
| 9 | 9 | * Author URI: https://wpdeveloper.com/ |
| 10 | 10 | * License: GPL v2 or later |
| 11 | 11 | * License URI: https://www.gnu.org/licenses/gpl-2.0.html |
| @@ -14,9 +14,9 @@ | ||
| 14 | 14 | * Requires at least: 6.0 |
| 15 | 15 | * Requires PHP: 7.4 |
| 16 | 16 | * |
| 17 | 17 | * @package ThinkRank |
| 18 | - * @version 2.7.0 | |
| 18 | + * @version 2.9.0 | |
| 19 | 19 | * @since 1.0.0 |
| 20 | 20 | */ |
| 21 | 21 | |
| 22 | 22 | declare(strict_types=1); |
| @@ -26,9 +26,9 @@ | ||
| 26 | 26 | exit; |
| 27 | 27 | } |
| 28 | 28 | |
| 29 | 29 | // Define plugin constants |
| 30 | -define('THINKRANK_VERSION', '2.7.0'); | |
| 30 | +define('THINKRANK_VERSION', '2.9.0'); | |
| 31 | 31 | define('THINKRANK_PLUGIN_FILE', __FILE__); |
| 32 | 32 | define('THINKRANK_PLUGIN_DIR', plugin_dir_path(__FILE__)); |
| 33 | 33 | define('THINKRANK_PLUGIN_URL', plugin_dir_url(__FILE__)); |
| 34 | 34 | define('THINKRANK_PLUGIN_BASENAME', plugin_basename(__FILE__)); |
| @@ -333,9 +333,17 @@ | ||
| 333 | 333 | */ |
| 334 | 334 | private function load_components(): void { |
| 335 | 335 | $this->components = [ |
| 336 | 336 | 'database' => new ThinkRank\Core\Database(), |
| 337 | - 'settings' => new ThinkRank\Core\Settings(), | |
| 337 | + // Settings::instance() rather than a fresh object: the container | |
| 338 | + // and the singleton were otherwise two different Settings, each | |
| 339 | + // with its own memo, because instance() resolves the container and | |
| 340 | + // this array is assigned only after every constructor above has | |
| 341 | + // run. Anything resolving the singleton during that window got a | |
| 342 | + // standalone instance that outlived the request, so a hook | |
| 343 | + // registered from the component's init() ran against an object no | |
| 344 | + // consumer read through (#516). | |
| 345 | + 'settings' => ThinkRank\Core\Settings::instance(), | |
| 338 | 346 | 'role_manager' => new ThinkRank\Core\Role_Manager(), |
| 339 | 347 | 'security_headers' => new ThinkRank\Core\Security_Headers(), |
| 340 | 348 | 'asset_optimizer' => new ThinkRank\Core\Asset_Optimizer(), |
| 341 | 349 | 'usage_tracker' => new ThinkRank\Core\Usage_Tracker_Manager(), |
| @@ -348,8 +356,9 @@ | ||
| 348 | 356 | 'ai' => new ThinkRank\AI\Manager(), |
| 349 | 357 | 'frontend_seo' => new ThinkRank\Frontend\SEO_Manager(), |
| 350 | 358 | 'seo_notice' => new ThinkRank\Admin\SEO_Notice(), |
| 351 | 359 | 'search_visibility_notice' => new ThinkRank\Admin\Search_Visibility_Notice(), |
| 360 | + 'webroot_writable_notice' => new ThinkRank\Admin\Webroot_Writable_Notice(), | |
| 352 | 361 | 'performance_collector' => new ThinkRank\SEO\Performance_Data_Collector(), |
| 353 | 362 | 'query_guard' => new ThinkRank\SEO\Query_Guard(), |
| 354 | 363 | 'feeds' => new ThinkRank\SEO\Feed_Manager(), |
| 355 | 364 | 'sitemap_stylesheet' => new ThinkRank\SEO\Sitemap_Stylesheet(), |
| @@ -358,13 +367,17 @@ | ||
| 358 | 367 | 'instant_indexing' => new ThinkRank\SEO\Instant_Indexing_Manager(), |
| 359 | 368 | 'instant_indexing_reconciler' => new ThinkRank\SEO\Instant_Indexing_Reconciler(), |
| 360 | 369 | 'author_archives' => new ThinkRank\SEO\Author_Archives_Manager(), |
| 361 | 370 | 'seo_analyzer' => new ThinkRank\SEO\SEO_Analyzer(), |
| 371 | + // Bulk Snippets' persisted issue index: invalidation hooks must run | |
| 372 | + // on every request, since posts are edited everywhere but there. | |
| 373 | + 'snippet_index' => new ThinkRank\SEO\Snippet_Index(), | |
| 362 | 374 | 'email_report' => new ThinkRank\SEO\Email_Report_Manager(), |
| 363 | 375 | 'google_oauth' => new ThinkRank\Integrations\Google_OAuth_Proxy(), |
| 364 | 376 | 'multilingual' => new ThinkRank\Integrations\Multilingual_Manager(), |
| 365 | 377 | 'ai_traffic' => new ThinkRank\SEO\Ai_Traffic_Tracker(), |
| 366 | 378 | 'analytics' => new ThinkRank\SEO\Analytics_Manager(), |
| 379 | + 'schema_conflict_health_check' => new ThinkRank\Diagnostics\Schema_Conflict_Health_Check(), | |
| 367 | 380 | 'abilities' => new ThinkRank\Abilities\Abilities_Registrar(), |
| 368 | 381 | 'mcp' => new ThinkRank\Mcp\Mcp_Manager(), |
| 369 | 382 | ]; |
| 370 | 383 | } |