$accessnow_slms_type, 'post_status' => 'any', 'posts_per_page' => -1, 'fields' => 'ids', ) ); foreach ( $accessnow_slms_ids as $accessnow_slms_id ) { wp_delete_post( $accessnow_slms_id, true ); } } // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- removing the plugin's own tables and leftovers on uninstall. // Any remaining plugin post meta. $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", $wpdb->esc_like( '_slms_' ) . '%' ) ); // Custom tables (fixed names). $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}slms_enrollments" ); $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}slms_progress" ); $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}slms_quiz_attempts" ); $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}slms_lesson_notes" ); $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}slms_certificates" ); $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}slms_points" ); $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}slms_badges" ); // Transients (import notices, registration rate limits). $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_transient_accessnow_slms_' ) . '%', $wpdb->esc_like( '_transient_timeout_accessnow_slms_' ) . '%', $wpdb->esc_like( '_transient_slms_' ) . '%', $wpdb->esc_like( '_transient_timeout_slms_' ) . '%' ) ); // Quiz start times (per-site user options, so prefixed with this site's table prefix). $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s", $wpdb->esc_like( $wpdb->get_blog_prefix() . 'accessnow_slms_quiz_start_' ) . '%' ) ); // phpcs:enable // Options (current and pre-5.0.0 names). foreach ( array( 'accessnow_slms_settings', 'accessnow_slms_db_version', 'accessnow_slms_rewrite_version', 'accessnow_slms_upgrade_lock', 'slms_settings', 'slms_db_version', 'slms_rewrite_version', ) as $accessnow_slms_option ) { delete_option( $accessnow_slms_option ); } // Role and capabilities. remove_role( 'slms_student' ); $accessnow_slms_admin = get_role( 'administrator' ); if ( $accessnow_slms_admin ) { $accessnow_slms_admin->remove_cap( 'manage_slms' ); $accessnow_slms_admin->remove_cap( 'manage_slms_enrollments' ); $accessnow_slms_admin->remove_cap( 'manage_slms_reports' ); } // The course, unit, lesson and quiz capabilities (edit_slms_courses, ...), from every role. foreach ( array_keys( wp_roles()->roles ) as $accessnow_slms_role_name ) { $accessnow_slms_role = get_role( $accessnow_slms_role_name ); if ( ! $accessnow_slms_role ) { continue; } foreach ( array_keys( $accessnow_slms_role->capabilities ) as $accessnow_slms_cap ) { if ( preg_match( '/^(edit|edit_others|edit_private|edit_published|publish|read_private|delete|delete_others|delete_private|delete_published)_slms_(courses|units|lessons|quizzes)$/', $accessnow_slms_cap ) ) { $accessnow_slms_role->remove_cap( $accessnow_slms_cap ); } } } } if ( is_multisite() ) { foreach ( get_sites( array( 'fields' => 'ids' ) ) as $accessnow_slms_site_id ) { switch_to_blog( $accessnow_slms_site_id ); if ( accessnow_slms_uninstall_wanted() ) { accessnow_slms_uninstall_site(); } restore_current_blog(); } } elseif ( accessnow_slms_uninstall_wanted() ) { accessnow_slms_uninstall_site(); // User meta is shared across a network, so it is only removed on single sites. delete_metadata( 'user', 0, 'accessnow_slms_dismiss_reg_notice', '', true ); delete_metadata( 'user', 0, 'slms_dismiss_reg_notice', '', true ); }