get_col( "SELECT blog_id FROM {$wpdb->blogs}" ); foreach ( $blog_ids as $blog_id ) { switch_to_blog( $blog_id ); self::create_tables(); restore_current_blog(); } } protected static function create_tables() { global $wpdb; $wpdb->hide_errors(); require_once ABSPATH . 'wp-admin/includes/upgrade.php'; $collate = ''; if ( $wpdb->has_cap( 'collation' ) ) { $collate = $wpdb->get_charset_collate(); } $tables = " CREATE TABLE {$wpdb->prefix}atk_ai_logs ( log_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, user_id bigint(20) unsigned NOT NULL, action varchar(255) NOT NULL, action_name varchar(255) NOT NULL, action_type varchar(255) NOT NULL, user_ip_address varchar(100) NULL DEFAULT '', ip_location varchar(4096) NULL DEFAULT '', action_url varchar(4096) NOT NULL, created_date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_date datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (log_id), KEY user_id (user_id), UNIQUE KEY session_key (log_id) ) $collate; CREATE TABLE {$wpdb->prefix}atk_ai_stats ( stat_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, action varchar(255) NOT NULL, action_name varchar(255) NOT NULL, user_id bigint(20) unsigned NOT NULL, email_to varchar(255) NULL DEFAULT '', count_emails bigint(20) unsigned NOT NULL, created_date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_date datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (stat_id), KEY user_id (user_id), UNIQUE KEY session_key (stat_id) ) $collate; "; dbDelta( $tables ); // $admin_role = get_role( 'administrator' ); // if ( $admin_role instanceof WP_Role && ! $admin_role->has_cap( 'access_atk_ai_logs' ) ) // $admin_role->add_cap( 'access_atk_ai_logs' ); update_option( 'atk_ai_db_version', '1.0' ); } protected static function remove_tables() { global $wpdb; $wpdb->query( "DROP TABLE IF EXISTS `{$wpdb->prefix}atk_ai_logs`;" ); $wpdb->query( "DROP TABLE IF EXISTS `{$wpdb->prefix}atk_ai_stats`;" ); $wpdb->query( "DROP TABLE IF EXISTS `{$wpdb->prefix}atk_security_events`;" ); delete_option( 'atk_security_db_version' ); $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . 'atk_incident_events' ) ); $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . 'atk_incident_404' ) ); delete_transient( 'atk_incidents_404_capped' ); $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . 'atk_incidents' ) ); $incident_options = $wpdb->get_col( $wpdb->prepare( 'SELECT option_name FROM %i WHERE option_name LIKE %s', $wpdb->options, $wpdb->esc_like( 'atk_incidents_' ) . '%' ) ); foreach ( $incident_options as $option ) delete_option( $option ); delete_transient( 'atk_incidents_counts' ); delete_transient( 'atk_incidents_capture_gap' ); wp_clear_scheduled_hook( 'atk_incidents_run' ); $wpdb->query( "DROP TABLE IF EXISTS `{$wpdb->prefix}atk_404_logs`;" ); delete_option( 'atk_404_db_version' ); delete_option( 'atk_404_minute_quota' ); delete_option( 'atk_404_day_quota' ); // $admin_role = get_role( 'administrator' ); // if ( $admin_role && $admin_role->has_cap( 'access_atk_ai_logs' ) ) // $admin_role->remove_cap( 'access_atk_ai_logs' ); delete_option( 'atk_ai_db_version' ); } private static function delete_options($wpdb) { // Delete specific options $options_to_delete = [ 'atk_ai_db_version', 'atk_history_indexes', 'atk_options', 'atk_known_plugins', 'atk_notification' ]; foreach ($options_to_delete as $option) { delete_option($option); } // Delete options that start with 'atk_email_count_' $like_pattern = $wpdb->esc_like('atk_email_count_') . '%'; $email_count_options = $wpdb->get_col( $wpdb->prepare( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s", $like_pattern ) ); foreach ($email_count_options as $option) { delete_option($option); } } public static function uninstall() { global $wpdb; $atk_options = get_option('atk_options'); $del_all = esc_attr($atk_options['atk_del_all_uninstall']); if( $del_all != 1 ) { return; } if ( function_exists( 'is_multisite') && is_multisite() ) { $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs};" ); foreach ( $blog_ids as $blog_id ) { switch_to_blog( $blog_id ); self::remove_tables(); self::delete_options($wpdb); restore_current_blog(); } } else { self::remove_tables(); self::delete_options($wpdb); } wp_clear_scheduled_hook( 'atk_ai_logs_cleanup_daily_event' ); wp_clear_scheduled_hook( 'atkai_network_create_tables_event' ); } } // Hook WP-Cron event for network table creation. add_action( 'atkai_network_create_tables_event', array( 'ATKAI_AI_Install', 'network_create_tables' ) ); register_activation_hook( ATKAI_PLUGIN_BASE, array( 'ATKAI_AI_Install', 'activate' ) ); register_uninstall_hook( ATKAI_PLUGIN_BASE, array( 'ATKAI_AI_Install', 'uninstall' ) );