阻止插件的网络激活


9

我有一个目前不支持网络激活的插件。当然,最好的解决方法是修复它:),我打算这样做。但是,我想知道是否有一个临时解决方案可以同时防止网络激活,可能是类似于以下的工作流程:

  1. 检测激活是否在整个网络范围内(如何?)
  2. 显示当前不支持的消息,很抱歉,很抱歉
  3. 中断激活或停用

或者,接受其他建议。谢谢。

需要说明的是:多站点激活很好,但不是整个网络范围的激活。

Answers:


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 2012年

1
这是我最终使用的解决方案-我只是将此功能调整为“死”以发送消息,而不是重定向到停用的URL。它不是最干净的,但是它可以满足所有要求,并且比其他解决方案的开销要小,这是我的一个临时补丁。
k3davis 2012年

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 2012年

是的,您仅在主站点上激活了插件。
Stephen Harris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.