Le meilleur moyen d'abandonner le plugin en cas de version PHP insuffisante?

15

Vous écrivez un plugin qui nécessite PHP 5.1. Quelqu'un essaie de l'installer sur un serveur avec PHP 4. Comment gérez-vous cela de manière sûre et conviviale?

Geert
la source
Pourquoi auriez-vous besoin de ça? WP ne fonctionne plus sur PHP <5
onetrickpony
C'est une question générale. Vous voudrez peut-être exiger toute autre version PHP supérieure. Cela étant dit, je ne savais pas que PHP 5.2.4 était requis depuis WP 3.2 .
Geert
2
Pour ceux qui cherchent à améliorer les exigences PHP d'un plugin déjà existant, faites plaisir à vos utilisateurs existants en l'empêchant de se mettre à jour vers la nouvelle version si les exigences ne sont pas remplies. Un exemple de BuddyPress . Cela demande une certaine préparation dans les versions précédentes de votre plugin, mais vos utilisateurs vous en remercieront. Je viens de faire quelque chose de similaire dans WordPoints , au cas où je déciderais d'augmenter les exigences PHP à l'avenir.
JD

Réponses:

15

Cette fonction et ce crochet d'activation empêchent le plugin de s'activer et vous permettent de vérifier à la fois une version minimale de PHP et 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 ) );
}
Chris_O
la source
Cela ne fonctionne pas si, en raison de modifications de la syntaxe php, le fichier php ne peut pas être analysé du tout
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

Je ne sais pas depuis quelle version WP cela s'est produit, mais en 3.5, le plugin ne parvient pas à s'activer et le message d'erreur est affiché à l'utilisateur dans l'admin, ce qui est bien.

Le message d'erreur n'est cependant pas traduit. Pour ce faire, vous devez charger vos fichiers de traduction juste avant l' exitappel.

Geert
la source
Je pense que je préfère encore cette méthode pour sa simplicité. De plus, le plugin n'est jamais réellement installé, donc pas besoin de déclencher des routines de désinstallation en cas de version PHP trop ancienne.
Geert
6

Vous pouvez l'activer et afficher un message d'erreur:

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

Il est également possible de le désactiver par programme, avant l'instruction return ...

onetrickpony
la source
Oui, vous devez toujours le désactiver par programme si vous utilisez cette configuration, car malgré l'avis de l'administrateur, le plugin apparaîtra comme activé.
Geert
1
voirdeactivate_plugins
onetrickpony
1
la fonction version_comparea un troisième paramètre pour la comparaison; veuillez utiliserif ( version_compare( phpversion(), '5.1a', '<' ) )
bueltge
1
Cela n'est requis que lorsque vous souhaitez que cette fonction retourne un booléen
onetrickpony
Mais, la valeur booléenne est plus rapide en comparaison avec la valeur entière 0.
bueltge
0

Je sais que c'est une question plus ancienne, mais pour ceux qui recherchent une bonne solution, Gary Pendergast avait une bonne route à parcourir qui couvre quelques-unes des bases mentionnées dans les autres réponses (voir son post ici , j'ai mis à jour le code ci-dessous) pour vérifier la version PHP, mais vous pouvez l'utiliser pour pratiquement n'importe quelle vérification):

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

J'ai également enregistré le code ci-dessus dans un résumé .

Joshua Nelson
la source
Qu'est-ce que c'est que ça?!
Andrei Surdu