Update-Prüfung für ausgewählte Plugins in WordPress Multisite unterbinden

Die Update-Prüfung in einer Multisite Installation unterbinden kann nützlich sein, aber in der Regel nur für eine Auswahl an Plugins, die nicht im Repo gelistet sind und damit keiner Prüfung unterliegen. Das folgenden Plugin soll einen Ansatz darstellen, es funktioniert und kann gern erweitert werden, mehr Komfort ist sicher für den einen oder anderen nützlich.

Nichte selten werden für Kunden spezielle Plugins erstellt, die nicht im offiziellen Repository von WordPress liegen und trotzdem der Update-Prüfung unterliegen. Auch kann es dazu kommen, dass Plugins im Repository hinzukommen, die den gleichen Namen haben und damit ggf. versehentlich vom Anwender durch das Autoupdate überschrieben werden. Für eigene Plugins kann man dies in einer Single-Installation recht gut unterbinden - in einer Multisite Installation sieht dies anders aus. Ist das jeweilige Plugin in einem Blog des Netzwerkes aktiviert, dann wird die Prüfung durch das Plugin auch nur dort unterbunden, denn nur in dem Blog ist es inkludiert. In der Netzwerkverwaltung bleibt die Prüfung aktiv und ggf. werden dort Updates angeboten und überschreiben das Plugin.

Daher im folgenden kleines Plugin, welches ein Array besitzt, in dem die Plugins gelistet sind, die nicht bei der Update-Prüfung mitlaufen sollen. Das Plugin muss Netzwerkweit aktiviert werden.


<?php
/**
 * Plugin Name: Plugin updates blocker
 * Plugin URI:  
 * Description: Disable plugin update check for specific plugins list
 * Version:     1.0.0
 * Author:      Frank Bültge
 * Author URI:  https://bueltge.de
 * License:     GPLv3
 */

! defined( 'ABSPATH' ) and exit;

add_filter( 'http_request_args', 'fb_block_update_specific_plugins', 5, 2 );
function fb_block_update_specific_plugins( $r, $url ) {
	
	//var_dump( unserialize( $r['body']['plugins'] ) );
	
	if ( FALSE === stripos( $url, 'api.wordpress.org/plugins/update-check' ) )
		return $r;
	
	// array for the plugin slug - folder/file
	$blocked_plugins = array(
		'oembed-gist.php', // plugin without folder
		'subtitle/class-post_subtitle.php',
		'wp-slabText/wp-slabtext.php',
	);
	if ( empty( $blocked_plugins ) )
		return $r;
	
	$installed_plugins = unserialize( $r['body']['plugins'] );
	foreach( $blocked_plugins as $p ) {
		unset( $installed_plugins->plugins[ $p ] );
		unset( $installed_plugins->active[ array_key_exists( $p, $installed_plugins ) ] );
	}
	$r['body']['plugins'] = serialize( $installed_plugins );
	
	return $r;
}

Das obige Plugin soll einen Ansatz darstellen, es funktioniert und kann gern erweitert werden. Mehr Komfort ist sicher für den einen oder anderen nützlich.

Das obige Plugin ist nur bis WordPress 3.7 sinnvoll. Seit Version 3.7 wurde die API auf JSOn umgestellt und so muss auch das kleine Plugin angepasst werden. Der Hinweis kam von Ov3rfly, vielen Dank dafür.


<?php
/**
 * Plugin Name: Plugin updates blocker for WordPress 3.7 and higher
 * Plugin URI:  
 * Description: Disable plugin update check for specific plugins list
 * Version:     2.0.0
 * Author:      Frank Bültge, Ov3rfly
 * License:     GPLv3
 */

! defined( 'ABSPATH' ) and exit;

add_filter( 'http_request_args', 'fb_prevent_update_check', 5, 2 );
function fb_prevent_update_check( $r, $url ) {
	
	if ( FALSE === strpos( $url, 'api.wordpress.org/plugins/update-check' ) )
		return $r;
			
	$my_plugin = plugin_basename( __FILE__ );
	
	$plugins = json_decode( $r[ 'body' ][ 'plugins' ] );
	
	unset( $plugins->plugins->$my_plugin );
	unset( $plugins->active[ array_search( $my_plugin, $plugins->active ) ] );
	
	$r[ 'body' ][ 'plugins' ] = json_encode( $plugins );
	
	return $r;
}

Kommentare sind geschlossen.