Pare um plugin no processo de ativação quando uma determinada versão do WP não for atendida e mostre a mensagem de erro no gancho de ação admin_notices

10

Eu tenho um plugin que eu não quero que seja ativado se ele não atender a um determinado número de versão do WP e, em seguida, mostrar a mensagem de erro no gancho de ação admin_notices. Até onde eu pesquisei, o código abaixo é o melhor que eu posso alcançar 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 );
}

Mas acho que ainda estou fazendo errado porque estou recebendo a mensagem ativada do plug-in ao mesmo tempo com o aviso de erro que atribuí.

Qual seria o gancho / filtro de ação apropriada para interromper o processo de ativação do plug-in de modo que eu receba apenas a mensagem de erro?

    
por Carl Alberto 03.01.2017 / 12:01

4 respostas

3

Eu posso estar atrasado para essa parte, mas para parar a ativação do plug-in e fazer com que o WordPress mostre uma mensagem de erro em que os avisos do administrador foram enviados, simplesmente exibo uma mensagem de erro e termino a execução. Isto tem a vantagem adicional de jogar bem com wp-cli :

Exemplo:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

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

}

register_activation_hook( __FILE__, array( 'testPlugin', 'activate' ));
    
por Pascal Roget 09.03.2018 / 01:40
1

Essencialmente, você não pode fazer do jeito que você quer. Todos os formulários wordpress são redirecionados após a conclusão do processo e não geram saída por si mesmos e, portanto, a mensagem de erro é gerada em uma solicitação de página diferente. Se o seu plugin não estiver ativo nesse ponto, não haverá mensagem exibida. Outra complicação é que os plugins podem ser ativados pelo Ajax.

Uma maneira feia mas funcional é falhar na ativação gerando um erro de php, ou IIRC qualquer saída irá fazer, então você pode simplesmente produzir algo como "incompatibilidade de versão" no gancho de ativação do plugin, que será exibido no erro caixa de saída que está sendo exibida quando a ativação falha.

Algo em que pensar: as pessoas podem incluir seus arquivos de plug-in ou, de alguma forma, ativá-lo com força, ignorando a interface do usuário ou usando o wp-cli. dependendo das razões pelas quais você quer falhar a ativação, apenas ter a mensagem de erro pode ser melhor do que tentar falhar a ativação

    
por Mark Kaplun 03.01.2017 / 12:31
1

Desde que você atualizou o título, eu preciso fornecer a outra resposta, a anterior por favor não ignore, porque é ainda mais simples 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;
    }
}

Porfavor,notequequandovocêtentaativaropluginvocêinteragecomoarquivoplugins.php.Lávocêtemumagrandemudançadeaçõesquevocêpodeexecutar.

E,casovocêtenhadefinidooerro$_GET['error']nomomentoemquetiverapenasasmensagensdeerropredefinidas,nãoserápossívelcriarsuaprópriamensagempersonalizada.Éporissoqueeupropusasoluçãoparavocê.

Pode-se propor as mensagens personalizadas como avisos de administração ao núcleo do WordPress em casos em que os plugins não atendem a alguns requisitos.

    
por prosti 03.01.2017 / 18:40
0

Que tal este código para suprimir o hello.php (Hello Dolly) se o 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' );
      }
 }

Acho que isso é bom porque não obriga você a criar avisos de administrador. Você simplesmente receberá o feedback sobre o motivo do aborto da instalação do plug-in.

Eu adicionei este código para HelloDolly, mas você precisará ajustar.

    
por prosti 03.01.2017 / 13:22