Answers:
这里的答案是经过深思熟虑的,太复杂了。为什么要停用插件而不是阻止激活?只需在激活时调用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_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()
分别激活每个插件。我仍会显示一条通知,因为您尚未完成用户的要求。
wp_die
并跳过重定向,但这似乎比不作任何说明而停用它的粘性要小。:)