diff --git a/assets/js/wpuf-admin.js b/assets/js/wpuf-admin.js index 4a52e7e83..7dd348200 100644 --- a/assets/js/wpuf-admin.js +++ b/assets/js/wpuf-admin.js @@ -217,4 +217,65 @@ jQuery(function($) { $('.wpuf-fields input[type="radio"][name="_downloadable"][value="no"]').prop('checked', true); } }); + + // AI Provider change event listener to filter AI Models + $('#wpuf_ai\\[ai_provider\\]').on('change', function() { + var selectedProvider = $(this).val(); + var aiModelSelect = $('#wpuf_ai\\[ai_model\\]'); + var allOptions = aiModelSelect.find('option').clone(); + + // Store all options for restoration if needed + if (!aiModelSelect.data('all-options')) { + aiModelSelect.data('all-options', allOptions); + } + + // Clear current options + aiModelSelect.empty(); + + // Add default option + aiModelSelect.append(''); + + // Filter and add relevant options based on provider + aiModelSelect.data('all-options').each(function() { + var option = $(this); + var optionText = option.text(); + var optionValue = option.val(); + + // Skip empty value option + if (!optionValue) return; + + // Check if option belongs to selected provider + if (selectedProvider === 'openai' && optionText.includes('(OpenAI)')) { + aiModelSelect.append(option.clone()); + } else if (selectedProvider === 'anthropic' && optionText.includes('(Anthropic)')) { + aiModelSelect.append(option.clone()); + } else if (selectedProvider === 'google' && optionText.includes('(Google)')) { + aiModelSelect.append(option.clone()); + } else if (selectedProvider === 'others' && optionText.includes('(Others)')) { + aiModelSelect.append(option.clone()); + } + }); + + // Check if there's a pre-selected value from database + var currentDbValue = aiModelSelect.attr('data-current-value') || aiModelSelect.val(); + + // Set default model for the selected provider + var defaultModels = { + 'openai': 'gpt-3.5-turbo', + 'anthropic': 'claude-3-haiku', + 'google': 'gemini-pro', + 'others': 'llama' + }; + + // First try to keep the current DB value if it's valid for the selected provider + if (currentDbValue && aiModelSelect.find('option[value="' + currentDbValue + '"]').length > 0) { + aiModelSelect.val(currentDbValue); + } else if (defaultModels[selectedProvider]) { + // Fall back to default model for the provider + aiModelSelect.val(defaultModels[selectedProvider]); + } + }); + + // Trigger change event on page load to filter models based on pre-selected provider + $('#wpuf_ai\\[ai_provider\\]').trigger('change'); }); diff --git a/includes/Admin/Posting.php b/includes/Admin/Posting.php index 82afb9852..f7f006dae 100644 --- a/includes/Admin/Posting.php +++ b/includes/Admin/Posting.php @@ -460,10 +460,6 @@ public function render_form( $form_id, $post_id = null ) { if ( typeof wpuf_map_items === 'undefined' ) { wpuf_map_items = []; } - - // Test if field initialization script is loaded - console.log('Admin metabox script loaded'); - console.log('WPUF_Field_Initializer available:', typeof WPUF_Field_Initializer !== 'undefined'); diff --git a/includes/functions/settings-options.php b/includes/functions/settings-options.php index d0c0725c0..41ad1721d 100644 --- a/includes/functions/settings-options.php +++ b/includes/functions/settings-options.php @@ -49,6 +49,11 @@ function wpuf_settings_sections() { 'title' => __( 'Privacy Options', 'wp-user-frontend' ), 'icon' => 'dashicons-shield-alt', ], + [ + 'id' => 'wpuf_ai', + 'title' => __( 'AI Settings', 'wp-user-frontend' ), + 'icon' => 'dashicons-admin-network', + ], ]; return apply_filters( 'wpuf_settings_sections', $sections ); @@ -632,6 +637,82 @@ function wpuf_settings_fields() { 'options' => $post_types, ], ] ), + 'wpuf_ai' => apply_filters( 'wpuf_ai_options', [ + [ + 'name' => 'ai_provider', + 'label' => __( 'AI Provider', 'wp-user-frontend' ), + 'desc' => __( 'Select the AI service provider you want to use.', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => [ + 'openai' => 'OpenAI', + 'anthropic' => 'Anthropic', + 'google' => 'Google', + 'others' => 'Others', + ], + 'default' => 'openai', + 'class' => 'ai-provider-select', + ], + [ + 'name' => 'ai_model', + 'label' => __( 'AI Model', 'wp-user-frontend' ), + 'desc' => __( 'Select the AI model to use for content generation.', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => apply_filters('wpuf_ai_model_options', [ + // OpenAI Models + 'gpt-5' => 'GPT-5 (OpenAI)', + 'gpt-4.5' => 'GPT-4.5 (OpenAI)', + 'gpt-4o' => 'GPT-4o (OpenAI)', + 'gpt-4.1' => 'GPT-4.1 (OpenAI)', + 'gpt-4' => 'GPT-4 (OpenAI)', + 'gpt-3.5-turbo' => 'GPT-3.5 Turbo (OpenAI)', + 'gpt-oss-20b' => 'GPT-OSS-20B (OpenAI)', + 'gpt-oss-120b' => 'GPT-OSS-120B (OpenAI)', + 'whisper' => 'Whisper (OpenAI)', + 'dall-e' => 'DALL-E (OpenAI)', + 'embeddings' => 'Embeddings (OpenAI)', + 'tts' => 'TTS (OpenAI)', + + // Anthropic Models + 'claude-opus-4' => 'Claude Opus 4 (Anthropic)', + 'claude-opus-4.1' => 'Claude Opus 4.1 (Anthropic)', + 'claude-sonnet-4' => 'Claude Sonnet 4 (Anthropic)', + 'claude-3-opus' => 'Claude 3 Opus (Anthropic)', + 'claude-3-sonnet' => 'Claude 3 Sonnet (Anthropic)', + 'claude-3-haiku' => 'Claude 3 Haiku (Anthropic)', + + // Google Models + 'gemini-pro' => 'Gemini Pro (Google)', + 'gemini-ultra' => 'Gemini Ultra (Google)', + 'gemini-flash' => 'Gemini Flash (Google)', + 'gemma' => 'Gemma (Google)', + 'medgemma' => 'MedGemma (Google)', + 'codegemma' => 'CodeGemma (Google)', + 'palm-2' => 'PaLM 2 (Google)', + 'lamda' => 'LaMDA (Google)', + 'imagen' => 'Imagen (Google)', + 'codey' => 'Codey (Google)', + 'medlm' => 'MedLM (Google)', + 'learnlm' => 'LearnLM (Google)', + + // Other AI Services + 'llama' => 'LLaMA (Others)', + 'code-llama' => 'Code-Llama (Others)', + 'grok' => 'Grok (Others)', + 'jamba' => 'Jamba (Others)', + 'deepseek' => 'DeepSeek (Others)', + 'mistral' => 'Mistral (Others)', + ]), + 'default' => 'gpt-3.5-turbo', + 'class' => 'ai-model-select', + ], + [ + 'name' => 'ai_api_key', + 'label' => __( 'API Key', 'wp-user-frontend' ), + 'desc' => __( 'Enter your AI service API key. Keep this secure and never share it publicly.', 'wp-user-frontend' ), + 'type' => 'text', + 'default' => '', + ], + ] ), ]; return apply_filters( 'wpuf_settings_fields', $settings_fields );