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:

https://twitter.com/danielbachhuber/status/768907891294121984

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.

https://twitter.com/daggerhart/status/768917624939950080?s=09

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.

https://twitter.com/daggerhart/status/770627188991328256

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.

Veröffentlicht von Hans-Helge

Der studierte Informatiker arbeitet als Entwickler und Trainer bei ChurchTools und betreut neben eigenen Projekten einige andere Webseiten u.A. im ehrenamtlichen Bereich.

Beteilige dich an der Unterhaltung

10 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

    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. 🙂

  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.

    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.

  3. Die Filter sind für alle Arten von Updates, nicht nur für die Sicherheit. Die lassen sich ganz fein granulieren.

  4. Hallo,
    ich benutze das Plugin „WooCommerce PDF Invoices & Packing Slips“.
    Leider hat der Autor in seinem Aktualisierungs-Enthusiasmus wesentliche Features gestrichen, die es vorher gab – bzw. das Plugin in Version 2.0 funktioniert völlig anders als vorher.
    DAS ist genau das Szenario, wo ich das angebotene Update auf 2.x generell ausblenden möchte, solange bis ich einen besseren Plugin-Autor gefunden habe, der abwärtskompatibel arbeitet.
    Viele Grüße,
    risc

  5. Scheint leider nicht mehr zu funktionieren. Gab es hierzu Änderungen?

Schreibe einen Kommentar

Schreibe einen Kommentar zu Hans-Helge Antworten abbrechen

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