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


9

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

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

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

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

Ответы:


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

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


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

Да, вы активируете плагин только на главном сайте.
Стивен Харрис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.