prefix . 'admin_watch_404'; $admin_watch_daily_table = $wpdb->prefix . 'admin_watch_404_daily'; $admin_watch_drop_table = $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $admin_watch_table ); $admin_watch_drop_daily = $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $admin_watch_daily_table ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Prepared deletion of only AdminWatch Central tables after explicit opt-in. $wpdb->query( $admin_watch_drop_table ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Prepared deletion of only AdminWatch Central tables after explicit opt-in. $wpdb->query( $admin_watch_drop_daily ); $admin_watch_drop_activity = $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . 'admin_watch_activity' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared -- Explicit opt-in removes only the plugin-owned activity table. $wpdb->query( $admin_watch_drop_activity ); foreach ( array( '_admin_watch_last_login', '_admin_watch_password_changed', '_admin_watch_password_strength' ) as $admin_watch_meta_key ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Prepared removal of an AdminWatch Central-only user meta key after explicit opt-in. $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE meta_key = %s', $wpdb->usermeta, $admin_watch_meta_key ) ); } delete_option( 'admin_watch_settings' ); delete_option( 'admin_watch_db_version' ); delete_option( 'admin_watch_activity_db_version' );