load_dependencies(); $this->init_components(); $this->register_hooks(); } /** * Load required files */ private function load_dependencies() { require_once plugin_dir_path( __FILE__ ) . 'class-settings-pages.php'; require_once plugin_dir_path( __FILE__ ) . 'class-setup-wizard.php'; require_once plugin_dir_path( __FILE__ ) . 'class-post-meta-box.php'; } /** * Initialize components */ private function init_components() { $this->settings_pages = new AI_Search_Settings_Pages(); $this->setup_wizard = new AI_Search_Setup_Wizard(); $this->post_meta_box = new AI_Search_Post_Meta_Box(); } /** * Register admin hooks */ private function register_hooks() { add_action( 'admin_menu', [ $this, 'register_settings_menu' ] ); add_action( 'admin_notices', [ $this->setup_wizard, 'show_setup_notice' ] ); add_action( 'admin_notices', [ $this, 'show_domain_mismatch_notice' ] ); add_action( 'admin_notices', [ $this, 'show_woocommerce_welcome_notice' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_assets' ] ); add_action( 'admin_enqueue_scripts', [ $this->setup_wizard, 'enqueue_scripts' ] ); add_action( 'admin_head', [ $this, 'add_menu_icon_styles' ] ); add_filter( 'parent_file', [ $this, 'fix_admin_parent_file' ] ); add_filter( 'submenu_file', [ $this, 'fix_admin_submenu_file' ] ); // Admin post actions add_action( 'admin_post_ai_search_generate_embeddings', [ $this->settings_pages, 'generate_selected_embeddings' ] ); add_action( 'admin_post_ai_search_clear_cache', [ $this->settings_pages, 'clear_embeddings_cache' ] ); add_action( 'admin_post_ai_search_clear_cache_filtered', [ $this->settings_pages, 'clear_embeddings_cache_filtered' ] ); add_action( 'admin_post_ai_search_validate_token', [ $this->settings_pages, 'validate_service_token' ] ); add_action( 'admin_post_ai_search_save_custom_fields', [ $this->settings_pages, 'save_custom_fields_settings' ] ); add_action( 'admin_post_ai_search_save_woocommerce_fields', [ $this->settings_pages, 'save_woocommerce_fields_settings' ] ); add_action( 'admin_post_ai_search_refresh_quota', [ $this->settings_pages, 'refresh_quota_data' ] ); add_action( 'admin_post_ai_search_complete_setup', [ $this->setup_wizard, 'complete_setup' ] ); add_action( 'admin_post_ai_search_reconnect_service', [ $this, 'reconnect_service' ] ); // AJAX actions add_action( 'wp_ajax_ai_search_validate_token', [ $this->settings_pages, 'validate_service_token' ] ); add_action( 'wp_ajax_ai_search_get_taxonomies', [ $this, 'ajax_get_taxonomies' ] ); add_action( 'wp_ajax_ai_search_get_terms', [ $this, 'ajax_get_terms' ] ); add_action( 'wp_ajax_ai_search_dismiss_woo_welcome', [ $this, 'ajax_dismiss_woo_welcome' ] ); add_action( 'wp_ajax_ai_search_wizard_generate_batch', [ $this->setup_wizard, 'ajax_generate_batch' ] ); } /** * AJAX handler to get taxonomies for a post type. */ public function ajax_get_taxonomies() { check_ajax_referer( 'ai_search_ajax' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( 'Unauthorized' ); } $post_type = isset( $_POST['post_type'] ) ? sanitize_text_field( $_POST['post_type'] ) : 'post'; $taxonomies = get_object_taxonomies( $post_type, 'objects' ); $result = []; foreach ( $taxonomies as $taxonomy ) { if ( $taxonomy->public && $taxonomy->show_ui ) { $result[ $taxonomy->name ] = [ 'label' => $taxonomy->label, 'name' => $taxonomy->name, ]; } } wp_send_json_success( $result ); } /** * AJAX handler to get terms for a taxonomy. */ public function ajax_get_terms() { check_ajax_referer( 'ai_search_ajax' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( 'Unauthorized' ); } $taxonomy = isset( $_POST['taxonomy'] ) ? sanitize_text_field( $_POST['taxonomy'] ) : ''; if ( empty( $taxonomy ) || ! taxonomy_exists( $taxonomy ) ) { wp_send_json_error( 'Invalid taxonomy' ); } $terms = get_terms( [ 'taxonomy' => $taxonomy, 'hide_empty' => false, 'number' => 100, ] ); if ( is_wp_error( $terms ) ) { wp_send_json_error( $terms->get_error_message() ); } $result = []; foreach ( $terms as $term ) { $result[] = [ 'id' => $term->term_id, 'name' => $term->name, 'slug' => $term->slug, 'count' => $term->count, ]; } wp_send_json_success( $result ); } /** * Enqueue admin CSS and JS */ public function enqueue_admin_assets( $hook ) { // Only load on our settings page (now it's a top-level menu) if ( 'toplevel_page_ai-search' !== $hook ) { return; } // Enqueue WordPress pointer for compatibility with other plugins wp_enqueue_script( 'wp-pointer' ); wp_enqueue_style( 'wp-pointer' ); wp_enqueue_style( 'ai-search-admin-settings', plugins_url( 'css/admin-settings.css', __FILE__ ), [], AI_SEARCH_VERSION ); } /** * Register settings menu in admin */ public function register_settings_menu() { // Main menu page add_menu_page( 'AI Search', // Page title 'AI Search', // Menu title 'manage_options', // Capability 'ai-search', // Menu slug [ $this->settings_pages, 'display_settings_page' ], // Callback AI_SEARCH_URL . 'assets/icon.svg', // Icon 58 // Position (before Settings) ); // Submenu pages add_submenu_page( 'ai-search', // Parent slug 'General Settings', // Page title 'General Settings', // Menu title 'manage_options', // Capability 'ai-search', // Menu slug (same as parent for first item) [ $this->settings_pages, 'display_settings_page' ] // Callback ); add_submenu_page( 'ai-search', 'Setup Wizard', 'Setup Wizard', 'manage_options', 'ai-search&setup=wizard', [ $this->settings_pages, 'display_settings_page' ] ); add_submenu_page( 'ai-search', 'Support Forum', 'Support Forum', 'manage_options', 'https://wordpress.org/support/plugin/ai-search/', '' ); add_submenu_page( 'ai-search', 'Contact the Author', 'Contact the Author', 'manage_options', 'https://samuelsilva.pt/lets-talk', '' ); } /** * Get settings pages instance */ public function get_settings_pages() { return $this->settings_pages; } /** * Get setup wizard instance */ public function get_setup_wizard() { return $this->setup_wizard; } /** * Add custom CSS for menu icon sizing */ public function add_menu_icon_styles() { ?>

:

:

check_origin_match() ) { return; } $registered_origin = $service->get_registered_origin(); $current_origin = get_site_url(); $reconnect_url = wp_nonce_url( admin_url( 'admin-post.php?action=ai_search_reconnect_service' ), 'ai_search_reconnect_service' ); ?>

' . esc_html( $registered_origin ) . '', '' . esc_html( $current_origin ) . '' ); ?>

register_origin(); if ( $new_token ) { wp_redirect( admin_url( 'admin.php?page=ai-search&ai_search_reconnected=success' ) ); } else { wp_redirect( admin_url( 'admin.php?page=ai-search&ai_search_reconnected=error' ) ); } exit; } /** * Show a one-time welcome notice when WooCommerce is active. */ public function show_woocommerce_welcome_notice() { if ( ! current_user_can( 'manage_options' ) ) { return; } if ( ! class_exists( 'WooCommerce' ) ) { return; } if ( ! get_option( 'ai_search_setup_completed', false ) ) { return; } if ( get_option( 'ai_search_woo_welcome_dismissed', false ) ) { return; } $settings_url = admin_url( 'admin.php?page=ai-search&tab=woocommerce' ); $nonce = wp_create_nonce( 'ai_search_dismiss_woo_welcome' ); ?>

: