Plugins von Updates ausschließen

Disclaimer: Es gibt ein paar kritische Kommentare (was ich gut finde, danke dafür). Dieser Artikel empfiehlt NICHT Updates grundsätzlich zu verweigern. Ich bin FÜR Updates. Aber manchmal gibt es triftige Gründe das bewusst nicht zu wollen und dafür kann man das Plugin nutzen.

Ihr kennt das, man arbeitet und plötzlich hat man eine Idee für ein Projekt, Plugin, SaaS, you-name-it. Entweder man ist Entwickler und könnte die Idee umsetzen, hat aber gerade keine Zeit, oder man findet keinen Entwickler, der einem dabei hilft. Mir mangelt es oftmals an der Zeit, diese Projekt wirklich umzusetzen und so schwillt meine eigene Ideen-Liste immer weiter an 😀

So ging es wohl auch Daniel Bachhuber. Der twitterte vor ein paar Tagen eine Plugin Idee:

Seine Idee ist gar nicht so doof: Ein WordPress Plugin mit dem man installierte Plugins daran hindert nach Updates zu suchen. Das klingt vielleicht erstmal verrückt. Warum sollte man das machen wollen? Es gibt aber durchaus einige Anwendungsfälle dafür.

  1. Es wird eine ganz spezielle Version benötigt vom Plugin.
  2. Der Plugin Slug (mit dem sucht das Plugin auf WordPress.org nach Updates) ist auf WordPress.org schon von einem anderem Plugin belegt. Somit wäre ein Update kein Update, sondern ein überschreiben mit einem anderen Plugin.
  3. Man möchte, dass z.B. der Kunde bestimmte Plugins per se nicht updaten kann.

Das dachte sich wohl auch Jonathan Daggerhart und hat kurzerhand genau das Plugin geschrieben.

Jonathan hat die erste Version des Plugin zu allererst als Gist veröffentlicht. Ich habe mir das Plugin mal geschnappt und für euch installiert und ausprobiert. Dabei habe ich allerdings ein paar Fehler schon gefunden und Jonathan darauf aufmerksam gemacht. Gists sind zwar schön zum Teilen von Snippets, aber nicht so gut um mit anderen dran zu arbeiten. So hat er kurzerhand gleich mal den Code in ein eigenes Repo auf GitHub geschoben.

Lock Plugins

So nun aber mal Butter bei die Fische oder wie der Veganer sagen würde: Tofu bei die Blume. Wie funktioniert das Lock Plugin jetzt?

Der Code ist ziemlich kompakt und die Idee ist simple. WordPress checkt gelegentlich die installierten Plugins nach Update und fragt dabei im WordPress.org Repository nach. Das Plugin nutzt diesen HTTP Request aus. Dabei wird der Filter-Hook http_request_args verwendet. Jeder HTTP Request, den WordPress absetzt, läuft über diesen Filter. Dabei wird als erstes geprüft, ob es sich um einen Update Check handelt. Wenn das der Fall ist, werden die Plugins aus der Liste gestrichen für die keine Updates gesucht werden sollen. Dabei wendet das Lock Plugin einen eigenen Filter an: .

<?php
/*
 * Plugin Name:     Lock plugin updates
 * Description:     Prevent plugin updates
 * Version:         1.0.0
 * Author:          daggerhart
 */
add_filter( 'http_request_args', 'lock_plugins_http_request_args', 5, 2 );
/**
 * Prevent lookup of certain plugin updates
 * Source: https://markjaquith.wordpress.com/2009/12/14/excluding-your-plugin-or-theme-from-update-checks/
 *
 * @param $request
 * @param $url
 *
 * @return mixed
 */
function lock_plugins_http_request_args( $request, $url ) {
    if ( FALSE === strpos( $url, '//api.wordpress.org/plugins/update-check' ) ) {
        return $request; // Not a plugin update request. Bail immediately.
    }
    if ( empty($request['body']['plugins']) ){
        return $request;
    }
    $plugins = json_decode( $request['body']['plugins'], true );
    // get a list of locked plugins from somewhere
    $locked_plugins = apply_filters('lock_plugins-locked_plugins', array());
    foreach( $locked_plugins as $locked_plugin_basename )
    {
        $active_index = array_search( $locked_plugin_basename, $plugins['active'] );
        unset( $plugins['active'][ $active_index ] );
        unset( $plugins['plugins'][ $locked_plugin_basename ] );
    }
    $request['body']['plugins'] = wp_json_encode( $plugins );
    return $request;
}

Diesen Code kann man sich einfach in eine PHP Datei speichern und in wp-content/plugins/ ablegen und schon kann man es im WordPress Backend aktivieren. Nun muss man nur noch über den Filter Hook die Plugins aus der Liste streichen, die man nicht updaten möchte. Das macht man wie folgt:

add_filter('lock_plugins-locked_plugins', function($plugins){
  $plugins[] = 'akismet/akismet.php';

  return $plugins;
});

Diesen Code kann man in einem weiteren Plugin, in der functions.php seines Themes oder einfach in der selben Datei wie das Plugin ablegen. In diesem Beispiel wird nun Akismet aus der Liste gestrichen und somit wird dafür kein Update mehr angeboten im Backend. Das Schema ist ziemlich simple: <Ordnername>/<Plugin Datei>.php

Damit kann man jedes Plugin zu der „Lock-List“ hinzufügen.

Meine Meinung

Ich finde das Plugin sehr nützlich, denn seit der Bookmark Idee sind Latz und ich nach wie vor dran die Idee umzusetzen. Latz hat dafür extra schon mal einen Prototypen gebaut. Dummerweise verwendet er einen Plugin Slug, den es auf WordPress.org schon gibt und so weißt mich WordPress immer darauf hin, dass es ein Update dafür gibt. Was allerdings ja nicht stimmt, da es ein komplett anderes Plugin ist.

Mit Lock Plugin Updates konnte ich nun diesen Prototypen einfach aus der Update Liste streichen und nun herrscht ruhe im Backend 🙂

 

Jonathan gibt im Repo noch den Tipp, dass man das Plugin sogar als Must-Use-Plugin installiert. Somit ist sichergestellt, dass Kunden auch das Plugin selber nicht deaktivieren können um doch die Plugins zu aktualisieren.

Author: Hans-Helge

Als studierter Informatiker arbeitet Hans-Helge gerne als freiberuflicher WordPress Entwickler und betreut neben eigenen Projekten viele andere Webseiten u.A. im ehrenamtlichen Bereich.

6 Kommentare

  1. Hallo,

    schön das es noch Enthusiasten gibt, dich sich mit erstellen von sinnvollen Plugins beschäftigen.

    Jedoch bringt WordPress mit „Must Use Plugins“ eine solche Funktion schon mit:
    Man erstellt einfach einen Ordner „mu-plugins“ im „wp-content“-Ordner und schiebt hier die Plugins rein, die wie der Name schon sagt, benutzt werden müssen.

    Weiter Informationen findet man hier:
    https://codex.wordpress.org/Must_Use_Plugins

    Antworten

    1. Das ist korrekt, dass es den mu-plugins Ordner gibt. Und ja Plugins die dort drin sind werden ebenfalls nicht in der Update Liste erscheinen. Dennoch gibt es mit dieser Lösung einen Nachteil. Die Plugins sind immer aktiv. Mit dem hier vorgestellten Plugin hast du mehr Flexibilität und kannst den Nutzer selber entscheiden lassen welche Plugins er aktiveren möchte ohne in Gefahr zu laufen, dass ein Plugin mit einer neueren Version installiert wird. Zudem sind mu-plugins für das gesamte Netzwerk einer Multisite aktiviert und auch das ist ggf. nicht erwünscht. 🙂

      Antworten

  2. Warum nimmst du nicht die Filter für die functions.php, was spricht dagegen?

    https://codex.wordpress.org/de:Automatische_Hintergrund_Updates_einstellen#Plugin_.26_Theme_Updates_per_Filter

    Und wie sieht es mit den seltenen, aber durchaus denkbaren, seitens Core-Team ausgerollten Plug-in-Sicherheits-Updates aus? Näheres dort:
    https://de.wordpress.org/2015/04/die-hintergrund-updates-von-wordpress-was-genau-passiert-da-eigentlich/

    Man muss ja nicht aktualisieren (wenn man weiß, was man tut), nur weil ein Update angezeigt wird.

    Und Kundenseitig sehe ich das so, entweder der Dienstleister wartet die Website, dann ist das legitim, auch mal nicht zu aktualisieren (wenn es nur Bugfixes sind und nichst Sicherheitsrelevantes), oder der Kunde macht das alleine, dann sollte er aber alles immer aktualisieren, sonst läuft er Gefahr, Sicherheitslücken nicht zu schließen.

    Das soll keine Kritik sein :), ich finde es schön, wenn Entwickler wie du ihre Erfahrungen teilen.

    Antworten

    1. Der filter ist für automatische Sicherheitsupdates. Der Artikel spricht ja von normalen Update die im Backend angezeigt werden.

      Man muss ja nicht aktualisieren (wenn man weiß, was man tut), nur weil ein Update angezeigt wird.

      Das ist korrekt, aber manchmal möchte man das Update einfach nicht sehen oder einfach nicht in Gefahr laufen es doch ausversehen zu updaten.

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.