web-dev-qa-db-fra.com

Arrêtez-vous de mettre en place le processus d'activation certain WP la version n'est pas remplie, puis affichez le message d'erreur dans le crochet d'action admin_notices

J'ai un plugin que je ne veux pas activer s'il ne correspond pas à un certain numéro de version WP, puis affiche un message d'erreur dans le crochet d'action admin_notices. Pour ce qui est de 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é.

 Stop a plugin in the activation process when a certain WP version is not met 

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?

9
Carl Alberto

Je suis peut-être en retard pour cette partie, mais pour arrêter l'activation du plug-in et demander à WordPress d'afficher un message d'erreur indiquant où vont les notifications de l'administrateur, je produis simplement un message d'erreur et termine l'exécution. Cela présente l’avantage supplémentaire de jouer à Nice avec wp-cli :

 Plugin activation failed 

Exemple:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

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

}

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

Puisque vous avez mis à jour le titre, il est nécessaire que vous fournissiez 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;
    }
}

 enter image description here 

Veuillez noter que lorsque vous essayez d'activer le plug-in, vous interagissez avec le fichier plugins.php. Vous avez ici un grand choix d’actions que vous pouvez exécuter.

Et si vous avez le code d'erreur défini $_GET['error'] au moment où vous ne disposez que des messages d'erreur prédéfinis, vous ne pouvez pas créer votre propre message personnalisé. C'est pourquoi je vous ai proposé une solution comme celle-ci.

 enter image description here 

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

2
prosti

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. 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 résultat IIRC, de sorte que vous pouvez simplement sortir quelque chose comme "version incorrecte" dans le hook d'activation du plugin, qui sera affiché dans la boîte de sortie d'erreur est affiché 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.

2
Mark Kaplun

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 une bonne chose 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.

0
prosti