web-dev-qa-db-fra.com

Empêcher l'activation réseau du plugin

J'ai un plugin qui ne supporte pas l'activation du réseau. Bien entendu, la meilleure solution consiste à le réparer :), ce que je prévois de faire. Cependant, je me demande s’il existe une solution temporaire que je pourrais utiliser pour empêcher l’activation du réseau entre-temps, peut-être un flux de travail similaire à:

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

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

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

8
k3davis

Les réponses ici sont trop pensées 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 l'affaire.

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 obtenez une erreur Nice en haut de la page, avec votre message d'erreur.

5
Maciej Krawczyk

Un en-tête de plugin Network: false sera ignoré par WordPress… malheureusement. Mais le hook d’activation obtient un paramètre $network_wide, que nous pouvons 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;
}
5
fuxia

Vous pouvez simplement le cacher 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 affichez un avis unique d'administration réseau. Adapter le Q & A add_role () exécuté seulement une 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: Ajouter un avis aux utilisateurs lors de leur première connexion à la zone d'administration

4
brasofilo

(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 ensuite, sur admin_notices, recherchez l’option wpse76145_network_activate_notice et affichez un 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).

Éditer si l'activation multi-site est correcte, vous pouvez utiliser switch_to_blog() pour 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é.

2
Stephen Harris