Updating this answer the original code below will remove the nag screen but it will ping the server for updates on every load, thanks to @ El Yobo, see update below.
This will disable the core updates and the nag screen to everyone but superadmins.
add_action( 'after_setup_theme', 'remove_core_updates' );
function remove_core_updates()
{
if ( ! current_user_can( 'update_core' ) ) {
return;
}
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', '__return_null' );
add_filter( 'pre_site_transient_update_core', '__return_null' );
}
To disable all plugin notifications;
remove_action( 'load-update-core.php', 'wp_update_plugins' );
add_filter( 'pre_site_transient_update_plugins', '__return_null' );
To remove a specific plugin you can try this but it is not 100% going to work depending on the plugin;
function ya_remove_plugin_update($value) {
$plugin_relative_path = "plugin_relative_path"; // change this to your plugin
unset( $value->response[ $plugin_relative_path ] );
return $value;
}
add_filter( 'site_transient_update_plugins', 'ya_remove_plugin_update' );
Updated
This disable updates completely (I cannot get it to work based on user roles) AND stop pinging for updates (It will throw a PHP warning not sure how to fix this without altering core).
function remove_core_updates(){
global $wp_version;
return (object) array(
'last_checked' => time(),
'version_checked' => $wp_version,
);
}
add_filter('pre_site_transient_update_core', 'remove_core_updates');
add_filter('pre_site_transient_update_plugins', 'remove_core_updates');
add_filter('pre_site_transient_update_themes', 'remove_core_updates');