Лучший способ прервать плагин в случае недостаточной версии PHP?


15

Вы пишете плагин, который требует PHP 5.1. Кто-то пытается установить его на сервер с PHP 4. Как вы справляетесь с этим безопасным и удобным для пользователя способом?


Зачем вам это нужно? WP больше не работает на PHP <5
onetrickpony 13.12.12

Это общий вопрос. Вы можете захотеть потребовать любую другую более высокую версию 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 вообще не может быть проанализирован
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

Я не уверен, с какой версии WP это произошло, но в 3.5 плагин фактически не активируется и сообщение об ошибке показывается пользователю в админке, что очень удобно.

Сообщение об ошибке не переведено, хотя. Для этого вам необходимо загрузить файлы перевода прямо перед exitзвонком.


Я думаю, что я все еще предпочитаю этот метод за его простоту. Кроме того, плагин фактически никогда не устанавливается, поэтому нет необходимости запускать процедуры деинсталляции в случае слишком старой версии PHP.
Герт

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

Также возможно возможно деактивировать его программно, до оператора return ...


Да, вам все равно нужно деактивировать его программно, если вы используете эту настройку, потому что, несмотря на уведомление администратора, плагин будет отображаться как активированный.
Герт


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

1
Это требуется только в том случае, если вы хотите, чтобы эта функция возвращала логическое значение
onetrickpony

Но логическое значение быстрее по сравнению с целочисленным значением 0.
bueltge 17.12.12

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.