$wp360_uninstall_plugin ) { if ( WP_UNINSTALL_PLUGIN !== $wp360_uninstall_basename && '360-orbit-login-guard' === $wp360_uninstall_plugin['TextDomain'] ) { return; } } global $wpdb; $wp360_uninstall_table = $wpdb->prefix . 'wp360_lg_attempts'; $wpdb->query("DROP TABLE IF EXISTS {$wp360_uninstall_table}"); // phpcs:ignore delete_option( 'wp360_lg_license' ); delete_option( 'wp360_lg_settings' ); delete_option( 'wp360_lg_salt' ); delete_transient( 'wp360_lg_update_check' ); wp_clear_scheduled_hook( 'wp360_lg_cleanup' ); // Sperr- und Zwei-Faktor-Login-Transients tragen die IP-Hash-/Token-Werte im // Optionsnamen selbst -- delete_transient() kennt diese Schluessel nicht // einzeln, deshalb per Prefix-Scan. $wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- plugineigene Tabelle, Abfragen sind vorbereitet; ein Login-Protokoll darf nicht gecacht werden. $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s", // phpcs:ignore $wpdb->esc_like( '_transient_wp360_lg_lock_' ) . '%', $wpdb->esc_like( '_transient_timeout_wp360_lg_lock_' ) . '%', $wpdb->esc_like( '_transient_wp360_lg_ulock_' ) . '%', $wpdb->esc_like( '_transient_timeout_wp360_lg_ulock_' ) . '%', $wpdb->esc_like( '_transient_wp360_lg_2fa_token_' ) . '%', $wpdb->esc_like( '_transient_timeout_wp360_lg_2fa_token_' ) . '%' ) ); delete_transient( 'wp360_lg_lockout_mail_sent' ); delete_metadata( 'user', 0, 'wp360_lg_2fa_secret', '', true ); delete_metadata( 'user', 0, 'wp360_lg_2fa_enabled', '', true ); delete_metadata( 'user', 0, 'wp360_lg_known_devices', '', true ); delete_metadata( 'user', 0, 'wp360_lg_2fa_backup_codes', '', true ); delete_metadata( 'user', 0, 'wp360_lg_2fa_last_timeslice', '', true ); delete_metadata( 'user', 0, 'wp360_lg_2fa_failures', '', true ); delete_option( 'wp360_lg_prefix_migrated' ); delete_transient( 'wp360_lg_prefix_retry' );