Wie kann ich verhindern, dass ein Plugin aktualisiert wird, wenn nicht die Mindest-PHP-Version erreicht ist?

7

Ich habe ein Plugin auf WordPress.org verteilt, das ziemlich beliebt ist. Ich muss die Unterstützung für PHP 5.2 einstellen und möchte zumindest die Unterstützung für PHP 5.2 einstellen, aber wenn ich das Minimum an PHP 5.4 erreichen könnte, wären späte statische Bindungen und nützliche Abschlüsse großartig.

Bevor Sie PHP7 sagen, denken Sie daran, dass das Plugin nur über 100.000 Websites ausführt. Für alle WordPress-Sites sind 10% der Sites auf PHP 5.3 oder niedriger. Ich riskiere nicht, 10.000 Websites zu beschädigen.

Wir werden einen PHP-Mindestversionsheader hinzufügen , aber dies macht auf programmatischer Ebene noch nichts.

Ich suche nach dem richtigen Muster, um Aktualisierungen meines Plugins dauerhaft kurzzuschließen, es sei denn, die PHP-Versionsanforderung ist festgelegt. Hat jemand eine kugelsichere Möglichkeit, dies zu tun?

JPollock
quelle

Antworten:

3

Dies ist derzeit nicht möglich. Nicht ohne dass der PHP-Mindestversionsheader implementiert ist.

Wenn das erledigt ist, wird es möglich sein. Bis dahin können Sie nicht allein über den Plugin-Code basteln.

Theoretisch könnten Sie ein Update veröffentlichen, das zukünftige Updates für dieses eine Plugin blockiert, wenn die PHP-Version nicht erfüllt wird. Selbst dann würde dies Ihr Plugin nicht daran hindern, Updates zu erhalten, wenn es nicht aktiv ist. Dies ist also nicht möglich, da Plugin-Updates von WordPress und nicht von den Plugins selbst durchgeführt werden.

Otto
quelle
Wenn das Plugin jedoch nicht aktiv ist, verursachen die Updates erst dann ein Problem, wenn es aktiviert ist. Recht? Konnte er den Plugin-Aktivierungs-Hook nicht mit nur 5.2-Code verwenden, die Version überprüfen und das Plugin mit einem Administrator-Hinweis deaktivieren, wenn er nicht kompatibel ist?
Nathan Johnson
2
Es ist etwas verfrüht, dies selbst zu tun, wenn aktive Arbeit geleistet wird, um sowohl eine solche Prüfung zum Kern hinzuzufügen als auch möglicherweise die APIs zu ändern, um zu verhindern, dass inkompatible Updates an Benutzer gesendet werden. Dies ist ein Problem, an dem aktiv gearbeitet wird, ohne dass die Waffe springen muss. :)
Otto
0

F ** k die Ludditen;)

Obwohl ich die Frage nicht direkt beantworte, ist meine eigene Erfahrung beim Verschieben eines halbpopulären Plugins von 5.2 auf 5.3, dass es viel weniger Reibung gibt, als Sie es von den Nutzungsstatistiken von wordpress.org erwarten können, und diese Reibungen können normalerweise leicht von der Websitebesitzer.

Und natürlich verdienen Leute, die direkte Änderungen an Produktionsstandorten vornehmen, einfach alles, was sie bekommen;)

In gewisser Weise verletzen Sie die Benutzer mehr, als ihnen zu helfen, es sei denn, Sie können einen auffälligen Hinweis auf die Inkompatibilität geben, da sie ohne einen solchen Hinweis keinen Anreiz erhalten, ihre Serverumgebung zu aktualisieren, und dies nicht wissen Erhalten Sie niemals neue Funktionen oder Sicherheitsupdates.

Mark Kaplun
quelle
0

Ich denke, es kann getan werden.

Ich benutze diesen Prozess, um bei der Plugin-Aktivierung nach der Mindestversion zu suchen. Sie können eine Variation davon verwenden, um dies während eines Upgrades zu überprüfen (obwohl ich denke, dass ein Upgrade auf eine neue Version, die diesen Code enthält, dazu führen würde, dass das Plugin deaktiviert wird).

Der Code zum Überprüfen der Mindestversionen:

function is_requirements_met()
{
    $min_wp = '4.6' ; // minimum WP version
    $min_php = '5.3' ; // minimum PHP version
    // Check for WordPress version
    if ( version_compare( get_bloginfo('version'), $min_wp, '<' ))
    {
        return false ;
    }
    // Check the PHP version
    if ( version_compare(PHP_VERSION, $min_php, '<'))
    {
        return false ;
    }
    return true ;
}

.... und dann dies, um das Plugin zu deaktivieren, wenn die Versionen nicht den Anforderungen entsprechen (Funktion wird falsch zurückgegeben)

if ( is_plugin_active( plugin_basename(__FILE__)))
    {
        deactivate_plugins( plugin_basename(__FILE__)) ;
        // Hide the default "Plugin activated" notice
        if ( isset ($_GET['activate']))
        {
            unset ($_GET['activate']) ;
        }
    }

Dann zeige ich eine Admin-Nachricht an, um sie wissen zu lassen, dass das Plugin deaktiviert wurde:

add_action('admin_notices', 'show_notice') ;

Wo die show_noticeFunktion eine abweisbare Administratorbenachrichtigung anzeigt.

function show_notice()
{
    echo '<div class="notice notice-error is-dismissible"><h3><strong>Plugin </strong></h3><p> cannot be activated - requires at least WordPress 4.6 and PHP 5.3.&nbsp;&nbsp;&nbsp;Plugin automatically deactivated.</p></div>' ;
    return ;
}

Funktioniert gut.

Bearbeitet, um hinzuzufügen

Was ist, wenn Sie Code in Ihr Plugin einfügen, um das Plugin-Upgrade zu blockieren (etwa: /programming/17897044/wordpress-how-to-disable-plugin-update ).

Die neue Version des Plugins verfügt über einen Pre-Load-Stub. Es wird eine Überprüfung der PHP-Version durchgeführt. Wenn OK, laden Sie den Rest des Plugins. Wenn nicht, laden Sie den Rest des Plugins nicht. Code im Pre-Load-Stub funktioniert in allen PHP-Versionen.

Der Pre-Stub enthält keinen PHP 7x-Code, sodass die Vorverarbeitung des Stubs keinen Fehler verursacht. Der Pre-Stub deaktiviert das Plugin auch mit etwas ähnlichem wie meiner ursprünglichen Antwort.

Wenn die PHP-Version 7x ist, lädt der Pre-Load-Stub den Rest des Plugins. Und Bob ist dein Onkel.

Rick Hellewell
quelle
Wenn das Plugin (aus Gründen des Arguments) in PHP 7.2 unter Verwendung der neuen Sprachfunktionen geschrieben wurde, ist es wahrscheinlicher, dass die Site abstürzt, bevor eine Benachrichtigung ausgegeben wird. Wenn Sie diesen Weg gehen, sollten Sie bei der Aktivierung sterben, aber dann wird der Aktivierungs-Hook beim Plugin-Upgrade überhaupt nicht ausgeführt.
Mark Kaplun
Welcher Teil meines Beispielcodes kann die Site wahrscheinlich zum Absturz bringen, bevor eine Benachrichtigung ausgegeben wird? Beachten Sie, dass dies nur Codefragmente sind und nicht anzeigen, in welchem ​​Teil des Plugin-Codes sie sich befinden. Ich stimme zu, dass diese Nachrichten nicht für mehrere Sprachen geschrieben wurden. Und ich erwähnte, dass ich nicht sicher war, ob der Code bei einem Upgrade aufgerufen werden würde, und dass eine "Variation des Codes zur Überprüfung während eines Upgrades verwendet werden könnte".
Rick
... und obwohl der Code während eines Upgrades möglicherweise nicht ausgeführt wird, glaube ich, dass er beim nächsten Laden der Administrationsseite ausgeführt wird.
Rick Hellewell
Ihr Code muss nicht abstürzen, aber andere Teile des Plugins, die eine 7.2-spezifische Syntax verwenden, führen zum Absturz des PHP-Interpreters. Nehmen wir an, Sie haben einen Init-Handler, der die 7.2-Syntax verwendet. Er wird bei Init ausgeführt und stürzt das System ab. Dies geschieht, bevor der Hinweis angezeigt wird
Mark Kaplun,
Siehe zusätzliche Antwortinformationen. Dieser Prozess könnte dazu führen, dass das Plugin PHP7.2 benötigt, ohne Websites zu beschädigen, die nicht über 7.2 verfügen.
Rick Hellewell