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

9

Tengo un complemento que no deseo que se active si no cumple con un cierto número de versión de WP, luego se muestra un mensaje de error en el enlace de acción admin_notices. Hasta donde he investigado, el siguiente código es el 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 con el aviso de error que asigné.

Detenga un complemento en el proceso de activación cuando no se cumpla una determinada versión de WP

¿Cuál sería la acción correcta de enganchar / filtrar para detener correctamente el proceso de activación del complemento para que solo reciba el mensaje de error?

Carl Alberto
fuente
Plese @CarlAlberto considera mi respuesta.
prosti

Respuestas:

6

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

La activación del complemento falló

Ejemplo:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

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

}

register_activation_hook( __FILE__, array( 'testPlugin', 'activate' ));
Pascal Roget
fuente
2

Esencialmente, no puedes hacerlo como quieras. Todos los formularios de WordPress se redirigen 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 punto, no se mostrará ningún mensaje. Una complicación adicional es que los complementos pueden ser activados por Ajax.

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

Algo en lo que pensar: las personas pueden incluir sus archivos de complemento, o de alguna manera activarlo de manera forzosa omitiendo la interfaz de usuario o usando wp-cli. dependiendo de las razones por las que desea fallar la activación, solo tener el mensaje de error podría ser mejor que intentar fallar la activación

Mark Kaplun
fuente
2

Como actualizó el título, necesito proporcionar la otra respuesta, la anterior, por favor, no la ignore 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;
    }
}

ingrese la descripción de la imagen aquí

Tenga en cuenta que cuando intenta activar el complemento, interactúa con el archivo plugins.php. Ahí tienes un gran interruptor de acciones que puedes ejecutar.

Y en caso de que tenga el error establecido $_GET['error']en el momento en que tiene solo los mensajes de error predefinidos, no puede crear su propio mensaje personalizado. Es por eso que te propuse la solución como esta.

ingrese la descripción de la imagen aquí

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

prosti
fuente
3
Esto no funciona. Si el complemento no está activo, WP no ejecutará los scripts en el archivo, por lo tanto, al presionar la URL de redireccionamiento, la función enganchada no se activa admin_notices.
JakeParis
0

¿Qué tal 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á comentarios sobre el motivo del aborto de la instalación del complemento.

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

prosti
fuente