prefix and hardcoded plugin constant; no user input $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . $table ) ); } // ── Delete all known plugin options ─────────────────────────────────────── $options = array( 'acquis_db_version', 'acquis_activated_time', 'acquis_install_id', 'acquis_link_expiry_minutes', 'acquis_success_message', 'acquis_button_label', 'acquis_modal_title', 'acquis_modal_subtitle', 'acquis_modal_header_color', 'acquis_modal_accent_color', 'acquis_show_powered_by', 'acquis_delete_data_on_uninstall', 'acquis_from_name', 'acquis_from_email', 'acquis_email_subject', 'acquis_delivery_mode', 'acquis_retention_email_logs', 'acquis_mailchimp_api_key', 'acquis_mailchimp_list_id', 'acquis_mailchimp_enabled', 'acquis_brevo_api_key', 'acquis_brevo_list_id', 'acquis_brevo_enabled', 'acquis_brevo_double_optin', 'acquis_brevo_doi_template_id', 'acquis_mailwizz_api_url', 'acquis_mailwizz_api_key', 'acquis_mailwizz_api_public_key', 'acquis_mailwizz_list_id', 'acquis_mailwizz_enabled', 'acquis_mailwizz_custom_fields', ); foreach ( $options as $option ) { delete_option( $option ); } // ── Delete the per-user "promo banner snoozed until" flag ───────────────── delete_metadata( 'user', 0, 'acquis_promo_snoozed_until', '', true ); // ── Delete any dynamically created acquis_ options ──────────────────────── $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", $wpdb->esc_like( 'acquis_' ) . '%' ) ); // ── Remove protected upload directory guard files ───────────────────────── $upload_dir = wp_upload_dir(); $protect_dir = $upload_dir['basedir'] . '/acquis-protected'; if ( is_dir( $protect_dir ) ) { foreach ( array( '.htaccess', 'index.php' ) as $gf ) { $path = $protect_dir . '/' . $gf; if ( file_exists( $path ) ) { wp_delete_file( $path ); } } }