Запретить сетевую активацию плагина

9

У меня есть плагин, который в настоящее время не поддерживает активацию сети. Лучшее решение для этого, конечно, это исправить :), что я планирую сделать. Однако мне интересно, есть ли временное решение, которое я могу использовать для предотвращения активации сети в то же время, возможно, рабочий процесс, подобный следующему:

  1. Определить, если активация в сети (как ??)
  2. Покажите сообщение, что это в настоящее время не поддерживается, и я воняю, извините
  3. Прервите активацию или деактивируйте

Или другие предложения принимаются. Спасибо.

Для пояснения: многосайтовая активация хороша, только не активация по всей сети.

k3davis
источник

Ответы:

5

Ответы здесь продуманы и слишком сложны. Почему деактивация плагина вместо предотвращения активации? Что-то простое, например, вызов die («ваше сообщение об ошибке здесь») после активации выполнит эту работу.

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

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

Затем, когда вы попытаетесь активировать на панели, вы получите красивую ошибку в верхней части страницы с вашим сообщением об ошибке.

Мацей Кравчик
источник
6

Заголовок плагина Network: falseбудет игнорироваться WordPress… к сожалению. Но хук активации получает параметр $network_wide, и мы можем использовать его для деактивации плагина во время активации:

<?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;
}
Фуксия
источник
Это полезно, но не позволяет мне объяснить, что происходит (по крайней мере, так, как представлено в настоящее время). Я мог бы просто вставить wp_dieтуда и пропустить перенаправление, но это кажется немного менее липким, чем деактивация без объяснения причин. :)
k3davis
1
Это решение, которое я использовал в итоге - я просто настроил эту функцию так, чтобы она «умирала» для отправки сообщения, а не для перенаправления на деактивированный URL. Это не самый чистый, но он отвечает всем требованиям и имеет меньше накладных расходов, чем другие решения, для временного исправления с моей стороны.
k3davis
4

Вы можете просто скрыть это из списка сетевых плагинов.

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

И отобразить одноразовое уведомление администратора сети. Адаптация вопросов и ответов add_role () запускается только один раз? ,

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

Или используйте эту другую технику: добавьте уведомление пользователям при первом входе в админку

brasofilo
источник
2

(Это не проверено)

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

}

А затем на admin_noticesпроверку для wpse76145_network_activate_noticeопции и отображения уведомления.

Примечание: было бы лучше не жестко кодировать «myplugin / myplugin.php» - я думаю, что замена его на plugin_basename(__FILE__);будет работать (и будет предпочтительнее).

Отредактируйте, если активирована многосайтовая активация, тогда вы можете использовать switch_to_blog()активацию для каждого плагина отдельно. Я бы по-прежнему отображал уведомление, так как вы не сделали то, о чем просил пользователь.

Стивен Харрис
источник
Это может сработать, но я не понимаю, как будет вызываться уведомление администратора, если плагин уже деактивирован? Или это единственная активация сайта, которая позволяет этому случиться?
k3davis
Да, вы активируете плагин только на главном сайте.
Стивен Харрис