Impedir a ativação do plug-in na rede

9

Eu tenho um plugin que atualmente não suporta ativação de rede. A melhor solução para isso, é claro, é corrigi-lo :), o que pretendo fazer. No entanto, gostaria de saber se existe uma solução temporária que possa ser usada para impedir a ativação da rede nesse meio tempo, talvez um fluxo de trabalho semelhante a:

  1. Detectar se a ativação é de toda a rede (como ??)
  2. Exibir mensagem de que atualmente não é suportado e que eu fede, desculpe
  3. Interromper a ativação ou desativar

Ou, outras sugestões aceitas. Obrigado.

Para esclarecimentos: A ativação multisite é boa, mas não a ativação em toda a rede.

k3davis
fonte

Respostas:

5

As respostas aqui são exageradas e muito complexas. Por que desativar o plug-in em vez de impedir a ativação? Algo tão simples quanto chamar die ('sua mensagem de erro aqui) após a ativação fará o trabalho.

function activate($networkwide) {
    if (is_multisite() && $networkwide) 
       die('This plugin can\'t be activated networkwide');
}

register_activation_hook('your-plugin/index.php','activate');

Então, ao tentar ativar no painel, você receberá um bom erro na parte superior da página, com sua mensagem de erro.

Maciej Krawczyk
fonte
6

Um cabeçalho de plug-in Network: falseserá ignorado pelo WordPress ... infelizmente. Mas o gancho de ativação obtém um parâmetro $network_wide, e podemos usá-lo para desativar o plug-in durante a ativação:

<?php
/**
 * Plugin Name: Prevent Network Activation
 * Plugin URI:  http://wordpress.stackexchange.com/questions/76145/prevent-network-activation-of-plugin
 * Network:     false
 *
 * Note the 'Network' option will be ignored by WordPress.
 */

register_activation_hook( __FILE__, 'pna_check_network_activation' );

function pna_check_network_activation( $network_wide )
{
    if ( ! $network_wide )
        return;

    deactivate_plugins( plugin_basename( __FILE__ ), TRUE, TRUE );

    header( 'Location: ' . network_admin_url( 'plugins.php?deactivate=true' ) );
    exit;
}
fuxia
fonte
Isso é útil, mas não me permite explicar o que está acontecendo (pelo menos conforme apresentado atualmente). Eu poderia simplesmente colocar um wp_dielá e pular o redirecionamento, mas isso parece um pouco menos cafona do que desativar sem explicação. :)
k3davis
11
Esta é a solução que acabei usando - apenas ajustei essa função para "morrer" para enviar a mensagem em vez de redirecionar para o URL desativado. Não é a mais limpa, mas atende a todos os requisitos e possui menos sobrecarga do que as outras soluções, para um patch temporário da minha parte.
K3davis
4

Você pode simplesmente ocultá-lo da lista de plugins de rede.

add_filter( 'all_plugins', 'wpse_76145_hide_network_plugin' );
function wpse_76145_hide_network_plugin( $all )
{
    global $current_screen;

    if( $current_screen->is_network )
        unset($all['akismet/akismet.php']);

    return $all;
}

E exiba um aviso de administrador de rede único. A adaptação das perguntas e respostas add_role () é executada apenas uma vez? .

add_action( 'network_admin_notices', 'wpse_76145_admin_notice' );

function wpse_76145_admin_notice()
{ 
    global $current_screen;
    if( 'plugins-network' == $current_screen->id )
    {
        if ( wpse_25643_run_once( 'hide_akismet_network' ) )
            echo '<div class="error">Akismet not available in Network mode</div>';
    }
}

function wpse_25643_run_once( $key )
{
    $test_case = get_option( 'run_once' );

    if ( isset( $test_case[$key] ) && $test_case[$key] )
    {
        return false;
    }
    else
    {
        $test_case[$key] = true;
        update_option( 'run_once',$test_case );
        return true;
    }
}

Ou use esta outra técnica: adicione um aviso aos usuários após o primeiro login na área de administração

brasofilo
fonte
2

(Isso não foi testado)

add_action( 'activated_plugin', 'wpse76145_no_network_activation',10,2 );
function wpse76145_no_network_activation( $plugin, $network_wide){

   if( $plugin == 'myplugin/myplugin.php' && $network_wide ){
       //Plugin was network activated

       //Network deactivate
       deactivate_plugins( $plugin,false, true );

       //Activate on single site
       activate_plugins( $plugin);

       add_option('wpse76145_network_activate_notice',1);
   }

}

E, em seguida, admin_noticesverifique a wpse76145_network_activate_noticeopção e exiba o aviso.

Nota: Seria melhor não codificar 'myplugin / myplugin.php' - acho que substituí-lo por plugin_basename(__FILE__);funcionaria (e é preferível).

Edite se a ativação de vários sites estiver ok, você pode usar switch_to_blog()para ativar cada plug-in individualmente. Eu ainda exibiria um aviso, pois você não fez o que o usuário pediu.

Stephen Harris
fonte
Isso pode funcionar, mas não entendo como o aviso do administrador será chamado se o plug-in já estiver desativado. Ou é a ativação de site único que permite que isso aconteça?
K3davis
Sim, você ativa o plugin apenas no site principal.
Stephen Harris