prefix . 'equasign_' . $t; $wpdb->query( "DROP TABLE IF EXISTS {$name}" ); // phpcs:ignore WordPress.DB } // 2. Options. $options = array( 'equasign_db_version', 'equasign_api_keys', 'equasign_free_license', 'equasign_pro_license', 'equasign_brevo_sender_email', 'equasign_brevo_sender_name', 'equasign_email_fallback_wpmail', 'equasign_email_admin_optin', 'equasign_expiration_days', 'equasign_pdf_max_bytes', 'equasign_otp_length', 'equasign_otp_ttl', 'equasign_otp_attempts', 'equasign_email_credit_low', 'equasign_document_types', 'equasign_display_timezone', 'equasign_purge_on_uninstall', 'equasign_purge_signed_mode', 'equasign_purge_days', 'equasign_license_cache', 'equasign_license_pubkeys', 'equasign_seal_secret', 'equasign_seal_public', 'equasign_content_optin', 'equasign_templates', 'equasign_models', // Legacy options from retired features, purged for cleanliness on removal. 'equasign_license_optin', ); foreach ( $options as $opt ) { delete_option( $opt ); } // 2 bis. Per-user meta (welcome-bar + "Upgrade to Pro" bar dismissals), for all users. foreach ( array( 'equasign_incite_dismissed_at', 'equasign_probar_hidden_until' ) as $equasign_user_meta ) { delete_metadata( 'user', 0, $equasign_user_meta, '', true ); } // 3. Capability. $role = get_role( 'administrator' ); if ( $role ) { $role->remove_cap( 'manage_equasign' ); } // 4. File vault (recursive deletion). $uploads = wp_upload_dir(); $vault = trailingslashit( $uploads['basedir'] ) . 'equasign-private'; if ( is_dir( $vault ) ) { $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $vault, FilesystemIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST ); foreach ( $iterator as $file ) { if ( $file->isDir() ) { @rmdir( $file->getRealPath() ); // phpcs:ignore WordPress.PHP.NoSilencedErrors } else { @unlink( $file->getRealPath() ); // phpcs:ignore WordPress.PHP.NoSilencedErrors } } @rmdir( $vault ); // phpcs:ignore WordPress.PHP.NoSilencedErrors }