Najlepszy sposób na przerwanie wtyczki w przypadku niewystarczającej wersji PHP?

15

Pisz wtyczkę, która wymaga PHP 5.1. Ktoś próbuje zainstalować go na serwerze z PHP 4. Jak sobie z tym poradzić w bezpieczny i przyjazny dla użytkownika sposób?

Geert
źródło
Dlaczego miałbyś tego potrzebować? WP nie działa już na PHP <5
onetrickpony 13.12.12
To ogólne pytanie. Możesz chcieć wymagać innej wyższej wersji PHP. To powiedziawszy, nie wiedziałem, że PHP 5.2.4 jest wymagane od WP 3.2 .
Geert
2
Dla tych, którzy chcą sprostać wymaganiom PHP już istniejącej wtyczki, wyświadcz swoim użytkownikom przysługę, uniemożliwiając jej aktualizację do nowej wersji, jeśli wymagania nie zostaną spełnione. Przykład z BuddyPress . Wcześniejsze wersje wtyczki wymagają pewnego przygotowania, ale użytkownicy będą Ci wdzięczni. Właśnie zrobiłem coś podobnego w WordPoints , na wypadek, gdyby zdecydowałem się podnieść wymagania PHP w przyszłości.
JD

Odpowiedzi:

15

Ta funkcja i haczyk aktywacyjny zapobiega aktywacji wtyczki i pozwala sprawdzić zarówno minimalną wersję PHP, jak i WordPress.

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
źródło
To nie działa, jeśli z powodu zmian składni php plik php nie może być w ogóle parsowany
Mark Kaplun 14.04.16
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

Nie jestem pewien, od której wersji WP tak się stało, ale w wersji 3.5 wtyczka faktycznie się nie aktywuje, a komunikat o błędzie jest wyświetlany użytkownikowi w adminie, co jest miłe.

Jednak komunikat o błędzie nie został przetłumaczony. Aby to zrobić, musisz załadować pliki tłumaczeń bezpośrednio przed exitpołączeniem.

Geert
źródło
Myślę, że nadal wolę tę metodę ze względu na jej prostotę. Ponadto wtyczka nigdy nie jest faktycznie instalowana, więc nie ma potrzeby uruchamiania procedur deinstalacyjnych w przypadku zbyt starej wersji PHP.
Geert
6

Możesz go aktywować i wyświetlić komunikat o błędzie:

// 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';

Prawdopodobnie możliwe jest również dezaktywowanie go programowo, przed instrukcją return ...

onetrickpony
źródło
Tak, nadal musisz go dezaktywować programowo, jeśli używasz tej konfiguracji, ponieważ pomimo powiadomienia administratora wtyczka pojawi się jako aktywowana.
Geert
1
patrzdeactivate_plugins
onetrickpony
1
funkcja version_comparema trzeci parametr do porównania; proszę użyćif ( version_compare( phpversion(), '5.1a', '<' ) )
bueltge,
1
Jest to wymagane tylko wtedy, gdy chcesz, aby ta funkcja zwróciła wartość logiczną
onetrickpony,
Ale wartość boolowska jest szybsza w porównaniu z wartością całkowitą 0.
bueltge
0

Wiem, że jest to starsze pytanie, ale dla tych, którzy szukają dobrego rozwiązania, Gary Pendergast miał dobrą drogę, która obejmuje kilka podstaw wymienionych w innych odpowiedziach (zobacz jego post tutaj , zaktualizowałem kod poniżej aby sprawdzić wersję PHP, ale możesz jej użyć do praktycznie każdej kontroli):

//  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' ) );

Zapisałem również powyższy kod w mgnieniu oka .

Joshua Nelson
źródło
Co to do diabła jest?!
Andrei Surdu,