Cara terbaik untuk membatalkan plugin jika versi PHP tidak cukup?

15

Anda menulis sebuah plugin yang membutuhkan PHP 5.1. Seseorang mencoba menginstalnya di server dengan PHP 4. Bagaimana Anda menghadapinya dengan cara yang aman dan ramah pengguna?

Geert
sumber
Mengapa Anda membutuhkannya? WP tidak berjalan di PHP <5 lagi
onetrickpony
Itu pertanyaan umum. Anda mungkin ingin meminta versi PHP lebih tinggi lainnya. Yang sedang berkata, saya tidak menyadari PHP 5.2.4 diperlukan sejak WP 3.2 .
Geert
2
Bagi mereka yang ingin meningkatkan persyaratan PHP dari plugin yang sudah ada, bantulah pengguna Anda yang ada dengan mencegahnya memperbarui ke versi baru jika persyaratan tidak terpenuhi. Sebuah contoh dari BuddyPress . Diperlukan beberapa persiapan dalam versi plugin Anda sebelumnya, tetapi pengguna Anda akan berterima kasih. Saya hanya melakukan sesuatu yang serupa di WordPoints , kalau-kalau saya memutuskan untuk meningkatkan persyaratan PHP di masa depan.
JD

Jawaban:

15

Fungsi dan kait aktivasi ini mencegah plugin tidak aktif dan memungkinkan Anda memeriksa versi PHP dan WordPress minimum.

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
sumber
Ini tidak berfungsi jika karena perubahan sintaks php file php tidak dapat diuraikan sama sekali
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

Saya tidak yakin sejak versi WP mana ini terjadi, tetapi pada 3.5 plugin sebenarnya gagal untuk mengaktifkan dan pesan kesalahan ditampilkan kepada pengguna di admin, yang rapi.

Pesan kesalahan tidak diterjemahkan. Untuk melakukan itu, Anda harus memuat file terjemahan Anda tepat sebelum exitpanggilan.

Geert
sumber
Saya rasa saya masih lebih suka metode ini karena kesederhanaannya. Juga, plugin tidak pernah benar-benar diinstal, jadi tidak perlu memicu rutinitas deinstallasi jika versi PHP terlalu lama.
Geert
6

Anda dapat mengaktifkannya dan menampilkan pesan kesalahan:

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

Mungkin juga untuk menonaktifkannya secara terprogram, sebelum pernyataan pengembalian ...

onetrickpony
sumber
Ya, Anda masih harus menonaktifkannya secara terprogram jika Anda menggunakan pengaturan ini karena terlepas dari pemberitahuan admin, plugin akan ditampilkan sebagai diaktifkan.
Geert
1
lihatdeactivate_plugins
onetrickpony
1
fungsi version_comparememiliki param ketiga untuk perbandingan; silakan gunakanif ( version_compare( phpversion(), '5.1a', '<' ) )
bueltge
1
Itu hanya diperlukan ketika Anda ingin fungsi ini mengembalikan boolean
onetrickpony
Tapi, nilai boolean lebih cepat sebagai perbandingan dengan nilai integer 0.
bueltge
0

Saya tahu ini adalah pertanyaan yang lebih lama, tetapi bagi mereka yang mencari solusi yang baik, Gary Pendergast memiliki rute yang baik untuk pergi yang mencakup beberapa pangkalan yang disebutkan dalam jawaban lain (lihat postingnya di sini , saya telah memperbarui kode di bawah ini untuk memeriksa versi PHP, tetapi Anda dapat menggunakannya untuk hampir semua pemeriksaan):

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

Saya juga menyimpan kode di atas dalam inti .

Joshua Nelson
sumber
Apa-apaan ini?!
Andrei Surdu