防止插件的网络激活

时间:2012-12-14 作者:k3davis

我有一个插件,目前不支持网络激活。当然,解决这个问题的最好办法是:)我计划这么做。然而,我想知道是否有一个临时解决方案可以用来防止网络激活,可能是类似于以下工作流:

检测是否在网络范围内激活(如何激活)

  • 显示当前不支持的消息,我很抱歉,我会中断激活或停用,或者接受其他建议。谢谢

    澄清一下:多站点激活是可以的,但不是网络范围的激活。

  • 4 个回复
    最合适的回答,由SO网友:Maciej Krawczyk 整理而成

    这里的答案考虑过多,过于复杂。为什么要停用插件而不是阻止激活?只要在激活时调用die(此处为您的错误消息),就可以完成这项工作。

    function activate($networkwide) {
        if (is_multisite() && $networkwide) 
           die(\'This plugin can\\\'t be activated networkwide\');
    }
    
    register_activation_hook(\'your-plugin/index.php\',\'activate\');
    
    然后,当您尝试在面板中激活时,页面顶部会出现一个很好的错误,并显示错误消息。

    SO网友:fuxia

    插件标题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;
    }
    

    SO网友:brasofilo

    您只需将其从网络插件列表中隐藏即可。

    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() run only once?.

    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 a notice to users upon first login to the admin area

    SO网友:Stephen Harris

    (未经测试)

    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 选项和显示通知。

    Note: 最好不要硬编码“myplugin/myplugin”。php”-我想用plugin_basename(__FILE__); 会起作用(而且更可取)。

    Edit 如果多站点激活正常,那么您可以使用switch_to_blog() 分别在每个插件上激活。我仍然会显示一个通知,因为您没有按照用户的要求进行操作。

    结束

    相关推荐

    W3Total缓存插件是WordPress MultiSite的好选择吗?

    我听说很多人对W3 Total Cache 在WordPress多站点安装上。然后我在插件页面上看到:兼容:3.2.1最后更新日期:2011年8月26日看到我在WordPress MultiSite版本3.4.1上运行,而且自上次插件更新以来已经有一年多了,我真的很想知道这个插件对我来说是否是一个好的选择。或者我应该使用WP Super Cache 具有WP Minify 相反