prepare(), with %i for table names and %s/%d/%f for values, so nothing is ever interpolated into SQL. Dropping these tables is the purpose of this file, hence the schema change sniff. $ppl_afw_settings = (array) get_option( 'ppl_afw_settings', array() ); if ( empty( $ppl_afw_settings['delete_data_on_uninstall'] ) ) { return; } /** * Never delete data that the Pro edition is still using. Both editions * share these tables, so a store that upgraded to Pro and then deleted * this plugin would otherwise lose its entire affiliate program. */ // The current Pro folder, plus the pre-rename one for older installs. foreach ( array( 'affireo-affiliates-for-woocommerce-pro/affireo-affiliates-for-woocommerce-pro.php', 'ppl-affiliates-for-woocommerce-pro/ppl-affiliates-for-woocommerce-pro.php' ) as $ppl_afw_pro ) { if ( file_exists( WP_PLUGIN_DIR . '/' . $ppl_afw_pro ) ) { return; } } global $wpdb; $ppl_afw_tables = array( 'affiliates', 'visits', 'referrals', 'payouts', 'notifications', 'activity_log', 'stats_daily', ); foreach ( $ppl_afw_tables as $ppl_afw_table ) { $ppl_afw_name = $wpdb->prefix . 'ppl_afw_' . $ppl_afw_table; $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $ppl_afw_name ) ); } foreach ( array( 'ppl_afw_settings', 'ppl_afw_db_version', 'ppl_afw_setup_complete', 'ppl_afw_invoice_sequence', 'ppl_afw_direct_domain_map', 'ppl_afw_hash_key', 'ppl_afw_encryption_key', 'ppl_afw_stats_dirty' ) as $ppl_afw_option ) { delete_option( $ppl_afw_option ); } // Plugin user meta. foreach ( array( 'ppl_afw_notification_prefs', 'ppl_afw_known_ip_hashes', 'ppl_afw_product_rates', 'ppl_afw_sequence_rules', 'ppl_afw_pro_banner_dismissed' ) as $ppl_afw_meta_key ) { delete_metadata( 'user', 0, $ppl_afw_meta_key, '', true ); } // Rate limit and beacon transients. $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE option_name LIKE %s OR option_name LIKE %s', $wpdb->options, $wpdb->esc_like( '_transient_ppl_afw_' ) . '%', $wpdb->esc_like( '_transient_timeout_ppl_afw_' ) . '%' ) ); // Custom capabilities and role. $ppl_afw_caps = array( 'ppl_afw_manage_affiliates', 'ppl_afw_manage_payouts', 'ppl_afw_view_reports', 'ppl_afw_manage_settings', 'ppl_afw_impersonate_affiliates', ); $ppl_afw_admin_role = get_role( 'administrator' ); if ( $ppl_afw_admin_role ) { foreach ( $ppl_afw_caps as $ppl_afw_cap ) { $ppl_afw_admin_role->remove_cap( $ppl_afw_cap ); } } remove_role( 'ppl_afw_affiliate_manager' );