Empêcher l'activation réseau du plugin


9

J'ai un plugin qui ne prend actuellement pas en charge l'activation du réseau. La meilleure solution pour cela est bien sûr de le réparer :) que je prévois de faire. Cependant, je me demande s'il existe une solution temporaire que je peux utiliser pour empêcher l'activation du réseau en attendant, peut-être un flux de travail similaire à:

  1. Détectez si l'activation est à l'échelle du réseau (comment ??)
  2. Afficher un message indiquant qu'il n'est actuellement pas pris en charge, et je pue, je suis désolé
  3. Interrompez l'activation ou désactivez

Ou, d'autres suggestions acceptées. Merci.

Pour plus de précision: l'activation multisite est correcte, mais pas l'activation à l'échelle du réseau.

Réponses:


5

Les réponses ici sont trop réfléchies et trop complexes. Pourquoi désactiver le plugin au lieu d'empêcher l'activation? Quelque chose d'aussi simple que d'appeler die ('votre message d'erreur ici) lors de l'activation fera le travail.

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

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

Ensuite, lorsque vous essayez d'activer dans le panneau, vous obtiendrez une belle erreur en haut de la page, avec votre message d'erreur.


6

Un en-tête de plugin Network: falsesera ignoré par WordPress… malheureusement. Mais le crochet d'activation obtient un paramètre $network_wide, et nous pouvons l'utiliser pour désactiver le plugin pendant l'activation:

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

Ceci est utile, mais ne me permet pas d'expliquer ce qui se passe (au moins tel que présenté actuellement). Je pourrais simplement mettre un wp_diededans et sauter la redirection, mais cela semble seulement un peu moins collant que de désactiver sans explication. :)
k3davis

1
C'est la solution que j'ai finalement utilisée - j'ai juste ajusté cette fonction pour "mourir" pour envoyer le message plutôt que de rediriger vers l'URL de désactivation. Ce n'est pas le plus propre, mais il répond à toutes les exigences et a moins de frais généraux que les autres solutions, pour un patch temporaire de ma part.
k3davis

4

Vous pouvez simplement le masquer de la liste des plugins réseau.

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

Et afficher une notification d'administration réseau unique. L'adaptation du Q&A add_role () ne s'exécute qu'une seule fois? .

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 utilisez cette autre technique: Ajoutez un avis aux utilisateurs lors de la première connexion à la zone d'administration


2

(Ceci n'est pas testé)

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

}

Et puis, admin_noticesvérifiez l' wpse76145_network_activate_noticeoption et affichez l'avis.

Remarque: Il serait préférable de ne pas coder en dur 'myplugin / myplugin.php' - je pense que le remplacer par plugin_basename(__FILE__);fonctionnerait (et serait préférable).

Modifiez si l'activation multisite est correcte, vous pouvez switch_to_blog()alors l'activer individuellement sur chaque plug-in. Je voudrais toujours afficher un avis car vous n'avez pas fait ce que l'utilisateur a demandé.


Cela pourrait fonctionner, mais je ne comprends pas comment l'avis d'administration sera appelé si le plugin est déjà désactivé? Ou est-ce l'activation d'un seul site qui permet que cela se produise?
k3davis

Oui, vous activez le plugin uniquement sur le site principal.
Stephen Harris
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.