在PHP版本不足的情况下中止插件的最佳方法?


15

您编写了一个需要PHP 5.1的插件。有人试图将其安装在具有PHP 4的服务器上。如何以安全且用户友好的方式处理该问题?


你为什么需要那个?WP不再在PHP <5上运行– 2012
onetrickpony

这是一个普遍的问题。您可能需要其他更高的PHP版本。话虽这么说,但是自WP 3.2以来,我不知道需要PHP 5.2.4
盖尔特

2
对于那些正在寻找现有插件的PHP要求的人,如果不满足要求,可以阻止它更新到新版本,从而对您的现有用户有所帮助。BuddyPress示例。插件的先前版本需要做一些准备,但是您的用户将感谢您。我只是在WordPoints中了类似的事情,以防将来决定提高PHP要求。
JD

Answers:


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版本太旧,则无需触发卸载例程。
盖尔特2012年

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语句之前以编程方式将其停用...


是的,如果您使用此设置,则仍需要以编程方式将其停用,因为尽管有管理员通知,该插件仍会显示为已激活。
盖尔特(Geert)2012年


1
该功能version_compare具有比较的主要参数;请使用if ( version_compare( phpversion(), '5.1a', '<' ) )
bueltge 2012年

1
仅在您希望此函数返回布尔值时才需要
onetrickpony 2012年

但是,该布尔值是更快与整数值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' ) );

我还将上面的代码保存在要点中


这到底是什么?!
Andrei Surdu '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.