Il modo migliore per interrompere il plugin in caso di versione PHP insufficiente?


15

Scrivi un plugin che richiede PHP 5.1. Qualcuno tenta di installarlo su un server con PHP 4. Come gestirlo in modo sicuro e intuitivo?


Perché ne avresti bisogno? WP non funziona più su PHP <5
onetrickpony,

È una domanda generale. Potresti voler richiedere qualsiasi altra versione di PHP superiore. Detto questo, non sapevo che PHP 5.2.4 fosse richiesto dal WP 3.2 .
Geert,

2
Per coloro che stanno cercando di soddisfare i requisiti PHP di un plug-in già esistente, fai un favore ai tuoi utenti esistenti impedendo che si aggiorni alla nuova versione se i requisiti non sono soddisfatti. Un esempio da BuddyPress . Ci vuole un po 'di preparazione nelle versioni precedenti del tuo plugin, ma i tuoi utenti ti ringrazieranno. Ho appena fatto qualcosa di simile in WordPoints , nel caso in cui decidessi di aumentare i requisiti di PHP in futuro.
JD

Risposte:


15

Questa funzione e il gancio di attivazione impediscono l'attivazione del plug-in e consentono di verificare sia una versione minima di PHP che 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 ) );
}

Questo non funziona se a causa delle modifiche alla sintassi php il file php non può essere analizzato affatto
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

Non sono sicuro da quale versione di WP sia successo, ma in 3.5 il plug-in in realtà non si attiva e il messaggio di errore viene mostrato all'utente nell'amministratore, il che è pulito.

Il messaggio di errore non è tradotto, però. Per fare ciò, dovresti caricare i tuoi file di traduzione subito prima della exitchiamata.


Penso di preferire ancora questo metodo per la sua semplicità. Inoltre, il plug-in non viene mai effettivamente installato, quindi non è necessario attivare routine di disinstallazione nel caso di una versione PHP troppo vecchia.
Geert,

6

È possibile attivarlo e mostrare un messaggio di errore:

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

Probabilmente è anche possibile disattivarlo a livello di codice, prima dell'istruzione return ...


Sì, è comunque necessario disattivarlo a livello di codice se si utilizza questa configurazione perché, nonostante l'avviso dell'amministratore, il plug-in verrà visualizzato come attivato.
Geert,


1
la funzione version_compareha un parametro thrid per il confronto; si prega di utilizzareif ( version_compare( phpversion(), '5.1a', '<' ) )
bueltge il

1
È richiesto solo quando si desidera che questa funzione ritorni booleana
onetrickpony,

Ma il valore booleano è più veloce in confronto al valore intero 0.
bueltge

0

So che questa è una domanda più vecchia, ma per coloro che cercano una buona soluzione, Gary Pendergast aveva una buona strada da percorrere che copre alcune delle basi menzionate nelle altre risposte (vedi il suo post qui , ho aggiornato il codice qui sotto per controllare la versione di PHP, ma puoi usarla praticamente per qualsiasi controllo):

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

Ho anche salvato il codice sopra in breve .


Che diavolo è questo?!
Andrei Surdu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.