';
echo esc_html__('ThinkRank requires PHP 8.0 or higher. Please upgrade your PHP version.', 'thinkrank');
echo '
';
});
return;
}
if (version_compare(get_bloginfo('version'), '6.0', '<')) {
add_action('admin_notices', function() {
echo '';
echo esc_html__('ThinkRank requires WordPress 6.0 or higher. Please upgrade your WordPress installation.', 'thinkrank');
echo '
';
});
return;
}
// Autoloader
require_once THINKRANK_PLUGIN_DIR . 'includes/class-autoloader.php';
/**
* Main ThinkRank Plugin Class
*
* Follows Single Responsibility Principle - only handles plugin initialization
*
* @since 1.0.0
*/
final class ThinkRank {
/**
* Plugin instance (Singleton Pattern)
*
* @var ThinkRank|null
*/
private static ?ThinkRank $instance = null;
/**
* Plugin components
*
* @var array
*/
private array $components = [];
/**
* Get plugin instance (Singleton Pattern)
*
* @return ThinkRank
*/
public static function get_instance(): ThinkRank {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Private constructor to prevent direct instantiation
*/
private function __construct() {
$this->init_autoloader();
$this->init_hooks();
}
/**
* Prevent cloning
*/
private function __clone() {}
/**
* Prevent unserialization
*/
public function __wakeup() {
throw new \Exception('Cannot unserialize singleton');
}
/**
* Initialize autoloader
*
* @return void
*/
private function init_autoloader(): void {
ThinkRank\Core\Autoloader::register();
}
/**
* Initialize WordPress hooks
*
* @return void
*/
private function init_hooks(): void {
register_activation_hook(__FILE__, [$this, 'activate']);
register_deactivation_hook(__FILE__, [$this, 'deactivate']);
add_action('plugins_loaded', [$this, 'init']);
}
/**
* Initialize plugin components
*
* @return void
*/
public function init(): void {
try {
$this->load_components();
$this->init_components();
$this->load_template_functions();
do_action('thinkrank_loaded');
} catch (\Exception $e) {
$this->handle_error($e);
}
}
/**
* Load plugin components (Dependency Injection Container pattern)
*
* @return void
*/
private function load_components(): void {
$this->components = [
'database' => new ThinkRank\Core\Database(),
'settings' => new ThinkRank\Core\Settings(),
'security_headers' => new ThinkRank\Core\Security_Headers(),
'asset_optimizer' => new ThinkRank\Core\Asset_Optimizer(),
'api' => new ThinkRank\API\Manager(),
'admin' => new ThinkRank\Admin\Manager(),
'ai' => new ThinkRank\AI\Manager(),
'frontend_seo' => new ThinkRank\Frontend\SEO_Manager(),
'seo_notice' => new ThinkRank\Admin\SEO_Notice(),
'integrations' => new ThinkRank\Integrations\Manager(),
'performance_collector' => new ThinkRank\SEO\Performance_Data_Collector(),
];
}
/**
* Initialize all components
*
* @return void
*/
private function init_components(): void {
foreach ($this->components as $component) {
if (method_exists($component, 'init')) {
$component->init();
}
}
}
/**
* Load template functions for themes
*
* @return void
*/
private function load_template_functions(): void {
require_once THINKRANK_PLUGIN_DIR . 'includes/frontend/template-functions.php';
}
/**
* Get component instance
*
* @param string $component Component name
* @return object|null
*/
public function get_component(string $component): ?object {
return $this->components[$component] ?? null;
}
/**
* Plugin activation
*
* @return void
*/
public function activate(): void {
try {
$activator = new ThinkRank\Core\Activator();
$activator->activate();
// Flush rewrite rules
flush_rewrite_rules();
} catch (\Exception $e) {
$this->handle_error($e);
wp_die(
esc_html__('ThinkRank activation failed. Please check your server logs.', 'thinkrank'),
esc_html__('Plugin Activation Error', 'thinkrank'),
['back_link' => true]
);
}
}
/**
* Plugin deactivation
*
* @return void
*/
public function deactivate(): void {
try {
$deactivator = new ThinkRank\Core\Deactivator();
$deactivator->deactivate();
// Flush rewrite rules
flush_rewrite_rules();
} catch (\Exception $e) {
$this->handle_error($e);
}
}
/**
* Handle errors consistently
*
* @param \Exception $e Exception to handle
* @return void
*/
private function handle_error(\Exception $e): void {
// Error handling without debug output
}
/**
* Get plugin version
*
* @return string
*/
public function get_version(): string {
return THINKRANK_VERSION;
}
/**
* Get plugin directory path
*
* @return string
*/
public function get_plugin_dir(): string {
return THINKRANK_PLUGIN_DIR;
}
/**
* Get plugin URL
*
* @return string
*/
public function get_plugin_url(): string {
return THINKRANK_PLUGIN_URL;
}
}
/**
* Initialize the plugin
*
* @return ThinkRank
*/
function thinkrank(): ThinkRank {
return ThinkRank::get_instance();
}
// Start the plugin
thinkrank();