PluginProbe
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO / 2.9.0
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO v2.9.0
2.9.0 2.8.0 2.7.0 2.6.0 2.5.0 2.4.0 2.3.0 2.2.0 2.1.1 2.1.0 2.0.2 2.0.1 2.0.0 1.32.0 1.31.0 1.30.0 1.29.0 1.28.0 1.27.0 1.26.0 1.25.0 trunk 1.0.0 1.0.1 1.0.2 All 50 releases
← All changes | thinkrank.php +17 -4 2.7.02.9.0 View file →
@@ -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 }