Arrêtez un plugin dans le processus d'activation lorsqu'une certaine version de WP n'est pas remplie, puis affichez un message d'erreur dans le crochet d'action admin_notices

9

J'ai un plugin que je ne veux pas activer s'il ne répond pas à un certain numéro de version WP, puis afficher un message d'erreur dans le crochet d'action admin_notices. Pour autant que j'ai fait des recherches, le code ci-dessous est le meilleur que je puisse 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 fais toujours mal parce que je reçois le message activé par le plugin en même temps avec l'avis d'erreur que j'ai attribué.

Arrêtez un plugin dans le processus d'activation lorsqu'une certaine version WP n'est pas remplie

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

Carl Alberto
la source
Veuillez @CarlAlberto considérer ma réponse.
prosti

Réponses:

6

Je suis peut-être en retard à cette fête, mais pour arrêter l'activation du plug-in et que WordPress affiche un message d'erreur là où les notifications d'administrateur vont, je produis simplement un message d'erreur et j'arrête l'exécution. Cela a l'avantage supplémentaire de bien jouer avec wp-cli :

L'activation du plugin a échoué

Exemple:

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
la source
2

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 par eux-mêmes et 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 s'affichera. Une complication supplémentaire est que les plugins peuvent être activés par Ajax.

Une façon laide mais fonctionnelle est d'échouer l'activation en générant une erreur php, ou IIRC n'importe quelle sortie fera, donc vous pouvez simplement sortir quelque chose comme "incompatibilité de version" dans le crochet d'activation du plugin, qui sera affiché dans la boîte de sortie d'erreur qui s'affiche lorsque l'échec de l'activation.

Quelque chose à penser: les gens pourraient inclure vos fichiers de plug-in, ou l'activer d'une manière ou d'une autre en contournant l'interface utilisateur ou en utilisant wp-cli. en fonction des raisons pour lesquelles vous souhaitez échouer l'activation, le simple fait d'avoir le message d'erreur peut être préférable à l'échec de l'activation

Mark Kaplun
la source
2

Puisque vous avez mis à jour le titre, je dois fournir une autre réponse, la précédente ne l'ignore pas, 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;
    }
}

entrez la description de l'image ici

Veuillez noter que lorsque vous essayez d'activer le plugin, vous interagissez avec le fichier plugins.php. Là, vous avez un gros commutateur d'actions que vous pouvez exécuter.

Et dans le cas où vous avez défini l'erreur $_GET['error']au moment où vous n'avez que les messages d'erreur prédéfinis - vous ne pouvez pas créer votre propre message personnalisé. C'est pourquoi je vous ai proposé la solution comme celle-ci.

entrez la description de l'image ici

On peut proposer les messages personnalisés en tant qu'avis d'administrateur au noyau WordPress dans le cas où les plugins ne répondent pas à certaines exigences.

prosti
la source
3
Cela ne fonctionne pas. Si le plugin n'est pas actif, WP n'exécutera pas les scripts dans le fichier, donc, lorsque vous frappez l'URL de redirection, la fonction accrochée à admin_noticesn'est pas déclenchée.
JakeParis
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 notifications d'administrateur. Vous obtiendrez simplement les commentaires sur la raison de l'avortement de l'installation du plugin.

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

prosti
la source