{"slug":"ai-product-tools","name":"AI Product Tools – Bulk Product Content Generator & AI Toolkit for WooCommerce","description":"All-in-One AI Suite for WooCommerce: Generate product descriptions, titles, tags, FAQs, alt text, SEO meta & chatbot via top AI models.","author":"Dogu Pekgoz","active_installs":400,"version":"2.6.4","wp_org_url":"https://wordpress.org/plugins/ai-product-tools/","is_closed":false,"cleanup":{"has_uninstall_hook":true,"drops_tables_on_uninstall":false,"deletes_options_on_uninstall":false},"tables":[{"table_name":"aipt_","full_table_name":"wp_aipt_","description":"Stores aipt  data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_automation_jobs","full_table_name":"wp_aipt_automation_jobs","description":"A job queue table for managing background tasks and scheduled operations.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_bulk_generator_history","full_table_name":"wp_aipt_bulk_generator_history","description":"Stores aipt bulk generator history data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_chatbot_jobs","full_table_name":"wp_aipt_chatbot_jobs","description":"A job queue table for managing background tasks and scheduled operations.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_chatbot_messages","full_table_name":"wp_aipt_chatbot_messages","description":"Stores aipt chatbot messages data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_draft_content","full_table_name":"wp_aipt_draft_content","description":"Stores aipt draft content data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_job_logs","full_table_name":"wp_aipt_job_logs","description":"A logging table that records activity, events, or audit history.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_job_products","full_table_name":"wp_aipt_job_products","description":"A job queue table for managing background tasks and scheduled operations.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_prompt_templates","full_table_name":"wp_aipt_prompt_templates","description":"Stores aipt prompt templates data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_rate_limit_counters","full_table_name":"wp_aipt_rate_limit_counters","description":"Stores aipt rate limit counters data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_seo_meta_history","full_table_name":"wp_aipt_seo_meta_history","description":"Stores additional metadata (key-value pairs) for aipt seo meta history records.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"aipt_store_index_profiles","full_table_name":"wp_aipt_store_index_profiles","description":"Stores aipt store index profiles data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"statements","full_table_name":"wp_statements","description":"Stores statements data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":"CREATE TABLE statements (see * https://core.trac.wordpress.org/ticket/19207), producing \"Duplicate * key name\" warnings that pollute the error log on every migration tick. * We manage these specific composite indexes outside dbDelta so they * can be added once and stay quiet on subsequent runs. * * Safe to call on every migration: * - SHOW INDEX confirms the key is absent before issuing ALTER. * - $wpdb->suppress_errors() prevents wpdb from printing the harmless * duplicate-key warning if a concurrent request races us between the * SHOW INDEX check and the ALTER statement. * * @since 2.6.0 * @return void */ private function ensure_composite_indexes(): void { global $wpdb; $indexes = [ $this->automation_jobs_table => [ 'idx_status_next_run_created' => '(status, next_run, created_at)', ], $this->job_products_table => [ 'idx_status_processing_started' => '(status, processing_started_at)', ], $this->draft_content_table => [ 'idx_status_type_created' => '(status, content_type, created_at)', 'idx_job_status_created' => '(job_id, status, created_at)', ], $this->chatbot_messages_table => [ 'idx_record_type_created' => '(record_type, created_at)', ], ]; foreach ($indexes as $table => $table_indexes) { foreach ($table_indexes as $index_name => $columns) { $existing = $wpdb->get_var($wpdb->prepare( \"SHOW INDEX FROM `{$table}` WHERE Key_name = %s\", $index_name ));"}],"table_count":13}