'; echo '' . esc_html__('AEO Bob Lite Error:', 'aeo-bob-lite') . ' '; echo esc_html( sprintf( /* translators: %s: Current PHP version */ __('This plugin requires PHP 7.4 or higher. Your current PHP version is %s. Please contact your hosting provider to upgrade PHP.', 'aeo-bob-lite'), PHP_VERSION ) ); echo '

'; }); return; } // Check WordPress version compatibility if (version_compare(get_bloginfo('version'), '5.0', '<')) { add_action('admin_notices', function() { echo '

'; echo '' . esc_html__('AEO Bob Lite Error:', 'aeo-bob-lite') . ' '; echo esc_html__('This plugin requires WordPress 5.0 or higher. Please upgrade WordPress.', 'aeo-bob-lite'); echo '

'; }); return; } // Load AEO Bob Core (bundled library) // Core classes are now bundled within the plugin for single-package installation if (!class_exists('AEO_Bob_Database')) { require_once dirname(__FILE__) . '/includes/core/class-aeo-bob-database.php'; } if (!class_exists('AEO_Bob_Scoring')) { require_once dirname(__FILE__) . '/includes/core/class-aeo-bob-scoring.php'; } if (!class_exists('AEO_Bob_Audit')) { require_once dirname(__FILE__) . '/includes/core/class-aeo-bob-audit.php'; } if (!class_exists('AEO_Bob_AEO_Analyzer')) { require_once dirname(__FILE__) . '/includes/core/class-aeo-bob-aeo-analyzer.php'; } if (!class_exists('AEO_Bob_SEO_Analyzer')) { require_once dirname(__FILE__) . '/includes/core/class-aeo-bob-seo-analyzer.php'; } if (!class_exists('AEO_Bob_Issue_Miner')) { require_once dirname(__FILE__) . '/includes/core/class-aeo-bob-issue-miner.php'; } // Define plugin constants (with checks to prevent conflicts) if ( ! defined( 'AEO_BOB_LITE_VERSION' ) ) { define( 'AEO_BOB_LITE_VERSION', '1.5.76' ); } if (!defined('AEO_BOB_LITE_FILE')) { define('AEO_BOB_LITE_FILE', __FILE__); } if (!defined('AEO_BOB_LITE_PATH')) { define('AEO_BOB_LITE_PATH', plugin_dir_path(__FILE__)); } if (!defined('AEO_BOB_LITE_URL')) { define('AEO_BOB_LITE_URL', plugin_dir_url(__FILE__)); } // Define stub functions for core classes that expect Pro functions if (!function_exists('aeo_bob_get')) { function aeo_bob_get($key, $default = '') { // For Lite, read from dedicated lite settings if ($key === 'api_key' || $key === 'openai_api_key') { return get_option('aeo_bob_lite_openai_key', $default); } return get_option('aeo_bob_lite_' . $key, $default); } } if (!function_exists('aeo_bob_provider')) { function aeo_bob_provider() { return 'openai'; // Lite only supports OpenAI } } if (!function_exists('aeo_bob_api_key_for')) { function aeo_bob_api_key_for($provider = null) { // Return OpenAI key from Lite settings return get_option('aeo_bob_lite_openai_key', ''); } } if (!function_exists('aeo_bob_model')) { function aeo_bob_model() { return 'gpt-4o-mini'; // Lite uses cost-effective model } } if (!function_exists('aeo_bob_model_alias')) { function aeo_bob_model_alias($provider, $model) { return $model; // No aliasing in Lite } } /** * Main AEO Bob Lite Class */ class AEO_Bob_Lite { /** * Single instance */ private static $instance = null; /** * Get singleton instance */ public static function get_instance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } /** * Constructor */ private function __construct() { $this->load_dependencies(); $this->init_hooks(); } /** * Load plugin dependencies */ private function load_dependencies() { // Load Lite-specific classes require_once AEO_BOB_LITE_PATH . 'includes/class-aeo-bob-lite-settings.php'; require_once AEO_BOB_LITE_PATH . 'includes/class-aeo-bob-lite-optimizer.php'; require_once AEO_BOB_LITE_PATH . 'includes/class-aeo-bob-lite-admin.php'; require_once AEO_BOB_LITE_PATH . 'includes/class-aeo-bob-lite-post-columns.php'; require_once AEO_BOB_LITE_PATH . 'includes/class-aeo-bob-lite-meta-box.php'; require_once AEO_BOB_LITE_PATH . 'includes/class-aeo-bob-lite-elementor.php'; } /** * Initialize WordPress hooks */ private function init_hooks() { // Admin initialization if (is_admin()) { add_action('admin_menu', array($this, 'add_admin_menu')); add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets')); // Initialize admin class (for AJAX handlers) AEO_Bob_Lite_Admin::get_instance(); // Initialize post columns AEO_Bob_Lite_Post_Columns::get_instance(); // Initialize meta box (includes both sidebar and main optimization panel) AEO_Bob_Lite_Meta_Box::get_instance(); } // Initialize Elementor integration (checks for Elementor internally) AEO_Bob_Lite_Elementor::get_instance(); // Settings link on plugins page add_filter('plugin_action_links_' . plugin_basename(AEO_BOB_LITE_FILE), array($this, 'add_action_links')); } /** * Add admin menu */ public function add_admin_menu() { add_menu_page( __('AEO Bob Lite', 'aeo-bob-lite'), __('AEO Bob', 'aeo-bob-lite'), 'manage_options', 'aeo-bob-lite', array($this, 'render_dashboard'), 'dashicons-chart-line', 30 ); add_submenu_page( 'aeo-bob-lite', __('Dashboard', 'aeo-bob-lite'), __('Dashboard', 'aeo-bob-lite'), 'manage_options', 'aeo-bob-lite', array($this, 'render_dashboard') ); add_submenu_page( 'aeo-bob-lite', __('Settings', 'aeo-bob-lite'), __('Settings', 'aeo-bob-lite'), 'manage_options', 'aeo-bob-lite-settings', array($this, 'render_settings_page') ); add_submenu_page( 'aeo-bob-lite', __('Go Pro', 'aeo-bob-lite'), __( 'Go Pro', 'aeo-bob-lite' ), 'manage_options', 'aeo-bob-lite-upgrade', array($this, 'render_upgrade_page') ); } /** * Render dashboard page */ public function render_dashboard() { include AEO_BOB_LITE_PATH . 'admin/dashboard.php'; } /** * Render settings page */ public function render_settings_page() { $settings = AEO_Bob_Lite_Settings::get_instance(); $settings->render_settings_page(); } /** * Render upgrade page */ public function render_upgrade_page() { include AEO_BOB_LITE_PATH . 'admin/upgrade.php'; } /** * Enqueue admin assets */ public function enqueue_admin_assets($hook) { // Only load on our pages and post list screens if (strpos($hook, 'aeo-bob-lite') === false && !in_array($hook, array('post.php', 'post-new.php', 'edit.php'))) { return; } // CSS wp_enqueue_style( 'aeo-bob-lite-admin', AEO_BOB_LITE_URL . 'assets/css/admin.css', array(), AEO_BOB_LITE_VERSION ); // JS wp_enqueue_script( 'aeo-bob-lite-admin', AEO_BOB_LITE_URL . 'assets/js/admin.js', array('jquery'), AEO_BOB_LITE_VERSION, true ); // Localize script wp_localize_script('aeo-bob-lite-admin', 'aeoBobLite', array( 'ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('aeo_bob_lite_nonce'), 'version' => AEO_BOB_LITE_VERSION, 'proUrl' => 'https://aeobob.com/#choose-your-plan', 'i18n' => array( 'panelNotFound' => __( 'Optimization panel not found. Please save your post first, or configure your API key in AEO Bob settings.', 'aeo-bob-lite' ), 'analysisComplete' => __( 'Analysis complete!', 'aeo-bob-lite' ), 'analysisFailed' => __( 'Analysis failed. Please try again.', 'aeo-bob-lite' ), 'networkError' => __( 'Network error. Please check your connection and try again.', 'aeo-bob-lite' ), 'analyze' => __( 'ANALYZE', 'aeo-bob-lite' ), 'analyzing' => __( 'Analyzing...', 'aeo-bob-lite' ), 'addContent' => __( 'Please add some content before analyzing.', 'aeo-bob-lite' ), 'noHints' => __( 'No hints available.', 'aeo-bob-lite' ), 'upgradeToPro' => __( 'Upgrade to Pro', 'aeo-bob-lite' ), ), )); } /** * Add action links on plugins page */ public function add_action_links($links) { $custom_links = array( '' . __('Dashboard', 'aeo-bob-lite') . '', '' . __('Go Pro', 'aeo-bob-lite') . '', ); return array_merge($custom_links, $links); } } // Initialize plugin function aeo_bob_lite() { return AEO_Bob_Lite::get_instance(); } /** * Plugin activation callback */ function aeo_bob_lite_activate() { // Create database tables (using singleton pattern - NOT new!) if (class_exists('AEO_Bob_Database')) { $database = AEO_Bob_Database::get_instance(); $database->create_tables(); } // Set default options add_option('aeo_bob_lite_version', AEO_BOB_LITE_VERSION); add_option('aeo_bob_lite_installed', time()); // Flush rewrite rules flush_rewrite_rules(); } /** * Plugin deactivation callback */ function aeo_bob_lite_deactivate() { // Clean up (but don't delete data) flush_rewrite_rules(); } // Register activation/deactivation hooks (BEFORE plugin starts) register_activation_hook(__FILE__, 'aeo_bob_lite_activate'); register_deactivation_hook(__FILE__, 'aeo_bob_lite_deactivate'); // Start the plugin aeo_bob_lite();