isset($options['button_icon']) ? $options['button_icon'] : 'AI Search', // Use global setting as default value
), $atts);
AIPA_Debug::log(AIPA_Debug::LEVEL_DEBUG, 'Shortcodes', 'Rendering search button shortcode', array('attributes' => $atts));
// Get custom button settings
$icon_type = isset($options['button_icon_type']) ? $options['button_icon_type'] : 'text';
$icon_image = isset($options['button_icon_image']) ? $options['button_icon_image'] : '';
$button_css = isset($options['button_css']) ? $options['button_css'] : '';
// Generate unique button ID
$button_id = 'aipa-search-button-' . uniqid();
// Ensure scripts and styles are loaded
wp_enqueue_style('aipa-frontend-css', AIPA_PLUGIN_URL . 'assets/css/frontend.css', array(), AIPA_VERSION);
wp_enqueue_script('aipa-frontend-js', AIPA_PLUGIN_URL . 'assets/js/frontend.js', array('jquery'), AIPA_VERSION, true);
// Determine which icon to display
$icon_html = '';
if ($icon_type === 'image' && !empty($icon_image)) {
// Custom icon image for shortcode button (user-defined URL, not WordPress media)
// phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage
$icon_html = '';
} else {
// Use shortcode parameter first, then global setting
$icon_html = esc_html($atts['button_text']);
}
// Generate button HTML
$output = '';
// Add button inline styles using wp_add_inline_style
if (!empty($button_css)) {
wp_add_inline_style('aipa-frontend-css', '#' . esc_attr($button_id) . '{' . esc_html($button_css) . '}');
}
// Add button JavaScript handling using wp_add_inline_script
wp_add_inline_script('aipa-frontend-js',
sprintf(
'jQuery(document).ready(function($) {
$("#%s").on("click", function() {
$("#aipa-search-modal").css("display", "flex").hide().fadeIn(300);
$("#aipa-search-input").focus();
});
});',
esc_js($button_id)
)
);
$execution_time = microtime(true) - $start_time;
AIPA_Debug::log(AIPA_Debug::LEVEL_DEBUG, 'Shortcodes', 'Search button shortcode rendered', array(
'button_id' => $button_id,
'icon_type' => $icon_type,
'has_custom_css' => !empty($button_css),
'execution_time' => $execution_time
));
return $output;
}
/**
* Render search form shortcode [aipa_search_form]
*/
public function render_search_form_shortcode($atts) {
$start_time = microtime(true);
AIPA_Debug::log(AIPA_Debug::LEVEL_DEBUG, 'Shortcodes', 'Entering render_search_form_shortcode', array(
'attributes' => $atts
));
// Get settings
$options = get_option('aipa_settings');
// Default text values
$default_title = isset($options['search_modal_title']) ? $options['search_modal_title'] : __('AI Product Search', 'ai-product-assistant');
$default_description = isset($options['search_modal_description']) ? $options['search_modal_description'] : __('Describe what you\'re looking for in natural language.', 'ai-product-assistant');
$default_placeholder = isset($options['search_placeholder']) ? $options['search_placeholder'] : __('e.g., I need a waterproof jacket for hiking in rainy weather', 'ai-product-assistant');
$default_button_text = isset($options['search_button_text']) ? $options['search_button_text'] : __('Search with AI', 'ai-product-assistant');
$default_voice_button_text = isset($options['voice_button_text']) ? $options['voice_button_text'] : __('Voice Search', 'ai-product-assistant');
$atts = shortcode_atts(array(
'title' => $default_title,
'description' => $default_description,
'placeholder' => $default_placeholder,
'button_text' => $default_button_text,
'voice_search' => 'true',
'voice_button_text' => $default_voice_button_text,
'result_container' => 'true'
), $atts);
// Ensure scripts and styles are enqueued
wp_enqueue_style('aipa-frontend-css', AIPA_PLUGIN_URL . 'assets/css/frontend.css', array(), AIPA_VERSION);
wp_enqueue_script('aipa-frontend-js', AIPA_PLUGIN_URL . 'assets/js/frontend.js', array('jquery'), AIPA_VERSION, true);
// Localize script if not already done
if (!wp_script_is('aipa-frontend-js', 'localized')) {
// Performance settings
$search_batch_size = isset($options['search_batch_size']) ? intval($options['search_batch_size']) : 100;
// Get max batches with dynamic default calculation
if (isset($options['max_batches'])) {
$max_batches = intval($options['max_batches']);
} else {
$product_count = (int) wp_count_posts('product')->publish;
$max_batches = $product_count > 0 ? ceil($product_count / $search_batch_size) : 1;
}
wp_localize_script('aipa-frontend-js', 'aipa_data', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('aipa_nonce'),
'searching_text' => __('Searching...', 'ai-product-assistant'),
'search_placeholder' => $atts['placeholder'],
'search_button' => $atts['button_text'],
'error_message' => __('Something went wrong. Please try again.', 'ai-product-assistant'),
'empty_query_message' => __('Please enter a search query.', 'ai-product-assistant'),
'no_results_message' => __('No products found matching your description. Try being more specific or using different terms.', 'ai-product-assistant'),
'voice_search_not_supported' => __('Voice search is not supported in your browser.', 'ai-product-assistant'),
'voice_search_prompt' => __('Speak now...', 'ai-product-assistant'),
'voice_search_button' => $atts['voice_button_text'],
'deep_search_button' => __('Search More Products', 'ai-product-assistant'),
'deep_search_searching' => __('Searching More...', 'ai-product-assistant'),
'search_complete_message' => __('Search complete!', 'ai-product-assistant'),
'no_more_products_message' => __('No more products found matching your description.', 'ai-product-assistant'),
'aipa_service_error_message' => __('Sorry, AI feature is temporarily unavailable. Please try again later.', 'ai-product-assistant'),
'login_url' => function_exists('wc_get_page_permalink') ? wc_get_page_permalink('myaccount') : wp_login_url(get_permalink()),
'login_text' => __('Log in here', 'ai-product-assistant'),
'search_options' => array(
'batch_size' => $search_batch_size,
'max_batches' => $max_batches
)
));
}
// Generate unique IDs for this instance
$unique_id = 'aipa-' . uniqid();
$form_id = $unique_id . '-form';
$input_id = $unique_id . '-input';
$button_id = $unique_id . '-button';
$voice_button_id = $unique_id . '-voice-button';
$error_id = $unique_id . '-error';
$loading_id = $unique_id . '-loading';
$results_id = $unique_id . '-results';
// Start output buffering
ob_start();
?>