Bester Weg, um das Plugin bei unzureichender PHP-Version abzubrechen?

15

Sie schreiben ein Plugin, das PHP 5.1 benötigt. Jemand versucht, es auf einem Server mit PHP 4 zu installieren. Wie gehen Sie damit sicher und benutzerfreundlich um?

Geert
quelle
Warum brauchst du das? WP läuft nicht mehr auf PHP <5
onetrickpony 13.12.12
Das ist eine allgemeine Frage. Möglicherweise möchten Sie eine andere höhere PHP-Version benötigen. Allerdings war mir nicht bewusst, dass PHP 5.2.4 seit WP 3.2 erforderlich ist .
Geert
2
Wenn Sie nach den PHP-Anforderungen eines bereits vorhandenen Plugins suchen, tun Sie Ihren vorhandenen Benutzern einen Gefallen, indem Sie verhindern, dass es auf die neue Version aktualisiert wird, wenn die Anforderungen nicht erfüllt werden. Ein Beispiel von BuddyPress . In früheren Versionen Ihres Plugins sind einige Vorbereitungen erforderlich, aber Ihre Benutzer werden es Ihnen danken. Ich habe gerade etwas Ähnliches in WordPoints gemacht , falls ich mich entscheide, die PHP-Anforderungen in Zukunft zu verbessern .
JD

Antworten:

15

Diese Funktion und dieser Aktivierungshook verhindern, dass das Plugin aktiviert wird, und ermöglichen es Ihnen, sowohl nach einer minimalen PHP- als auch nach einer WordPress-Version zu suchen.

register_activation_hook( __FILE__, array( 'Your_Plugin_Class_Name', 'activate' ) );

/**
  * Plugin Activation hook function to check for Minimum PHP and WordPress versions
  * @param string $wp Minimum version of WordPress required for this plugin
  * @param string $php Minimum version of PHP required for this plugin
  */
 function activate( $wp = '3.1', $php = '5.2.4' ) {
    global $wp_version;
    if ( version_compare( PHP_VERSION, $php, '<' ) )
        $flag = 'PHP';
    elseif
        ( version_compare( $wp_version, $wp, '<' ) )
        $flag = 'WordPress';
    else
        return;
    $version = 'PHP' == $flag ? $php : $wp;
    deactivate_plugins( basename( __FILE__ ) );
    wp_die('<p>The <strong>Insert PLugin Name Here</strong> plugin requires'.$flag.'  version '.$version.' or greater.</p>','Plugin Activation Error',  array( 'response'=>200, 'back_link'=>TRUE ) );
}
Chris_O
quelle
Dies funktioniert nicht, wenn aufgrund von Änderungen der PHP-Syntax die PHP-Datei überhaupt nicht analysiert werden kann
Mark Kaplun
10
/**
 * Plugin Name: Foo
 */

// Check for required PHP version
if ( version_compare( PHP_VERSION, '5.1', '<' ) )
{
    exit( sprintf( 'Foo requires PHP 5.1 or higher. You’re still on %s.', PHP_VERSION ) );
}

// The rest of your plugin code follows

Ich bin nicht sicher, seit welcher WP-Version dies passiert ist, aber in 3.5 kann das Plugin tatsächlich nicht aktiviert werden und die Fehlermeldung wird dem Benutzer im Admin angezeigt, was ordentlich ist.

Die Fehlermeldung wird jedoch nicht übersetzt. Dazu müssten Sie Ihre Übersetzungsdateien unmittelbar vor dem exitAnruf laden .

Geert
quelle
Ich glaube, ich bevorzuge diese Methode immer noch wegen ihrer Einfachheit. Außerdem wird das Plugin nie installiert, sodass bei einer zu alten PHP-Version keine Deinstallationsroutinen ausgelöst werden müssen.
Geert
6

Sie können es aktivieren und eine Fehlermeldung anzeigen:

// if PHP version is lower than 5.1
if(version_compare(PHP_VERSION, '5.1') < 0){

  // show a message inside the dashboard
  if(is_admin()){

    function my_plugin_notice(){      
      ?>
      <div class="error below-h2">
        <p>
        <?php
          printf(__('The abc plugin requires at least PHP 5.1. You have %s'), PHP_VERSION);
         ?>
        </p>
      </div>
      <?php
    }

    add_action('admin_notices', 'my_plugin_notice');

  }

  // stop here and do nothing further
  return;  
}

// if PHP version is equal or higher than 5.1
require dirname(__FILE__) . '/php51code.php';

Es ist wahrscheinlich auch möglich, es vor der return-Anweisung programmgesteuert zu deaktivieren ...

ein Trickpony
quelle
Ja, Sie müssen es immer noch programmgesteuert deaktivieren, wenn Sie dieses Setup verwenden, da das Plug-in trotz Administratorbenachrichtigung als aktiviert angezeigt wird.
Geert
1
siehedeactivate_plugins
onetrickpony
1
Die Funktion version_comparehat einen dritten Parameter für den Vergleich. Bitte benutzen Sieif ( version_compare( phpversion(), '5.1a', '<' ) )
Bueltge
1
Das ist nur erforderlich , wenn Sie wollen , dass diese Funktion boolean zurück
onetrickpony
Der boolesche Wert ist jedoch schneller als der ganzzahlige Wert 0.
bueltge
0

Ich weiß, dass dies eine ältere Frage ist, aber für diejenigen, die nach einer guten Lösung suchen, hatte Gary Pendergast einen guten Weg, der einige der in den anderen Antworten genannten Grundlagen abdeckt (siehe seinen Beitrag hier , ich habe den Code unten aktualisiert) um die PHP-Version zu überprüfen, aber Sie können sie für praktisch jede Prüfung verwenden):

//  In this example, only allow activation on WordPress 3.7 or higherclass 
MyPlugin {
function __construct() {
    add_action( 'admin_init', array( $this, 'check_version' ) );

    // Don't run anything else in the plugin, if we're on an incompatible WordPress version
    if ( ! self::compatible_version() ) {
        return;
    }
}

// The primary sanity check, automatically disable the plugin on activation if it doesn't// meet minimum requirements.static
function activation_check() {
    if ( ! self::compatible_version() ) {
        deactivate_plugins( plugin_basename( __FILE__ ) );
        wp_die( __( 'My Plugin requires PHP 5.1 or higher!', 'my-plugin' ) );
    }
}

// The backup sanity check, in case the plugin is activated in a weird way,
// or the versions change after activation.
function check_version() {
    if ( ! self::compatible_version() ) {
        if ( is_plugin_active( plugin_basename( __FILE__ ) ) ) {
            deactivate_plugins( plugin_basename( __FILE__ ) );
            add_action( 'admin_notices', array( $this, 'disabled_notice' ) );

            if ( isset( $_GET['activate'] ) ) {
                unset( $_GET['activate'] );
            }
        }
    }
}

function disabled_notice() {
    echo '<strong>' . esc_html__( 'My Plugin requires PHP 5.1 or higher!', 'my-plugin' ) . '</strong>';
}

static function compatible_version() {
    if ( version_compare(PHP_VERSION, '5.1', '<') ) {
        return false;
    }

    // Add sanity checks for other version requirements here

    return true;
}
}
global $myplugin;
$myplugin = new MyPlugin();
register_activation_hook( __FILE__, array( 'MyPlugin', 'activation_check' ) );

Ich habe den obigen Code auch in einer Zusammenfassung gespeichert .

Joshua Nelson
quelle
Was zur Hölle ist das?!
Andrei Surdu