Pare um plug-in 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

9

Eu tenho um plugin que não quero ser ativado se ele não atender a um determinado número de versão do WP e mostrar uma mensagem de erro no gancho de ação admin_notices. Tanto quanto eu pesquisei, o código abaixo é o melhor que posso alcançar esse 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 pelo plug-in ao mesmo tempo com o aviso de erro que designei.

Pare um plug-in no processo de ativação quando uma determinada versão do WP não for atendida

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

Carl Alberto
fonte
Plese @CarlAlberto considere minha resposta.
prosti

Respostas:

6

Talvez eu esteja atrasado para essa parte, mas para interromper a ativação do plug-in e fazer com que o WordPress mostre uma mensagem de erro para onde os avisos do administrador vão, basta enviar uma mensagem de erro e finalizar a execução. Isso tem a vantagem adicional de jogar bem com o wp-cli :

Falha na ativação do plug-in

Exemplo:

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
fonte
2

Essencialmente, você não pode fazer do jeito que quiser. Todos os formulários do 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 plug-in não estiver ativo nesse momento, nenhuma mensagem será exibida. Outra complicação é que os plugins podem ser ativados pelo Ajax.

Uma maneira feia, mas funcional, é falhar na ativação gerando um erro php, ou o IIRC faz com que qualquer saída funcione; portanto, você pode simplesmente exibir algo como "incompatibilidade de versão" no gancho de ativação do plug-in, que será exibido na caixa de saída de erro que está sendo exibido quando a ativação falha.

Algo para se pensar: as pessoas podem incluir seus arquivos de plug-in ou ativá-lo de alguma forma, contornando a interface do usuário ou usando o wp-cli. dependendo dos motivos pelos quais você deseja falhar na ativação, apenas ter a mensagem de erro pode ser melhor do que tentar falhar na ativação

Mark Kaplun
fonte
2

Como você atualizou o título, preciso fornecer a outra resposta, a anterior não a 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;
    }
}

insira a descrição da imagem aqui

Observe que quando você tenta ativar o plug-in, você interage com o arquivo plugins.php. Lá você tem uma grande opção de ações que você pode executar.

E caso você tenha o erro definido $_GET['error']no momento, você tem apenas as mensagens de erro predefinidas - você não pode criar sua própria mensagem personalizada. Foi por isso que propus a solução para você.

insira a descrição da imagem aqui

Pode-se propor as mensagens personalizadas como avisos do administrador para o núcleo do WordPress, caso os plug-ins não atendam a alguns requisitos.

prosti
fonte
3
Isso não funciona. Se o plug-in não estiver ativo, o WP não executará os scripts no arquivo; portanto, ao pressionar o URL de redirecionamento, a função conectada admin_noticesnão será acionada.
JakeParis 06/06
0

Que tal esse código para suprimir 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' );
      }
 }

Eu acho que isso é bom porque não força você a criar avisos de administração. Você simplesmente receberá o feedback sobre o motivo do aborto na instalação do plugin.

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

prosti
fonte