query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", $wpdb->esc_like( 'airanksuite_' ) . '%' ) ); // Transients (including per-user rate-limit buckets and report caches). // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE option_name LIKE %s OR option_name LIKE %s', $wpdb->options, $wpdb->esc_like( '_transient_airanksuite_' ) . '%', $wpdb->esc_like( '_transient_timeout_airanksuite_' ) . '%' ) ); // Post meta. Prefix matching prevents newer module keys from being // orphaned when this list evolves between releases. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", $wpdb->esc_like( '_airanksuite' ) . '%' ) ); // Custom tables. foreach ( array( 'airanksuite_redirects', 'airanksuite_404', 'airanksuite_link_suggestions', 'airanksuite_keywords', 'airanksuite_ranks', 'airanksuite_ai_mentions', 'airanksuite_found_links', 'airanksuite_audit', 'airanksuite_backlinks', 'airanksuite_ai_usage', 'airanksuite_ai_reservations', 'airanksuite_consent_log', 'airanksuite_crawler_hits', 'airanksuite_urls', 'airanksuite_url_sitemaps', 'airanksuite_url_scans', 'airanksuite_import_undo', 'airanksuite_graph_runs', 'airanksuite_link_nodes', 'airanksuite_link_edges' ) as $table ) { $name = $wpdb->prefix . $table; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.PreparedSQL.InterpolatedNotPrepared $wpdb->query( $wpdb->prepare( "DROP TABLE IF EXISTS %i", $name ) ); } // Scheduled events are not options and therefore need explicit cleanup. foreach ( array( 'airanksuite_backlinks_verify', 'airanksuite_job_rank_snapshot', 'airanksuite_ai_visibility_check', 'airanksuite_ai_visibility_batch', 'airanksuite_job_audit_alerts', 'airanksuite_job_email_report', 'airanksuite_autopilot_batch', 'airanksuite_local_listing_refresh', 'airanksuite_job_retention', 'airanksuite_job_resume', 'airanksuite_migrate_tick', 'airanksuite_graph_tick', 'airanksuite_linkscan_tick' ) as $hook ) { wp_clear_scheduled_hook( $hook ); } // Capabilities. $role = get_role( 'administrator' ); if ( $role ) { foreach ( array( 'airanksuite_manage_settings', 'airanksuite_run_audits', 'airanksuite_edit_optimizations', 'airanksuite_view_reports' ) as $cap ) { $role->remove_cap( $cap ); } } } }