alt_text_generator = new Alt_Text_Generator(); $this->bulk_alt_module = new Bulk_Alt_Text_Module($this->alt_text_generator); $this->auto_tagging_module = new Auto_Tagging_Module(); $this->post_gen_module = new Post_Generator_Module(); add_action('admin_menu', [$this, 'registerAdminMenu']); add_action('admin_enqueue_scripts', [$this, 'enqueueAdminAssets']); add_action('wp_ajax_king_addons_ai_seo_save_settings', [$this, 'handle_ajax_save_settings']); } public function handle_ajax_save_settings(): void { check_ajax_referer('king_addons_ai_seo_save_settings_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_send_json_error(['message' => esc_html__('Permission denied.', 'king-addons')], 403); } $existing = get_option('king_addons_ai_options', []); $existing['auto_tagging_max_tags'] = max(1, min(20, absint($_POST['auto_tagging_max_tags'] ?? 5))); $existing['auto_tagging_confidence_threshold'] = max(0.0, min(1.0, (float) ($_POST['auto_tagging_confidence_threshold'] ?? 0.75))); $existing['auto_tagging_stop_words'] = sanitize_text_field(wp_unslash($_POST['auto_tagging_stop_words'] ?? '')); update_option('king_addons_ai_options', $existing); wp_send_json_success(['message' => esc_html__('Settings saved.', 'king-addons')]); } public function registerAdminMenu(): void { add_submenu_page( 'king-addons', esc_html__('AI SEO Tools', 'king-addons'), esc_html__('AI SEO Tools', 'king-addons'), 'manage_options', 'king-addons-ai-seo-tools', [$this, 'renderAdminPage'] ); } public function enqueueAdminAssets(string $hook): void { if ($hook !== 'king-addons_page_king-addons-ai-seo-tools') { return; } wp_enqueue_style( 'king-addons-admin-v3-shared', KING_ADDONS_URL . 'includes/admin/layouts/shared/admin-v3-styles.css', [], KING_ADDONS_VERSION ); wp_enqueue_style( 'king-addons-ai-seo-tools', KING_ADDONS_URL . 'includes/extensions/AI_SEO_Tools/assets/ai-seo-tools.css', ['king-addons-admin-v3-shared'], KING_ADDONS_VERSION ); wp_enqueue_script( 'king-addons-ai-seo-tools', KING_ADDONS_URL . 'includes/extensions/AI_SEO_Tools/assets/ai-seo-tools.js', ['jquery'], KING_ADDONS_VERSION, true ); $ka_ai_options_for_js = get_option('king_addons_ai_options', []); wp_localize_script('king-addons-ai-seo-tools', 'kingAddonsAiSeoTools', [ 'ajaxUrl' => admin_url('admin-ajax.php'), 'settingsUrl' => admin_url('admin.php?page=king-addons-ai-settings'), 'hasApiKey' => !empty($ka_ai_options_for_js['openai_api_key']) ? '1' : '', 'dashboardUiNonce' => wp_create_nonce('king_addons_dashboard_ui'), 'nonces' => [ 'altStart' => wp_create_nonce('king_addons_ai_seo_bulk_alt_start_nonce'), 'altStatus' => wp_create_nonce('king_addons_ai_seo_bulk_alt_status_nonce'), 'altStop' => wp_create_nonce('king_addons_ai_seo_bulk_alt_stop_nonce'), 'altStats' => wp_create_nonce('king_addons_ai_seo_get_alt_stats_nonce'), 'tagsStart' => wp_create_nonce('king_addons_ai_seo_bulk_tags_start_nonce'), 'tagsStatus' => wp_create_nonce('king_addons_ai_seo_bulk_tags_status_nonce'), 'tagsStop' => wp_create_nonce('king_addons_ai_seo_bulk_tags_stop_nonce'), 'appendStart' => wp_create_nonce('king_addons_ai_seo_bulk_append_tags_start_nonce'), 'appendStatus' => wp_create_nonce('king_addons_ai_seo_bulk_append_tags_status_nonce'), 'appendStop' => wp_create_nonce('king_addons_ai_seo_bulk_append_tags_stop_nonce'), 'regenStart' => wp_create_nonce('king_addons_ai_seo_bulk_regenerate_tags_start_nonce'), 'regenStatus' => wp_create_nonce('king_addons_ai_seo_bulk_regenerate_tags_status_nonce'), 'regenStop' => wp_create_nonce('king_addons_ai_seo_bulk_regenerate_tags_stop_nonce'), 'postgenStart' => wp_create_nonce('king_addons_ai_seo_post_gen_start_nonce'), 'postgenStatus' => wp_create_nonce('king_addons_ai_seo_post_gen_status_nonce'), 'postgenStop' => wp_create_nonce('king_addons_ai_seo_post_gen_stop_nonce'), 'settingsSave' => wp_create_nonce('king_addons_ai_seo_save_settings_nonce'), ], 'i18n' => [ 'processed' => esc_html__('Processed %1$d of %2$d', 'king-addons'), 'completed' => esc_html__('Completed', 'king-addons'), 'stopped' => esc_html__('Stopped', 'king-addons'), 'error' => esc_html__('Error', 'king-addons'), 'backgroundNotice' => esc_html__('AI SEO Tools is processing in the background. You can close this tab and continue working.', 'king-addons'), ], ]); } public function renderAdminPage(): void { if (!current_user_can('manage_options')) { return; } $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true); if (!in_array($theme_mode, ['dark', 'light', 'auto'], true)) { $theme_mode = 'dark'; } $alt_stats = Alt_Text_Generator::get_alt_text_stats(); $tag_stats = Auto_Tagging_Module::get_tagging_stats(); $ka_ai_options = get_option('king_addons_ai_options', []); ?>