query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . 'kconv_' . $kconv_suffix ) ); } // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall is gated by WP_UNINSTALL_PLUGIN and explicit KCONV_DELETE_DATA_ON_UNINSTALL===true. Only listed plugin table suffixes are dropped; post type/options/transients are fixed or prepared. Default uninstall retains data. $kconv_ids = $wpdb->get_col( $wpdb->prepare( 'SELECT ID FROM %i WHERE post_type=%s', $wpdb->posts, 'kconv_form' ) ); foreach ( $kconv_ids as $kconv_id ) { wp_delete_post( (int) $kconv_id, true ); } foreach ( array( 'kconv_free_ownership_version', 'kconv_free_ownership_form_cursor', 'kconv_free_ownership_draft_cursor', 'kconv_free_ownership_error', 'kconv_storage_budget_mib', 'kconv_delivery_origin_v1', 'kconv_retention_health', 'kconv_schema_problem', 'kconv_postcommit_problem', 'kconv_db_version', 'kconv_pro_db_version', 'kconv_delivery_db_version', 'kconv_delivery_last_run', 'kconv_delivery_last_finish', 'kconv_delivery_last_result', 'kconv_metrics_db_version', 'kconv_files_db_version', 'kconv_resume_db_version' ) as $kconv_option ) { delete_option( $kconv_option ); } wp_clear_scheduled_hook( 'kconv_delivery_tick' ); wp_clear_scheduled_hook( 'kconv_delivery_wake' ); foreach ( array( 'kconv_review_db_version', 'kconv_review_stages' ) as $kconv_option ) { delete_option( $kconv_option ); } // Team scope is stored against a global user. Only the supported single-site full removal may erase it. if ( ! is_multisite() ) { delete_metadata( 'user', 0, '_kconv_entry_scope', '', true ); } foreach ( array( 'kconv_pro_license_v1', 'kconv_pro_support_v1' ) as $kconv_option ) { delete_option( $kconv_option ); } delete_transient( 'kconv_pro_update_v1' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall is gated by WP_UNINSTALL_PLUGIN and explicit KCONV_DELETE_DATA_ON_UNINSTALL===true. Only listed plugin table suffixes are dropped; post type/options/transients are fixed or prepared. Default uninstall retains data. $kconv_notice_names = $wpdb->get_col( $wpdb->prepare( 'SELECT option_name FROM %i WHERE option_name LIKE %s OR option_name LIKE %s', $wpdb->options, $wpdb->esc_like( '_transient_kconv_support_notice_' ) . '%', $wpdb->esc_like( '_transient_timeout_kconv_support_notice_' ) . '%' ) ); foreach ( $kconv_notice_names as $kconv_name ) { delete_option( $kconv_name ); } remove_role( 'kconv_lead_manager' ); $kconv_admin = get_role( 'administrator' ); if ( $kconv_admin ) { foreach ( array( 'kconv_view_entries', 'kconv_export_entries', 'kconv_delete_entries', 'kconv_review_entries', 'kconv_manage_delivery' ) as $kconv_cap ) { $kconv_admin->remove_cap( $kconv_cap ); } } delete_option( 'kconv_roles_version' ); foreach ( array( 'task', 'dismissed' ) as $kconv_suffix ) { delete_metadata( 'user', 0, 'kconv_workflow_' . $kconv_suffix . '_' . get_current_blog_id(), '', true ); } // Remove only this site's new administrator preferences when full removal was explicitly requested. delete_metadata( 'user', 0, 'kconv_pro_discovery_hidden_' . get_current_blog_id(), '', true ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Explicit full uninstall enumerates only exact current-blog PDF sample review keys, then removes each through the metadata API. No other site's or plugin's keys are selected. $kconv_sample_review_keys = $wpdb->get_col( $wpdb->prepare( 'SELECT DISTINCT meta_key FROM %i WHERE meta_key LIKE %s', $wpdb->usermeta, $wpdb->esc_like( '_kconv_pdf_sample_review_' . get_current_blog_id() . '_' ) . '%' ) ); foreach ( $kconv_sample_review_keys as $kconv_sample_review_key ) { delete_metadata( 'user', 0, $kconv_sample_review_key, '', true ); } // Explicit full local removal also removes the site's onboarding preferences. // Newsletter preferences remain available through the private links in email. delete_option( 'kconv_welcome_consent_v1' ); foreach ( array( 'kconv_focus_', 'kconv_activation_redirect_', 'kconv_onboarding_shown_', 'kconv_pro_previews_hidden_' ) as $kconv_preference ) { delete_metadata( 'user', 0, $kconv_preference . get_current_blog_id(), '', true ); }