Arrête un plug-in dans le processus d'activation lorsqu'une certaine version de WP n'est pas remplie, puis affiche un message d'erreur dans le crochet d'action admin_notices.

10

J'ai un plugin que je ne souhaite pas activer s'il ne correspond pas à un certain numéro de version de WP, puis affiche un message d'erreur dans le hook d'action admin_notices. D'après mes recherches, le code ci-dessous est le meilleur que je puisse atteindre pour atteindre cet objectif:

$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 );
}

Mais je pense que je me trompe toujours car je reçois le message activé par le plug-in en même temps que l'avis d'erreur que j'ai assigné.

Quel serait le crochet / filtre d'action approprié pour arrêter correctement le processus d'activation du plug-in afin que je ne reçoive que le message d'erreur?

    
posée Carl Alberto 03.01.2017 - 12:01

4 réponses

3

Je risque d’être en retard pour cette partie, mais pour arrêter l’activation du plug-in et demander à WordPress d’afficher un message d’erreur lorsque l’avis de l’administrateur a été envoyé, je produis simplement un message d’erreur et termine l’exécution. Cela présente l’avantage supplémentaire de bien jouer avec wp-cli :

Exemple:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

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

}

register_activation_hook( __FILE__, array( 'testPlugin', 'activate' ));
    
réponse donnée Pascal Roget 09.03.2018 - 01:40
1

Essentiellement, vous ne pouvez pas le faire comme vous le souhaitez. Tous les formulaires wordpress sont redirigés après avoir terminé leur processus et ne génèrent pas de sortie eux-mêmes. Le message d'erreur est donc généré sur une demande de page différente. Si votre plugin ne sera pas actif à ce stade, aucun message ne sera affiché. Une complication supplémentaire est que les plugins pourraient être activés par Ajax.

Une méthode laide mais efficace consiste à échouer l'activation en générant une erreur php, ou n'importe quel type de sortie IIRC, vous pouvez donc générer quelque chose comme une "incompatibilité de version" dans le hook d'activation du plug-in, qui sera affiché dans l'erreur zone de sortie affichée lorsque l’activation échoue.

Pensez-y: les gens pourraient inclure vos fichiers de plug-in, ou bien l'activer avec force en contournant l'interface utilisateur ou en utilisant wp-cli. En fonction des raisons pour lesquelles vous souhaitez échouer l'activation, il peut être préférable de simplement avoir le message d'erreur que d'essayer d'échouer l'activation

    
réponse donnée Mark Kaplun 03.01.2017 - 12:31
1

Puisque vous avez mis à jour le titre, je dois fournir une autre réponse. Veuillez ne pas ignorer la précédente, car elle est encore plus simple que celle-ci.

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;
    }
}

Veuilleznoterquelorsquevousessayezd'activerleplug-in,vousinteragissezaveclefichierplugins.php.Vousytrouverezungrandnombred’actionsquevouspouvezexécuter.

Etsivousavezlecoded'erreurdéfini$_GET['error']aumomentoùvousnedisposezquedesmessagesd'erreurprédéfinis,vousnepouvezpascréervotrepropremessagepersonnalisé.C’estpourquoijevousaiproposécettesolution.

On peut proposer les messages personnalisés comme avis d’administration au cœur de WordPress dans le cas où les plugins ne répondent pas à certaines exigences.

    
réponse donnée prosti 03.01.2017 - 18:40
0

Que diriez-vous de ce code pour supprimer 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' );
      }
 }

Je pense que c’est bien, car cela ne vous oblige pas à créer des avis d’administrateur. Vous obtiendrez simplement le retour d'informations sur la raison de l'avortement de l'installation du plugin.

J'ai ajouté ce code pour HelloDolly, mais vous devrez vous adapter.

    
réponse donnée prosti 03.01.2017 - 13:22

Lire d'autres questions sur les étiquettes