Detenga un complemento en el proceso de activación cuando no se cumpla con una determinada versión de WP, luego muestre un mensaje de error en el gancho de acción admin_notices

10

Tengo un complemento que no deseo que se active si no cumple con un determinado número de versión de WP y luego muestra un mensaje de error en el gancho de acción admin_notices. Por lo que he investigado, el código a continuación es lo mejor que puedo lograr este objetivo:

$wp_version = get_bloginfo('version');
if ( $wp_version < 4.5 ) {
    add_action( 'admin_init', 'deactivate_plugin_now' );
    add_action( 'admin_notices', 'errormsg' ) );
}

public function deactivate_plugin_now() {
    if ( is_plugin_active('myplugin/myplugin.php') ) {
        deactivate_plugins('myplugin/myplugin.php');
    }
}

public function errormsg () {
    $class = 'notice notice-error';
    $message = __( 'Error you did not meet the WP minimum version', 'text-domain' );
    printf( '<div class="%1$s"><p>%2$s</p></div>', $class, $message );
}

Pero creo que todavía lo estoy haciendo mal porque recibo el mensaje de activación del complemento al mismo tiempo que el aviso de error que asigné.

¿Cuál sería el gancho / filtro de acción adecuado para detener correctamente el proceso de activación del complemento para que solo aparezca el mensaje de error?

    
pregunta Carl Alberto 03.01.2017 - 12:01

4 respuestas

3

Puede que llegue tarde a esta fiesta, pero para detener la activación del complemento y hacer que WordPress muestre un mensaje de error a donde van los avisos del administrador, simplemente muestro un mensaje de error y finalizo la ejecución. Esto tiene la ventaja adicional de jugar bien con wp-cli :

Ejemplo:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

   if ($error) {
      die('Plugin NOT activated: ' . $error);
   }

}

register_activation_hook( __FILE__, array( 'testPlugin', 'activate' ));
    
respondido por el Pascal Roget 09.03.2018 - 01:40
1

Esencialmente, no puedes hacerlo de la manera que quieras. Todos los formularios de wordpress se están redireccionando después de completar su proceso y no generan resultados por sí mismos y, por lo tanto, el mensaje de error se genera en una solicitud de página diferente. Si su complemento no estará activo en ese momento, no se mostrará ningún mensaje. Otra complicación es que Ajax podría activar los complementos.

Una forma fea pero práctica es fallar la activación al generar un error de php, o IIRC hará cualquier salida, por lo que puede mostrar algo como "discrepancia de versión" en el gancho de activación del complemento, que se mostrará en el error cuadro de salida que se muestra cuando falla la activación.

Algo en lo que pensar: las personas pueden incluir sus archivos de complementos o, de alguna manera, activarlos de manera forzada al pasar por alto la interfaz de usuario o usar wp-cli. Dependiendo de las razones por las que desee fallar la activación, solo con el mensaje de error puede ser mejor que intentar fallar la activación

    
respondido por el Mark Kaplun 03.01.2017 - 12:31
1

Ya que has actualizado el título, necesito proporcionar la otra respuesta, la anterior, por favor, no la ignores porque es aún más simple que esta.

add_action( 'admin_notices', 'my_plugin_admin_notices' );

function my_plugin_admin_notices() {
    if ( ! is_plugin_active( 'hello.php' ) && isset( $_GET['customhello'] ) ) {
        echo '<div class="error"><p>WordPress need to be at least 8.5 to activate this plugin</p></div>';
    }
}

add_action( 'activate_plugin', '_20170113_superess_activate', 10, 2 );

function _20170113_superess_activate( $plugin, $network_wide ) {
    global $wp_version;
    if ( $wp_version < 8.5 && 'hello.php' == $plugin ) {
        $redirect = self_admin_url( 'plugins.php?customhello=1' );
        wp_redirect( $redirect );
        exit;
    }
}

Tengaencuentaquecuandointentaactivarelcomplemento,interactúaconelarchivoplugins.php.Allítienesungrancambiodeaccionesquepuedesejecutar.

Yencasodequetengaelerrorestablecido$_GET['error']enelmomentoenquesolotengalosmensajesdeerrorpredefinidos,nopodrácrearsupropiomensajepersonalizado.Poresolepropuseunasolucióncomoesta.

Uno puede proponer los mensajes personalizados como avisos de administración al núcleo de WordPress en caso de que los complementos no cumplan con algunos requisitos.

    
respondido por el prosti 03.01.2017 - 18:40
0

¿Qué hay de este código para suprimir hello.php (Hello Dolly) si WP < 8.5:

 add_action( 'activate_plugin', '_20170113_superess_activate' , 10, 2);

 function _20170113_superess_activate($plugin, $network_wide){
      global $wp_version;

      if ( $wp_version < 8.5 && 'hello.php' == $plugin ) {
        error_log( 'WordPress need to be at least 8.5' );      
        $args = var_export( func_get_args(), true );
        error_log( $args );
        wp_die( 'WordPress need to be at least 8.5 to activate this plugin' );
      }
 }

Creo que esto es bueno porque no te obliga a crear avisos de administrador. Simplemente recibirá los comentarios sobre el motivo del aborto de la instalación del complemento.

Agregué este código para HelloDolly, pero deberás ajustarlo.

    
respondido por el prosti 03.01.2017 - 13:22

Lea otras preguntas en las etiquetas