Remove WordPress plugins under version control from update checks

Annoyed by the update information for plugins which are under version control like Git or SVN? Use this snippet to finally get rid of them.

/**
 * Removes plugins under version control from update checks.
 *
 * @param array  $request  An array of HTTP request arguments.
 * @param string $url     The request URL.
 * @return $array An array of HTTP request arguments.
 */
add_filter( 'http_request_args', function( $request, $url ) {
	if ( false === strpos( $url, 'api.wordpress.org/plugins/update-check' ) ) {
		return $request;
	}

	$vcs_dirs = [ '.git', '.svn', '.hg', '.bzr' ];

	$plugins = json_decode( $request['body']['plugins'] );
	foreach ( array_keys( (array) $plugins->plugins ) as $plugin ) {
		$plugin_dir = WP_PLUGIN_DIR . '/' . dirname( $plugin ) . '/';

		// Search directory for evidence of version control.
		foreach ( $vcs_dirs as $vcs_dir ) {
			if ( is_dir( $plugin_dir . $vcs_dir ) ) {
				// Remove plugin from the update check.
				unset( $plugins->plugins->$plugin );
				break;
			}
		}
	}

	$request['body']['plugins'] = wp_json_encode( $plugins );

	return $request;
}, 10, 2 );

You can extend $vcs_dirs with additional directories to add support for your VCS.

Photo by TUAN ANH TRAN.

Sicheres Weiterleiten mit der Funktion wp_safe_redirect()

wordpress-weiterleitung

In der Datei /wp-includes/pluggable.php ist die Funktion wp_redirect() zu finden. Diese kann zwei Argumente aufnehmen, die Zieladresse und der optionale HTTP Status Code.

Mit wp_redirect( 'https://dominikschilling.de/wp-admin/' ) könnte somit ganz einfach zu https://dominikschilling.de/wp-admin/ weitergeleitet werden.

Dank zwei existierenden Filtern kann die Zieladresse sowie der Status Code noch nachträglich geändert werden. So können Adressen vor der Weiterleitung überprüft werden, zum Beispiel um nur lokale Weiterleitungen zu erlauben.

Um diese Arbeit zu vereinfachen, stellt WordPress eine weitere Funktion names wp_safe_redirect() bereit.

Wird nun wp_safe_redirect( 'http://example.de/wp-admin/file.php' ) genutzt, wobei die WordPress Installation unter https://dominikschilling.de/wp-admin/file.php erreichbar ist, wird nicht zu der angegeben Adresse geleitet.
Der Grund dafür ist, dass die Zieladresse nicht im Bereich von home_url() (wäre https://dominikschilling.de/) liegt. Dies wird mittels wp_validate_redirect() geprüft.
Die Funktion wp_validate_redirect() bekommt als zweites Argument admin_url() übermittelt. Wird eine fehlerhafte Zieladresse ermittelt, wird in diesem Fall zum Dashboard weitergeleitet.

Wann lohnt sich nun wp_redirect() und wann wp_safe_redirect()?
Die erste Variante ist für eine Weiterleitung geeignet, wenn der Host der Zieladresse bekannt ist bzw. ihm vertraut werden kann.
Muss hingegen auf den Referrer für eine Weiterleitung gesetzt werden, sollte der Einsatz von wp_safe_redirect() bevorzugt werden.

Bildquelle: GirlieMac / flickr.com, Lizenz: CC BY 2.0.

Wohin mit den WordPress Codeschnipsel?

Da hat man mal wieder einen hilfreichen WordPress Codeschnipsel gefunden und stellt sich die Frage, wohin damit jetzt eigentlich?

schnipsel-image

Berechtigte Frage, denn es gibt viele Möglichkeiten. In diesem Artikel möchte ich auf 3 Varianten eingehen und kurz ihre Vor- bzw. Nachteile darstellen.

Variante 1: functions.php des Themes nutzen

Diese Variante ist wohl die weit Verbreiteste.
Codeschnipsel kopieren, functions.php des aktiven Themes öffen, Schnipsel an das Ende kopieren, speichern, fertig. Keine große Erklärung nötig; Schnelligkeit und Einfachheit sind somit die Vorteile.

Demgegenüber stehen allerdings ein paar Nachteile:
Wie dem folgendem Schnipsel aus der wp-settings.php zu entnehmen ist, wird die functions.php nicht immer geladen, immer dann nicht, wenn WP_INSTALLING definiert ist.

// Load the functions for the active theme, for both parent and child theme if applicable.
if ( ! defined( 'WP_INSTALLING' ) || 'wp-activate.php' === $pagenow ) {
	if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
		include( STYLESHEETPATH . '/functions.php' );
	if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
		include( TEMPLATEPATH . '/functions.php' );
}

Bei mehreren Schnipseln in der functions.php kann auch schnell die Übersicht verloren gehen, außerdem könnten bei einer Aktualisierung des Themes die Daten wieder verloren gehen. Stichwort Child Themes.

Variante 2: Ein Must-Use Plugin nutzen

Ein Must-Use Plugin? MU Plugins, in der deutschen Übersetzung Obligatorisch, sind PHP Dateien im /wp-content/mu-plugins Verzeichnis, die automatisch geladen werden.

Die Codeschnipsel können somit entweder jeweils in eine Datei oder alle direkt in einer Datei abgespeichert werden.
Diese Art von Plugins braucht übrigens auch nicht den üblichen File Header.

Der Vorteil liegt hierbei also bei der Organisation bzw. besseren Übersicht.
Ein weiterer Vorteil gegenüber der vorherigen (und auch nächsten) Variante ist, dass die MU Plugins früh geladen werden.

Die MU Plugins werden grundsätzlich immer geladen, heißt, auch bei einer Multisite Installation mit mehreren Blogs. Möchte man einen Codeschnipsel nur für einen Blog nutzen, so muss die jeweilige Blog ID abgefragt werden, oder verwendet die nächste Variante.

Variante 3: Ein simples, seitenspezifisches Plugin nutzen

Diese Variante hat vor kurzem Samuel Wood aka Otto in seinem Blog unter „Creating a Site-Specific Snippets Plugin“ veröffentlicht.

Hiebei wird ein einfaches Plugin wie folgt angelegt:

  1. Erstelle zunächst ein neues Verzeichnis im Plugin Verzeichnis, zum Beispiel /wp-content/plugins/example.de.
  2. Erstelle in dem neuen Verzeichnis eine leere PHP Datei, der Dateiname ist beliebig.
  3. Danach benötigt das Plugin einen File Header:
<?php
/*
Plugin Name: Plugin für example.de
Description: Codeschnipsel für example.de
*/

In diesem Plugin können jetzt die Codeschnipsel abgelegt werden. Entweder ein Plugin für alle oder für jeden Schnipsel ein Plugin, was den Vorteil mit sich bringt, dass sich die einzelnen Schnipsel/Plugins später einfach deaktivieren lassen.

Das waren drei verschiedene Varianten, wie man seine Codeschnipsel in WordPress integrieren kann.
Im Endeffekt muss nun jeder selbst entscheiden, so wie er es persönlich am Besten befindet.
Aber vielleicht gibt es ja noch andere Varianten, diese können natürlich gerne in den Kommentaren mitgeteilt werden.