Notwendige Plugins für das Theme erzwingen | Johannes Ulrich Gehrke
Notwendige Plugins für das Theme erzwingen
<?php
/* ******************* *\
 *  NOTWENIDGE PLUGINS *
\* ******************* */
require_once get_template_directory() . '/lib/tgmplugin/class-tgm-plugin-activation.php';

add_action( 'tgmpa_register', 'mein_theme_register_required_plugins' );

function mein_theme_register_required_plugins() {
	$plugins = array(
		/* Unyson wird benötigt */
		array(
			'name'      => 'Unyson',
			'slug'      => 'unyson',
			'required'  => true,
		),
		/* weitere Plugins, z.B.:
		array(
			'name'      => 'Optiontree',
			'slug'      => 'optiontree',
			'required'  => true,
		),
		*/
	);

	/* Konfiguration des Loaders */
	$config = array(
		'id'           => 'Mein Theme',             // Unique ID for hashing notices for multiple instances of TGMPA.
		'default_path' => '',                      // Default absolute path to bundled plugins.
		'menu'         => 'tgmpa-install-plugins', // Menu slug.
		'parent_slug'  => 'themes.php',            // Parent menu slug.
		'capability'   => 'edit_theme_options',    // Capability needed to view plugin install page, should be a capability associated with the parent menu used.
		'has_notices'  => true,                    // Show admin notices or not.
		'dismissable'  => false,                   // If false, a user cannot dismiss the nag message.
		'dismiss_msg'  => '',                      // If 'dismissable' is false, this message will be output at top of nag.
		'is_automatic' => false,                   // Automatically activate plugins after installation or not.
		'message'      => '',                      // Message to output right before the plugins table.
	);

	tgmpa( $plugins, $config );
}
( 1 ) - Mit der TGMPA Klasse wird in diesem Beispiel der Admin dazu gezwungen Unyson zu installieren und bekommt einen praktischen Link zum Klicken
/* ******************** *\
 * PLUGIN AKTIV PRÜFUNG *
\* ******************** */

if( !function_exists( 'is_plugin_active' ) ) {
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); // needed for is_plugin_active()
}

// === Test Plugins ===
$isUnysonActive = is_plugin_active( 'unyson/unyson.php' );

// === UNYSON IS ACTIVE ===
if( $isUnysonActive) {
	require_once 'lib/unyson/meine_unyson_bezogenen_funktionen.php';
};
( 2 ) - Prüft ob ein Plugin aktiv ist, dann können z.B. weitere Funktionen geladen werden
<?php
// === UNYSON IST NICHT AKTIV ===
if( !$isUnysonActive) {
	/* Warnung für Admin */
	function messageUnysonActive() {
		echo "<div class=\"notice notice-error\"><p>Unyson ist nicht aktiviert! Es kann zu Problemen im Theme kommen.</p></div>";
	}
	add_action( 'admin_notices', 'messageUnysonActive' );

	/* Fallback Funktionen */
	if( !function_exists( 'notwendige_unyson_funktion' ) ) {
		function notwendige_unyson_funktion( $parameter ) {
			return false;
		};
	};
};
( 3 ) - Ist es aber nicht aktiv, kann eine Warnung gezeigt werden - Außerdem sollten Funktionen des Plugins her als Fallback definiert werden

Notwendige WordPress Plugins vom Theme managen lassen

Das eigene Theme braucht oft Plugins – Viele Funktionen sind unnötig jedes mal selbst zu schreiben, oder man möchte auf einem Framework zugreifen, braucht komplexe Sonderfunktionen (z.B. Buddypress) oder möchte einfach die zusätzliche Eingabefelder vom OptionsTree haben.

Es gibt die Möglichkeit Plugins einfach in das Theme zu integrieren, dies macht aber das Theme und die genutzten Plugins nur komplizierter zu Updaten (wenn überhaupt). Besser ist hier eine Lösung, in welcher das Theme dem Admin „zwingt“ gewisse Plugins zu installieren und entsprechende Kontrollen durchführt. Drei Dinge sollte meiner Meinung nach das Theme im Plugin-Management übernehmen:

  • Admin auffordern notwendige Plugins zu installieren
  • Kontrollieren ob Plugins aktiv sind
  • Fallback Management nicht Diese nicht aktiv sind

Hier sind drei Code Beispiele, welche diese Funktionen übernehmen.

1 – Aufforderung zur Plugin Installation

Für das erste Beispiel wird die PHP-Klasse „TGM Plugin Activation“ benötigt. Die Klasse muss nur per require eingebunden werden. Sie macht es möglich, dass Plugins direkt aus dem offiziellem WordPress Plugin Verzeichnis, von einer eigenen URL, oder aus dem Theme-Verzeichnis gezogen werden können. Dafür bitte auf der Autoren-Seite die Dokumentation zur Konfiguration durchlesen. Wenn ein Plugin nicht installiert ist, wird dem Admin eine Nachricht angezeigt, dass eines oder mehrere Plugins benötigt werden. Dazu wird auch ein Link generiert, das eine fast automatische Installation möglich macht – Der Admin muss nur „Installieren“ drücken.

2 – Kontrolle ob Plugin aktiv ist

Im zweiten Beispiel wird eine Core Funktion von WordPress integriert. Mit dieser ist es möglich zu prüfen, ob ein Plugin aktiv ist oder nicht. Dafür wird der Slug des Plugins hergenommen, das ist der Pfad zur Hauptfile des Plugins. Diese Kontrolle ist sinnvoll, da man so über die functions.php steuern kann, dass weitere Funktionen nur geladen werden, wenn das Plugin auch aktiv ist. Ein Beispiel wäre, dass ein Plugin für Eingabe-Felder aktiviert wurde, und nur wenn es aktiv ist, auch die entsprechenden Metaboxen für Beiträge registriert werden – da diese sonst keinen Sinn machen.

3 – Fallback für Plugin-Funktionen im Theme

Plugins bringen oft ihre eigenen Funktionen mit, welche man im Theme braucht. Falls das Plugin aber nicht aktiv ist, und die Funktionen nicht gefunden werden, erzeugt das einen 500er Server Fehler und der Nutzer sieht nicht mehr als eine Fehlermeldung. Manchmal kann das so weit gehen, dass das ganze Backend nicht geht ( Fick dich ACF Pro ). D.h. man sollte zumindest für die Plugin-Eigenen-Funktionen die man man im Theme nutzt eine Fallback Variante schreiben. Diese muss nicht mehr können als False zurück geben – das Theme wird dann ggf. dennoch Fehlerhaft aussehen, aber es bricht nicht die komplette Seite.