admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('ai_writeX_ajax_nonce'), )); } /** * Registers a new menu page. * * @since 2.0 */ public function ai_writeX_add_admin_menu() { add_menu_page( esc_html__('AI WriteX', 'ai-writex'), esc_html__('AI WriteX', 'ai-writex'), 'manage_options', 'aiwr-settings', array($this, 'settings'), 'dashicons-welcome-write-blog' ); } /** * Adds a "Settings" link to the plugin's action links on the Plugins page. * * @param array $links Existing action links. * @return array Modified action links with the Settings link added. */ public function add_settings_link($links) { $settings_url = admin_url('admin.php?page=aiwr-settings'); $settings_link = 'Settings'; array_push($links, $settings_link); return $links; } /** * Displays the settings page for the plugin. * * @return void */ public function settings() { $settings = $this->get_settings_nav(); $settings_option = get_option('writex_ai_save_settings', array()); include AI_WRITEX_ABSPATH . '/admin/writex-settings.php'; } /** * Settings navigation menu items. * * @since 1.0 * @return array */ public function get_settings_nav() { return array( array( 'id' => 'ai_writex_settings', 'title' => esc_html__('Settings', 'ai-writex'), 'desc' => esc_html__('Set AI model and API key', 'ai-writex'), 'icon' => AI_WRITEX_PLUGIN_URL . 'assets/img/setting-icone.png', ), array( 'id' => 'ai_writex_about_us', 'title' => esc_html__('About Us', 'ai-writex'), 'desc' => esc_html__('More about information', 'ai-writex'), 'icon' => AI_WRITEX_PLUGIN_URL . 'assets/img/about.png', ), ); } /** * Content for settings tab. * * @since 1.0 */ public function ai_writeX_settings_content() { include AI_WRITEX_ABSPATH . '/admin/writex-setting-content.php'; } /** * About us tab content. */ public function ai_writeX_about_us_content() { $obj_card_helper = new AI_WRTX_Card_Helper(); $plugin_data = $obj_card_helper->get_plugin_information(); include AI_WRITEX_ABSPATH . '/admin/writex-about-us-content.php'; } /** * Save the settings from the form. */ public function ai_writeX_save_settings() { if (isset($_POST['writex_ai_save_settings'])) { if ( !isset($_POST['wp_writeX_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['wp_writeX_nonce'])), 'wp_writeX_nonce_action') ) { add_action('admin_notices', array($this, 'display_nonce_verification_failed_notice')); return; } $raw_data = isset($_POST['writex_ai_save_settings']) ? array_map('sanitize_text_field', $_POST['writex_ai_save_settings']) : []; $sanitized_data = []; foreach ($raw_data as $key => $value) { if (is_array($value)) { $sanitized_data[$key] = array_map('sanitize_text_field', $value); } else { $sanitized_data[$key] = sanitize_text_field($value); } } $manager = new AI_WriteX_Tool_Manager($sanitized_data); $tool = $manager->get_tool_instance(); $errors = []; if ($tool) { $response = wp_remote_post($tool->get_api_url(), [ 'headers' => $tool->get_headers(), 'body' => wp_json_encode($tool->prepare_payload('Hello')), 'timeout' => 10, ]); if (is_wp_error($response)) { $errors['api_key'] = 'Connection error: ' . $response->get_error_message(); } else { $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); if (isset($data['error'])) { $errors['api_key'] = 'API Error: ' . sanitize_text_field($data['error']['message'] ?? 'Unknown error'); } } } else { $errors['selected_ai_tool'] = 'Invalid or unsupported AI model selected.'; add_action('admin_notices', function () use ($errors) { echo '
' . esc_html($errors['selected_ai_tool']) . '
' . esc_html($errors['api_key']) . '