Кращий спосіб відмінити плагін у разі недостатньої версії PHP?


15

Ви пишете плагін, для якого потрібен PHP 5.1. Хтось намагається встановити його на сервер із PHP 4. Як ви з цим справляєтесь безпечним та зручним для користувача способом?


Навіщо вам це потрібно? WP більше не працює на PHP <5
onetrickpony

Це загальне питання. Вам може знадобитися будь-яка інша більш висока версія PHP. Зважаючи на це, я не знав, що PHP 5.2.4 потрібен, оскільки WP 3.2 .
Герт

2
Для тих, хто прагне збільшити вимоги PHP вже наявного плагіна, зробіть своїм наявним користувачам послугу, не даючи йому оновитись до нової версії, якщо вимоги не виконані. Приклад від BuddyPress . У попередніх версіях плагіна потрібна певна підготовка, але ваші користувачі будуть вам вдячні. Я просто зробив щось подібне в WordPoints , якщо я вирішив підвищити вимоги PHP у майбутньому.
JD

Відповіді:


15

Ця функція та гачок активації запобігає активації плагіну та дозволяє перевірити наявність мінімальної PHP та 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 ) );
}

Це не працює, якщо через зміни синтаксису php файл php взагалі неможливо проаналізувати
Марк Каплун

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

Я не впевнений, з якої версії WP це сталося, але в 3.5 плагін насправді не активується і повідомлення про помилку відображається користувачеві в адміністраторі, що є акуратним.

Повідомлення про помилку не переведено. Для цього вам доведеться завантажити перекладацькі файли безпосередньо перед exitвикликом.


Думаю, я все ж віддаю перевагу цьому методу для його простоти. Крім того, плагін ніколи фактично не встановлюється, тому не потрібно запускати процедури деінсталяції у випадку занадто старої версії PHP.
Geert

6

Ви можете активувати його та показати повідомлення про помилку:

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

Можливо, також можливо деактивувати її програмно, перед випискою повернення ...


Так, вам все одно потрібно деактивувати це програмно, якщо ви користуєтесь цією установкою, оскільки, незважаючи на повідомлення адміністратора, плагін з’явиться як активований.
Geert

1
дивітьсяdeactivate_plugins
onetrickpony

1
функції version_compareмають третю парам для порівняння; будь ласка, використовуйтеif ( version_compare( phpversion(), '5.1a', '<' ) )
builtge

1
Це потрібно лише тоді, коли ви хочете, щоб ця функція поверталася
логічно

Але булеве значення швидше порівняно з цілим числом 0.
bueltge

0

Я знаю, що це питання старіше, але для тих, хто шукає хорошого рішення, Гері Пендергаст мав вдалий шлях, який охоплює декілька підстав, згаданих в інших відповідях (див. Його повідомлення тут , я оновив код нижче перевірити версію PHP, але ви можете використовувати її практично для будь-якої перевірки):

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

Я також зберег код вище в суть .


Що за чортівня?!
Андрій Сурду
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.