¿La mejor manera de abortar el complemento en caso de versión insuficiente de PHP?

15

Escribes un complemento que requiere PHP 5.1. Alguien intenta instalarlo en un servidor con PHP 4. ¿Cómo lidiar con eso de una manera segura y fácil de usar?

Geert
fuente
¿Por qué necesitarías esto? WP ya no se ejecuta en PHP <5
onetrickpony
Es una pregunta general. Es posible que desee requerir cualquier otra versión PHP más alta. Dicho esto, no sabía que se requiere PHP 5.2.4 desde WP 3.2 .
Geert
2
Para aquellos que buscan aumentar los requisitos de PHP de un complemento ya existente, haga un favor a sus usuarios existentes evitando que se actualice a la nueva versión si no se cumplen los requisitos. Un ejemplo de BuddyPress . Toma algo de preparación en versiones anteriores de su complemento, pero sus usuarios se lo agradecerán. Acabo de hacer algo similar en WordPoints , en caso de que decida actualizar los requisitos de PHP en el futuro.
JD

Respuestas:

15

Esta función y gancho de activación evita que el complemento se active y le permite verificar tanto una versión mínima de PHP como de 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
fuente
Esto no funciona si debido a cambios en la sintaxis de php el archivo php no se puede analizar en absoluto
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

No estoy seguro de qué versión de WP sucedió, pero en 3.5 el complemento en realidad no se activa y el mensaje de error se muestra al usuario en el administrador, que está ordenado.

Sin embargo, el mensaje de error no está traducido. Para hacerlo, tendría que cargar sus archivos de traducción justo antes de la exitllamada.

Geert
fuente
Creo que todavía prefiero este método por su simplicidad. Además, el complemento nunca se instala realmente, por lo que no es necesario activar rutinas de desinstalación en el caso de una versión PHP demasiado antigua.
Geert
6

Puede activarlo y mostrar un mensaje de error:

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

También es posible desactivarlo programáticamente antes de la declaración de devolución ...

Pony de un solo truco
fuente
Sí, aún necesita desactivarlo mediante programación si utiliza esta configuración porque, a pesar del aviso de administrador, el complemento se mostrará como activado.
Geert
1
verdeactivate_plugins
onetrickpony
1
la función version_comparetiene un tercer parámetro para la comparación; por favor useif ( version_compare( phpversion(), '5.1a', '<' ) )
bueltge
1
Eso solo es necesario cuando desea que esta función regrese boolean
onetrickpony
Pero, el valor booleano es más rápido en comparación con el valor entero 0.
bueltge
0

Sé que esta es una pregunta anterior, pero para aquellos que buscan una buena solución, Gary Pendergast tenía un buen camino que recorrer que cubre algunas de las bases mencionadas en las otras respuestas (vea su publicación aquí , he actualizado el código a continuación para verificar la versión de PHP, pero puede usarla para prácticamente cualquier verificación):

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

También he guardado el código anterior en una esencia .

Joshua Nelson
fuente
¡¿Qué demonios es esto?!
Andrei Surdu