Arresta un plug-in nel processo di attivazione quando non viene soddisfatta una determinata versione di WP, quindi mostra il messaggio di errore nel gancio di azione admin_notices


9

Ho un plugin che non voglio essere attivato se non soddisfa un certo numero di versione di WP, quindi mostra il messaggio di errore nel gancio di azione admin_notices. Per quanto ho studiato, il codice qui sotto è il migliore che posso raggiungere questo obiettivo:

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

Ma penso che lo stia ancora facendo male perché ricevo il messaggio plugin attivato contemporaneamente con l'avviso di errore che ho assegnato.

Arresta un plug-in nel processo di attivazione quando non viene soddisfatta una determinata versione di WP

Quale sarebbe il corretto hook / filtro di azione per arrestare correttamente il processo di attivazione del plug-in in modo da ricevere solo il messaggio di errore?


Plese @CarlAlberto considera la mia risposta.
prosti

Risposte:


6

Potrei essere in ritardo a questa festa, ma per interrompere l'attivazione del plug-in e fare in modo che WordPress mostri un messaggio di errore in cui vanno gli avvisi dell'amministratore, ho semplicemente emesso un messaggio di errore e ho terminato l'esecuzione. Questo ha l'ulteriore vantaggio di giocare bene con wp-cli :

Attivazione del plug-in non riuscita

Esempio:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

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

}

register_activation_hook( __FILE__, array( 'testPlugin', 'activate' ));

2

Essenzialmente, non puoi farlo come vuoi. Tutti i moduli di wordpress vengono reindirizzati dopo aver completato il processo e non generano output da soli e pertanto il messaggio di errore viene generato su una richiesta di pagina diversa. Se il plug-in non sarà attivo a quel punto, non verrà visualizzato alcun messaggio. Ulteriore complicazione è che i plugin potrebbero essere attivati ​​da Ajax.

Un modo brutto ma funzionante è fallire l'attivazione generando un errore php, o IIRC farà qualsiasi output, quindi puoi semplicemente emettere qualcosa come "versione non corrispondente" nel gancio di attivazione del plugin, che verrà visualizzato nella casella di output dell'errore che viene visualizzato quando l'attivazione non riesce.

Qualcosa a cui pensare: le persone potrebbero includere i tuoi file plugin, o in qualche modo attivarli forzatamente bypassando l'interfaccia utente o usando wp-cli. a seconda dei motivi per cui si desidera fallire l'attivazione, è sufficiente avere il messaggio di errore piuttosto che tentare di fallire l'attivazione


2

Dato che hai aggiornato il titolo, devo fornire un'altra risposta, la precedente per favore non ignorare perché è ancora più semplice di questa.

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

inserisci qui la descrizione dell'immagine

Si noti che quando si tenta di attivare il plug-in si interagisce con il file plugins.php. Lì dentro hai un grande cambio di azioni che puoi eseguire.

E nel caso in cui tu abbia impostato l'errore $_GET['error']nel momento in cui hai solo i messaggi di errore predefiniti, non puoi creare il tuo messaggio personalizzato. Ecco perché ti ho proposto la soluzione in questo modo.

inserisci qui la descrizione dell'immagine

Si possono proporre messaggi personalizzati come avvisi di amministrazione al core di WordPress nel caso in cui i plugin non soddisfino alcuni requisiti.


3
Questo non funziona. Se il plugin non è attivo, WP non eseguirà gli script nel file, quindi, quando si colpisce l'URL di reindirizzamento, la funzione agganciata admin_noticesnon viene attivata.
JakeParis,

0

Che ne dici di questo codice per sopprimere hello.php (Hello Dolly) se 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' );
      }
 }

Penso che questo sia positivo perché non ti costringe a creare avvisi di amministrazione. Riceverai semplicemente il feedback sul motivo dell'aborto dell'installazione del plug-in.

Ho aggiunto questo codice per HelloDolly, ma dovrai modificarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.