Предотвращение активации сети плагином

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

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

Или, другие предложения приняты. Благодарю.

Для уточнения: активация Multisite прекрасна, просто не активируется в сети.

Solutions Collecting From Web of "Предотвращение активации сети плагином"

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

function activate($networkwide) { if (is_multisite() && $networkwide) die('This plugin can\'t be activated networkwide'); } register_activation_hook('your-plugin/index.php','activate'); 

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

Заголовок плагина 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; } 

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

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

И покажите одноразовое уведомление администратора сети. Адаптация Q & A 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; } } 

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

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

 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() , тогда вы можете использовать switch_to_blog() для активации каждого подключаемого модуля по отдельности. Я все равно покажу уведомление, так как вы не сделали то, что пользователь спросил.