Netzwerkaktivierung des Plugins verhindern

9

Ich habe ein Plugin, das derzeit keine Netzwerkaktivierung unterstützt. Die beste Lösung dafür ist natürlich, es zu beheben :) was ich vorhabe zu tun. Ich frage mich jedoch, ob es eine temporäre Lösung gibt, mit der ich die Netzwerkaktivierung in der Zwischenzeit verhindern kann, möglicherweise einen ähnlichen Workflow wie:

  1. Ermitteln Sie, ob die Aktivierung netzwerkweit erfolgt (wie ??)
  2. Meldung anzeigen, dass es derzeit nicht unterstützt wird, und ich stinke, es tut mir leid
  3. Unterbrechen Sie die Aktivierung oder deaktivieren Sie sie

Oder andere Vorschläge akzeptiert. Vielen Dank.

Zur Verdeutlichung: Die Multisite-Aktivierung ist in Ordnung, nur keine netzwerkweite Aktivierung.

k3davis
quelle

Antworten:

5

Die Antworten hier sind überlegt und zu komplex. Warum das Plugin deaktivieren, anstatt die Aktivierung zu verhindern? Etwas so Einfaches wie das Aufrufen von die ('Ihre Fehlermeldung hier) bei der Aktivierung erledigt den Job.

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

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

Wenn Sie dann versuchen, im Bedienfeld zu aktivieren, wird oben auf der Seite ein netter Fehler mit Ihrer Fehlermeldung angezeigt.

Maciej Krawczyk
quelle
6

Ein Plugin-Header Network: falsewird von WordPress leider ignoriert. Der Aktivierungs-Hook erhält jedoch einen Parameter $network_wide, mit dem wir das Plugin während der Aktivierung deaktivieren können:

<?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
quelle
Dies ist nützlich, lässt mich aber nicht erklären, was passiert (zumindest wie derzeit dargestellt). Ich könnte einfach eine wp_dieeingeben und die Umleitung überspringen, aber das scheint nur ein wenig weniger schwierig zu sein, als ohne Erklärung zu deaktivieren. :)
k3davis
1
Dies ist die Lösung, die ich letztendlich verwendet habe. Ich habe diese Funktion einfach so eingestellt, dass sie "stirbt", um die Nachricht zu senden, anstatt zur deaktivierten URL umzuleiten. Es ist nicht das sauberste, aber es erfüllt alle Anforderungen und hat weniger Overhead als die anderen Lösungen, für einen temporären Patch meinerseits.
k3davis
4

Sie können es einfach aus der Liste der Netzwerk-Plugins ausblenden.

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

Zeigen Sie eine einmalige Benachrichtigung des Netzwerkadministrators an. Q & A anpassen add_role () nur einmal ausführen? .

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

Oder verwenden Sie diese andere Technik: Fügen Sie Benutzern beim ersten Anmelden im Administratorbereich einen Hinweis hinzu

brasofilo
quelle
2

(Dies ist ungetestet)

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

}

Und dann auf admin_noticesCheck für die wpse76145_network_activate_noticeOption und Anzeige Ankündigung.

Hinweis: Es ist besser, 'myplugin / myplugin.php' nicht fest zu codieren - ich denke, das Ersetzen durch plugin_basename(__FILE__);würde funktionieren (und wäre vorzuziehen).

Bearbeiten Wenn die Aktivierung mehrerer Standorte in Ordnung ist, können Sie switch_to_blog()sie für jedes Plug-In einzeln aktivieren. Ich würde immer noch einen Hinweis anzeigen, da Sie nicht getan haben, was der Benutzer gefragt hat.

Stephen Harris
quelle
Das mag funktionieren, aber ich verstehe nicht, wie die Administratorbenachrichtigung aufgerufen wird, wenn das Plugin bereits deaktiviert ist. Oder ist es die Aktivierung einer einzelnen Site, die dies ermöglicht?
k3davis
Ja, Sie aktivieren das Plugin nur auf der Hauptseite.
Stephen Harris