Impedisci l'attivazione di rete del plugin


9

Ho un plugin che al momento non supporta l'attivazione della rete. La migliore soluzione per questo ovviamente è risolverlo :) che ho intenzione di fare. Tuttavia mi chiedo se esiste una soluzione temporanea che posso usare per impedire l'attivazione della rete nel frattempo, forse un flusso di lavoro simile a:

  1. Rileva se l'attivazione è estesa a tutta la rete (come ??)
  2. Mostra il messaggio che al momento non è supportato e che puzzo, mi dispiace
  3. Interrompere l'attivazione o disattivare

Oppure, altri suggerimenti accettati. Grazie.

Per chiarimenti: l'attivazione multisito va bene, non solo l'attivazione a livello di rete.

Risposte:


5

Le risposte qui sono ripensate e troppo complesse. Perché disattivare il plug-in anziché impedire l'attivazione? Qualcosa di semplice come chiamare die ('qui il tuo messaggio di errore) all'attivazione farà il lavoro.

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

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

Quindi quando provi ad attivarti nel pannello, visualizzerai un bel errore nella parte superiore della pagina, con il tuo messaggio di errore.


6

Un'intestazione del plugin Network: falseverrà ignorata da WordPress ... purtroppo. Ma l'hook di attivazione ottiene un parametro $network_widee possiamo usarlo per disattivare il plugin durante l'attivazione:

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

Questo è utile, ma non mi permette di spiegare cosa sta succedendo (almeno come attualmente presentato). Potrei semplicemente inserire un passaggio wp_diee saltare il reindirizzamento, ma questo sembra solo un po 'meno pacchiano rispetto alla disattivazione senza spiegazione. :)
k3davis,

1
Questa è la soluzione che ho finito per usare - ho appena regolato questa funzione su "die" per inviare il messaggio piuttosto che reindirizzare all'URL di disattivazione. Non è il più pulito, ma soddisfa tutti i requisiti e ha meno spese generali rispetto alle altre soluzioni, per una patch temporanea da parte mia.
k3davis,

4

Potresti semplicemente nasconderlo dall'elenco dei plug-in di rete.

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 visualizza un avviso amministratore di rete una tantum. Adattamento della domanda e risposta add_role () eseguito una sola volta? .

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

Oppure usa questa altra tecnica: aggiungi un avviso agli utenti al primo accesso all'area di amministrazione


2

(Questo non è testato)

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 poi su admin_noticescontrolla l' wpse76145_network_activate_noticeopzione e visualizza l'avviso.

Nota: sarebbe meglio non hardcode 'myplugin / myplugin.php' - penso che sostituirlo con plugin_basename(__FILE__);funzionerebbe (ed è preferibile).

Modifica se l'attivazione multi-sito è corretta, quindi puoi utilizzare switch_to_blog()per l'attivazione su ciascun plug-in singolarmente. Vorrei comunque visualizzare un avviso poiché non hai fatto ciò che l'utente ha chiesto.


Questo potrebbe funzionare, ma non capisco come verrà chiamato l'avviso di amministratore se il plug-in è già disattivato? O è l'attivazione del singolo sito che consente che ciò accada?
k3davis,

Sì, attivi il plugin solo sul sito principale.
Stephen Harris,
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.