includes(); $this->init_hooks(); } /** * Include required files. */ private function includes() { require_once AIIL_PLUGIN_DIR . 'includes/class-aiil-autoloader.php'; require_once AIIL_PLUGIN_DIR . 'includes/class-aiil-core.php'; require_once AIIL_PLUGIN_DIR . 'includes/class-aiil-settings.php'; require_once AIIL_PLUGIN_DIR . 'includes/class-aiil-ajax.php'; require_once AIIL_PLUGIN_DIR . 'includes/class-aiil-link-generator.php'; require_once AIIL_PLUGIN_DIR . 'includes/class-aiil-content-analyzer.php'; require_once AIIL_PLUGIN_DIR . 'includes/class-aiil-admin-notices.php'; // LLM Provider system. require_once AIIL_PLUGIN_DIR . 'includes/llm-providers/interface-aiil-llm-provider.php'; require_once AIIL_PLUGIN_DIR . 'includes/llm-providers/abstract-aiil-llm-provider-base.php'; require_once AIIL_PLUGIN_DIR . 'includes/llm-providers/class-aiil-llm-factory.php'; require_once AIIL_PLUGIN_DIR . 'includes/llm-providers/class-aiil-openai-provider.php'; // Editor integrations. require_once AIIL_PLUGIN_DIR . 'includes/editors/class-aiil-editor-integration.php'; require_once AIIL_PLUGIN_DIR . 'includes/editors/class-aiil-tinymce-integration.php'; } /** * Initialize hooks. */ private function init_hooks() { add_action( 'init', array( $this, 'maybe_init_core' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); // Activation/deactivation hooks. register_activation_hook( AIIL_PLUGIN_FILE, array( $this, 'activate' ) ); register_deactivation_hook( AIIL_PLUGIN_FILE, array( $this, 'deactivate' ) ); } /** * Initialize core only for users who can edit content. */ public function maybe_init_core() { // Load only if in admin or user can edit posts (for page builders like Elementor). if ( is_admin() || current_user_can( 'edit_posts' ) ) { AIIL_Core::init(); } } /** * Enqueue admin assets. */ public function enqueue_admin_assets( $hook ) { // Enqueue on post editor pages. if ( in_array( $hook, array( 'post.php', 'post-new.php' ), true ) ) { wp_enqueue_style( 'aiil-admin', AIIL_PLUGIN_URL . 'assets/css/admin.css', array(), AIIL_VERSION ); } // Enqueue on settings pages (main menu pages). if ( in_array( $hook, array( 'toplevel_page_ai-internal-links', 'ai-internal-links_page_ai-internal-links-bulk' ), true ) ) { wp_enqueue_style( 'aiil-settings', AIIL_PLUGIN_URL . 'assets/css/settings.css', array(), AIIL_VERSION ); } } /** * Plugin activation. */ public function activate() { // Set default options. $current_settings = get_option( 'aiil_settings', array() ); $defaults = array( 'provider' => 'openai', 'openai_model' => 'gpt-4o-mini', 'max_links' => 5, 'post_types' => array( 'post', 'page' ), ); // Merge with defaults to ensure all keys exist $settings = wp_parse_args( $current_settings, $defaults ); update_option( 'aiil_settings', $settings ); // Create log directory. $upload_dir = wp_upload_dir(); $log_dir = $upload_dir['basedir'] . '/ai-internal-links-logs'; if ( ! file_exists( $log_dir ) ) { wp_mkdir_p( $log_dir ); // Protect log directory. file_put_contents( $log_dir . '/.htaccess', 'Deny from all' ); file_put_contents( $log_dir . '/index.php', '