如何使用必须使用的插件来隐藏常规插件以及隐藏自身?

时间:2012-05-31 作者:brasofilo

解决此问题时(Change admin language based on user (in single-site) ), 我做了一个功能,使插件可以对除一个(我:)以外的所有用户自动隐藏。

缺陷在于,它仅在激活时自动隐藏。

起初,它是一个mu插件,但我必须手动启用/禁用它。它真的不需要一直运行,因为它可能会减慢站点速度(?)甚至包含对网站语言的敏感操纵(另一个问号)。

但主要的动机是,我不希望客户端激活/停用/删除这个插件(供我自己使用),也不希望它弄乱她自己的插件列表。

因此,决定将功能分为两个插件:

必须使用一个来隐藏常规的一个how to hide one plugin from the Must-Use listing?

2 个回复
最合适的回答,由SO网友:brasofilo 整理而成

显然,没有办法从必须使用列表中删除一个插件。。。

但后来,发现了一个性能更好的过滤器:
show_advanced_plugins 将完全隐藏必须使用的插件。

毕竟,如果你想隐藏这种性质的东西,那么就把它全部隐藏起来。。。

在教室里WP_Plugins_List_Table 并接受两个参数:布尔值和插件类型(mustusedropins).

检查this article 供MU和specially 访问。但是,为了wiki的缘故,我将在这个答案的末尾发布DI表。

<小时>Update:
-mu-plugin 更新为多个用户和多个隐藏插件,现在是字符串,它是数组

为了测试这个过程,我们需要一个插件。创建名为db.phproot 并复制以下内容:

<?php
/*
    Plugin Name: Just for testing Drop-ins
    Version: 0.1
    Author: WPSE-53866
    Author URI: http://wordpress.stackexchange.com/
*/
必须使用插件mu-plugins 文件夹,并设置类的参数。

<?php
/*
Plugin Name: Hide Must-Use and Drop-ins from the Plugins listing
Plugin URI: http://wordpress.stackexchange.com/questions/53866
Description: Used to hide the Must-Use and Drop-ins plugins from all users except one. Also can hide a selected plugin from the regular list, be it active or not.
Version: 1.1
Author: brasofilo
AuthorURI: http://wordpress.stackexchange.com/users/12615/
*/

/**
 * Parameters of the class - sorry for the non-standard documentation
 *
 * @super_admin     : array   (required)    : the users which are able to see everything
 * @can_see_mustuse : boolean (required)    : can other users see the Must-Use list?
 * @can_see_dropins : boolean (required)    : can other users see the Drop-ins list?
 * @hide_this_one   : array   (optional)    : plugins to hide in the regular listing
 *
 * Reference article for Must-Use and Drop-ins
 * http://hakre.wordpress.com/2010/05/01/must-use-and-drop-ins-plugins/
 */

add_action(\'admin_init\', \'wpse_53866_fire_plugin\');

function wpse_53866_fire_plugin() 
{
    global $pagenow;
    if( \'plugins.php\' != $pagenow) 
        return;

    $wpse53866_HideAdvancedPlugins_instance = new Wpse53866_HideAdvancedPlugins(
        array(
            \'super_admin\'       => array(\'Rodolfo\',\'roda\'),
            \'can_see_mustuse\'   => false,
            \'can_see_dropins\'   => true,
            \'hide_this_ones\'    => array( \'set-user-locale.php\', \'akismet/akismet.php\' )
        )
    );
}

class Wpse53866_HideAdvancedPlugins
{
    public function __construct($data)
    {       
        $this->user     = $data[\'super_admin\'];
        $this->mustuse  = $data[\'can_see_mustuse\'];
        $this->dropins  = $data[\'can_see_dropins\'];
        $this->hide     = isset( $data[\'hide_this_ones\'] ) ? $data[\'hide_this_ones\'] : false;

        if($this->hide)
            add_filter( \'all_plugins\', array(&$this, \'on_list_plugins\' ) );

        add_filter( \'show_advanced_plugins\', array(&$this, \'on_list_advanced\' ), 10, 2 );
    }

    public function on_list_plugins($plugins)
    {
            global $current_user;

            if( ! in_array( $current_user->user_login, $this->user ) )
            {
                foreach( $this->hide as $plug )
                    unset( $plugins[$plug] );               
            }

           return $plugins;
    }

    public function on_list_advanced($show, $type)
    {
            global $current_user;

            if( ! in_array( $current_user->user_login, $this->user ) ) 
            {
                if( \'mustuse\' == $type ) 
                    return $this->mustuse;

                if( \'dropins\' == $type ) 
                    return $this->dropins;
            }

           return true;
    }
}
参考hakre on wordpress

list of drop-ins plugins

SO网友:brasofilo

另一个用途:在Multisite 环境,假设我们有一个特定于站点的插件。不是必须使用的插件,而是一个常规插件,仅为一个站点定制。

它还活着example.com/wp-content/plugins/my-plugin/my-plugin.php.

我们将制作一个必须使用的插件,/mu-plugins/hide-plugins.php 例如:

<?php
/**
 * Plugin Name: One site only
 * Description: Hide site specific plugin from other sites
 **/

add_action(\'plugins_loaded\', function () 
{
    # Set filter to all sites, except ID 15
    $blog_id = get_current_blog_id();
    if( $blog_id == 15 )
        return;

    # Alternative for subdomain installs
    // if( \'example.com\' !== $_SERVER[\'SERVER_NAME\'] )

    add_filter( \'all_plugins\', function( $plugins )
    {
        unset( $plugins[\'my-plugin/my-plugin.php\'] ); 
        return $plugins;
    });
});

结束

相关推荐

Communicate between plugins

我已经创建了两个WordPress插件。如果两个插件都安装了,那么这两个插件之间就可以进行一些有益的合作。那么我的问题是:让他们合作的最佳方式是什么?如何检测某个插件是否已启用?如何传输信息?我想我可以用globals,但有更好的方法吗?