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 );