get_option('askgpt_api_key'), 'api_key_valid' => get_option('askgpt_api_key_valid', '0'), 'persona' => get_option('askgpt_persona'), 'display_mode' => get_option('askgpt_display_mode', 'new_tab'), 'default_prompt' => get_option('askgpt_default_prompt', 'Can you explain or give me more insights about this: "{highlighted-text}"? This text is from: {pageURL}'), ]); }); /** * Enqueue admin assets (only on our settings page) */ add_action('admin_enqueue_scripts', function($hook) { if ($hook !== 'settings_page_ai-age-text-explainer') { return; } wp_enqueue_style( 'askgpt-admin-style', plugin_dir_url(__FILE__) . 'admin/css/settings.css', [], '2.1' ); wp_enqueue_script( 'askgpt-admin-script', plugin_dir_url(__FILE__) . 'admin/js/settings.js', [], '2.1', true ); // Pass nonces to JS via wp_localize_script (replaces inline PHP in JS) wp_localize_script('askgpt-admin-script', 'AskGPTAdmin', [ 'testKeyNonce' => wp_create_nonce('askgpt_test_key_nonce'), 'suggestionNonce' => wp_create_nonce('askgpt_suggestion_nonce'), ]); }); /** * Admin menu — placed under Settings to avoid cluttering the top-level menu */ add_action('admin_menu', function() { add_options_page( __('AI Age Text Explainer Settings', 'ai-age-text-explainer'), __('AI Age Text Explainer', 'ai-age-text-explainer'), 'manage_options', 'ai-age-text-explainer', 'askgpt_settings_page' ); }); /** * "Settings" link on plugins.php list */ add_filter('plugin_action_links_' . plugin_basename(__FILE__), function($links) { $settings_link = '' . __('Settings', 'ai-age-text-explainer') . ''; array_unshift($links, $settings_link); return $links; }); /** * Register settings */ add_action('admin_init', function() { register_setting('askgpt_settings', 'askgpt_api_key', [ 'sanitize_callback' => 'sanitize_text_field', ]); register_setting('askgpt_settings', 'askgpt_api_key_valid', [ 'sanitize_callback' => 'sanitize_text_field', ]); register_setting('askgpt_settings', 'askgpt_persona', [ 'sanitize_callback' => 'sanitize_textarea_field', ]); register_setting('askgpt_settings', 'askgpt_display_mode', [ 'sanitize_callback' => 'sanitize_text_field', ]); register_setting('askgpt_settings', 'askgpt_default_prompt', [ 'sanitize_callback' => 'sanitize_textarea_field', ]); }); /** * AJAX: test API key connection */ add_action('wp_ajax_askgpt_test_api_key', 'askgpt_test_api_key'); function askgpt_test_api_key() { check_ajax_referer('askgpt_test_key_nonce', 'nonce'); $api_key = sanitize_text_field( wp_unslash( $_POST['api_key'] ?? '' ) ); if (empty($api_key)) { update_option('askgpt_api_key_valid', '0'); wp_send_json_error(['message' => __('No API key provided.', 'ai-age-text-explainer')]); } $response = wp_remote_post('https://api.openai.com/v1/chat/completions', [ 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $api_key, ], 'body' => json_encode([ 'model' => 'gpt-4o-mini', 'messages' => [['role' => 'user', 'content' => 'ping']], 'max_tokens' => 5, ]), 'timeout' => 15, ]); if (is_wp_error($response)) { update_option('askgpt_api_key_valid', '0'); wp_send_json_error(['message' => __('Connection error: ', 'ai-age-text-explainer') . $response->get_error_message()]); } $body = json_decode(wp_remote_retrieve_body($response), true); if (!empty($body['error'])) { update_option('askgpt_api_key_valid', '0'); wp_send_json_error(['message' => $body['error']['message'] ?? __('Invalid API key.', 'ai-age-text-explainer')]); } // Success — persist both the key and the valid flag update_option('askgpt_api_key', $api_key); update_option('askgpt_api_key_valid', '1'); wp_send_json_success(['message' => __('Connected successfully!', 'ai-age-text-explainer')]); } /** * Include settings page */ require_once plugin_dir_path(__FILE__) . 'admin/settings-page.php'; /** * AJAX handler for suggested features form */ add_action('wp_ajax_askgpt_submit_suggestion', 'askgpt_submit_suggestion'); add_action('wp_ajax_nopriv_askgpt_submit_suggestion', 'askgpt_submit_suggestion'); function askgpt_submit_suggestion() { check_ajax_referer('askgpt_suggestion_nonce', 'nonce'); $suggestion = sanitize_textarea_field( wp_unslash( $_POST['suggestion'] ?? '' ) ); $email = sanitize_email( wp_unslash( $_POST['email'] ?? '' ) ); if (empty($suggestion)) { wp_send_json_error([ 'message' => __('Suggestion cannot be empty.', 'ai-age-text-explainer') ]); } $to = 'abdelrahman.elshiekh20@gmail.com'; $subject = __('New Feature Suggestion – AI Age Text Explainer Plugin', 'ai-age-text-explainer'); $body = "New suggestion submitted:\n\n"; $body .= $suggestion . "\n\n"; if (!empty($email)) { $body .= "User Email: " . $email . "\n"; } $headers = [ 'Content-Type: text/plain; charset=UTF-8', 'Reply-To: ' . ($email ?: get_bloginfo('admin_email')) ]; $sent = wp_mail($to, $subject, $body, $headers); if ($sent) { wp_send_json_success([ 'message' => __('Thank you! Your suggestion has been received.', 'ai-age-text-explainer') ]); } else { wp_send_json_error([ 'message' => __('Could not send your suggestion. Please try again later.', 'ai-age-text-explainer') ]); } }