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']) . '

'; }); return; } if (!empty($errors)) { set_transient('ai_writex_errors', $errors, 30); add_action('admin_notices', function () use ($errors) { echo '

' . esc_html($errors['api_key']) . '

'; }); return; } update_option('writex_ai_save_settings', $sanitized_data); delete_transient('ai_writex_errors'); add_action('admin_notices', array($this, 'display_settings_saved_notice')); } } /** * Success notice. */ public function display_settings_saved_notice() { ?>

$plugin_info) { if (strpos($plugin_path, $slug) !== false) { return true; } } return false; } /** * Find the main plugin file for a given slug. * * @param string $slug * @return string|false */ public static function writeX_find_plugin_main_file($slug) { if (! function_exists('get_plugins')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $all_plugins = get_plugins(); foreach ($all_plugins as $plugin_path => $plugin_info) { $path_parts = explode('/', $plugin_path); if (! empty($path_parts) && $path_parts[0] === $slug) { return $plugin_path; } } return false; } } // Initialize the admin. new AI_WRTX_Admin_Main();