Zapobiegaj aktywacji wtyczki przez sieć

9

Mam wtyczkę, która obecnie nie obsługuje aktywacji sieci. Najlepszym rozwiązaniem tego jest oczywiście naprawienie :), co planuję zrobić. Zastanawiam się jednak, czy istnieje tymczasowe rozwiązanie, którego mogę w międzyczasie zapobiec aktywacji sieci, być może przepływ pracy podobny do:

  1. Sprawdź, czy aktywacja obejmuje całą sieć (jak?)
  2. Wyświetl wiadomość, że obecnie nie jest obsługiwana i śmierdzę, przepraszam
  3. Przerwać aktywację lub dezaktywować

Lub inne sugestie zaakceptowane. Dzięki.

Dla wyjaśnienia: aktywacja wielu witryn jest w porządku, ale nie aktywacja w całej sieci.

k3davis
źródło

Odpowiedzi:

5

Odpowiedzi tutaj są przemyślane i zbyt złożone. Po co dezaktywować wtyczkę zamiast zapobiegać aktywacji? Coś tak prostego jak wywołanie die (po wyświetleniu komunikatu o błędzie) po aktywacji wykona zadanie.

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

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

Następnie, gdy spróbujesz aktywować w panelu, pojawi się ładny błąd na górze strony z komunikatem o błędzie.

Maciej Krawczyk
źródło
6

Nagłówek wtyczki Network: falsezostanie zignorowany przez WordPress… niestety. Ale hak aktywacyjny otrzymuje parametr $network_widei możemy go użyć do dezaktywacji wtyczki podczas aktywacji:

<?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
źródło
Jest to przydatne, ale nie pozwala mi wyjaśnić, co się dzieje (przynajmniej tak jak obecnie). Mógłbym po prostu wstawić wp_dietam i pominąć przekierowanie, ale wydaje się to tylko trochę mniej tandetne niż dezaktywacja bez wyjaśnienia. :)
k3davis,
1
Oto rozwiązanie, z którego korzystałem - właśnie dostosowałem tę funkcję, aby „umrzeć”, aby wysłać wiadomość, zamiast przekierowywać na dezaktywowany adres URL. To nie jest najczystsze, ale spełnia wszystkie wymagania i ma mniejszy narzut niż inne rozwiązania, z mojej tymczasowej łatki.
k3davis,
4

Możesz po prostu ukryć go na liście wtyczek sieciowych.

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

I wyświetl jednorazowe powiadomienie administratora sieci. Dostosowanie pytania i odpowiedzi add_role () działa tylko raz? .

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

Lub skorzystaj z tej innej techniki: dodaj powiadomienie do użytkowników przy pierwszym logowaniu do obszaru administracyjnego

brasofilo
źródło
2

(To nie jest testowane)

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

}

A następnie admin_noticeszaznacz wpse76145_network_activate_noticeopcję i wyświetl powiadomienie.

Uwaga: Lepiej byłoby nie kodować „myplugin / myplugin.php” - myślę, że zastąpienie go plugin_basename(__FILE__);działałoby (i byłoby lepiej).

Edytuj, jeśli aktywacja wielu witryn jest w porządku, możesz użyć switch_to_blog()do aktywacji każdej wtyczki osobno. Nadal wyświetlałbym powiadomienie, ponieważ nie zrobiłeś tego, o co poprosił użytkownik.

Stephen Harris
źródło
Może to działać, ale nie rozumiem, jak zostanie wywołane powiadomienie administratora, jeśli wtyczka jest już wyłączona? A może aktywacja pojedynczej witryny pozwala na to?
k3davis
Tak, aktywujesz wtyczkę tylko na stronie głównej.
Stephen Harris