PluginProbe
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO / 2.10.0
ThinkRank AI SEO – AI SEO Plugin for WordPress: Schema, XML Sitemaps, Meta Tags, Search Console & Local SEO v2.10.0
2.10.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 All 51 releases
← All changes | includes/admin/class-manager.php +20 -22 2.5.0 → 2.10.0 View file →
@@ -16,8 +16,9 @@
16 16 use ThinkRank\Core\Settings;
17 17 use ThinkRank\Core\Database;
18 18 use ThinkRank\Core\Plan_Config;
19 19 use ThinkRank\Core\Capability_Manager;
20 +use ThinkRank\Config\Local_Business_Types_Config;
20 21 use ThinkRank\Admin\Metabox_Manager;
21 22 use ThinkRank\Admin\Elementor_Metabox;
22 23 use ThinkRank\Admin\Oxygen_Metabox;
23 24 use ThinkRank\Admin\Divi_Metabox;
@@ -444,8 +445,13 @@
444 445 'faviconUrl' => get_site_icon_url(64) ?: '',
445 446 'adminEmail' => get_option('admin_email'),
446 447 // Post types for Global SEO navigation
447 448 'postTypes' => $this->get_public_post_types(),
449 + // schema.org LocalBusiness subtypes for the Local SEO control.
450 + // Localized rather than mirrored in a JS config: the list runs to
451 + // ~150 entries and is also the MCP ability's enum, so a second copy
452 + // would be a second thing to keep in step (#623).
453 + 'localBusinessTypes' => Local_Business_Types_Config::get_options(),
448 454 // Role Manager: capabilities the current user holds + the
449 455 // section → capability map, so the SPA can hide sections a role
450 456 // cannot access. Administrators receive every capability.
451 457 'caps' => Capability_Manager::user_capabilities(),
@@ -452,13 +458,10 @@
452 458 'sectionCaps' => Capability_Manager::section_map(),
453 459 'canManageRoles' => Capability_Manager::current_user_can(Capability_Manager::MANAGE_ROLES),
454 460 // Pro detection flag
455 461 'isPro' => Plan_Config::is_pro(),
456 - // Data update frequency (Pro: daily, Free: every 3 days)
457 - 'dataUpdateFrequency' => Plan_Config::is_pro() ? 'daily' : '3days',
458 - // NB: no per-feature capability maps here. Email Reporting reads
459 - // its capabilities from GET /thinkrank/v1/email-report/config;
460 - // localizing a second copy only invited the two to drift.
462 + // NB: no per-feature capability maps here; each screen reads its
463 + // own state over REST, so a localized copy cannot drift from it.
461 464 // MCP (Model Context Protocol) connection details for the MCP page.
462 465 'mcp' => $this->get_mcp_globals(),
463 466 // Google OAuth: JS only ever gets a nonce-signed admin-post URL.
464 467 // The consent URL, client ID, and scopes are assembled by the proxy,
@@ -492,8 +495,13 @@
492 495 }
493 496
494 497 // Check for plugin updates
495 498 $this->check_plugin_updates();
499 +
500 + // One-time: a Key Features value saved while commas were delimiters
501 + // becomes one feature per line, so the next regeneration publishes the
502 + // bullets the site already had rather than one merged line.
503 + \ThinkRank\SEO\LLMs_Txt_Manager::maybe_migrate_legacy_key_features();
496 504 }
497 505
498 506 /**
499 507 * Load admin page
@@ -805,19 +813,14 @@
805 813 wp_die();
806 814 }
807 815
808 816 /**
809 - * Check if API key is configured
817 + * Check if the selected AI provider is configured
810 818 *
811 - * @return bool True if at least one API key is configured
819 + * @return bool True when the chosen provider has what it needs to run
812 820 */
813 821 private function has_api_key_configured(): bool {
814 - $settings = \ThinkRank\Core\Settings::instance();
815 -
816 - return !empty($settings->get('openai_api_key'))
817 - || !empty($settings->get('claude_api_key'))
818 - || !empty($settings->get('gemini_api_key'))
819 - || !empty($settings->get('openrouter_api_key'));
822 + return \ThinkRank\Core\Settings::instance()->has_ai_provider_configured();
820 823 }
821 824
822 825 /**
823 826 * Get menu icon
@@ -880,22 +883,17 @@
880 883 ];
881 884 }
882 885
883 886 /**
884 - * Whether any AI provider API key is configured
887 + * Whether the selected AI provider is configured
885 888 *
886 - * Mirrors the check used by ThinkRank\AI\Manager.
889 + * Same answer as ThinkRank\AI\Manager — both read
890 + * Settings::has_ai_provider_configured().
887 891 *
888 892 * @return bool
889 893 */
890 894 private function is_ai_configured(): bool {
891 - foreach (['openai_api_key', 'claude_api_key', 'gemini_api_key', 'openrouter_api_key'] as $key) {
892 - if (!empty($this->settings->get($key, ''))) {
893 - return true;
894 - }
895 - }
896 -
897 - return false;
895 + return $this->settings->has_ai_provider_configured();
898 896 }
899 897
900 898 /**
901 899 * Get internationalization strings