10. Juli 2025

WordPress:
Plugins im Live-Betrieb deaktivieren

Mit diesem Must Use Plugin kann man entweder alle oder einen Teil der Plugins gefahrlos im Live-Betrieb deaktivieren:

<?php

/*  Plugins deaktivieren, wenn dev=secure_mode, außer für erlaubte */
if((isset($_GET['dev']) && $_GET['dev']=='secure_mode') || (isset($_COOKIE['dev']) && $_COOKIE['dev']=='secure_mode')) {
	// Array von Plugin-Verzeichnisnamen, die NICHT deaktiviert werden sollen
	$allowed_plugins = array(
		'duplicate-post',
		'loco-translate'
	);
	
	// Aktive Plugins filtern, um nur erlaubte einzuschließen
	add_filter('option_active_plugins', function($plugins) use ($allowed_plugins) {
		if (!is_array($plugins)) {
			return array();
		}
		
		$filtered_plugins = array();
		foreach ($plugins as $plugin) {
			// Plugin-Verzeichnisname aus Plugin-Pfad extrahieren (z.B. 'plugin-dir/plugin-file.php' -> 'plugin-dir')
			$plugin_dir = dirname($plugin);
			if ($plugin_dir === '.' || in_array($plugin_dir, $allowed_plugins)) {
				$filtered_plugins[] = $plugin;
			}
		}
		
		return $filtered_plugins;
	}, 1);
	
	// Netzwerk-/seitenweite Plugins filtern, um nur erlaubte einzuschließen
	add_filter('site_option_active_sitewide_plugins', function($plugins) use ($allowed_plugins) {
		if (!is_array($plugins)) {
			return array();
		}
		
		$filtered_plugins = array();
		foreach ($plugins as $plugin => $activation_time) {
			// Plugin-Verzeichnisname aus Plugin-Pfad extrahieren
			$plugin_dir = dirname($plugin);
			if ($plugin_dir === '.' || in_array($plugin_dir, $allowed_plugins)) {
				$filtered_plugins[$plugin] = $activation_time;
			}
		}
		
		return $filtered_plugins;
	}, 1);
}

Der PHP-Code wird in /wp-content/mu-plugins/disable-plugins.php gesichert und mit dev=secure_mode als GET oder POST aktiviert.