Como usar um plugin Must-Use para esconder um plugin regular e se esconder?

2

Ao resolver esse problema ( Alterar a linguagem administrativa com base no usuário (em um único site) ), eu fiz uma função para que o plug-in se ocultasse automaticamente de todos os usuários, exceto um (me :).

A falha é que ele só oculta automaticamente quando ativo .

No começo, era um plugin mu, mas eu tinha que habilitar / desabilitar manualmente. Ele realmente não precisa ser executado o tempo todo, pois pode atrasar o site (?) Ou até mesmo conter alguma manipulação sensível do idioma do site (outro ponto de interrogação).

Mas, principalmente, a motivação é que não quero que o cliente ative / desative / exclua este plug-in (é para meu próprio uso) e não o quero desordenando sua própria lista de plug-ins.

Então, decidimos dividir as funções em dois plugins:

  • Um é um Uso obrigatório usado para ocultar o normal.
  • O outro será ativado / desativado quando necessário e é aquele do problema relacionado acima.

Mas agora me deparo com outra pergunta: como ocultar um plug-in da lista "Uso obrigatório" ?

    
por brasofilo 31.05.2012 / 19:53

2 respostas

4

Aparentemente, não há como remover o um plugin da lista de uso obrigatório ...

Mas, então, encontramos um filtro que melhora ainda mais:
show_advanced_plugins ocultará completamente a visão dos plugins Must-Use.

Afinal, se você está tentando esconder algo dessa natureza, então esconda tudo ...

Ele está dentro da classe WP_Plugins_List_Table e recebe dois argumentos: um booleano e o tipo de plug-in ( mustuse e dropins ).

Verifique este artigo para obter uma referência de MU e especialmente drop-ins. Mas, por causa do wiki, vou postar a tabela DI no final desta resposta.

Atualização:
 - mu-plugin atualizado para vários usuários e vários esconder plugins foram string agora é array

O plug-in de entrada

Para testar este procedimento, precisamos de um deles. Crie um arquivo chamado db.php na raiz da sua pasta wp-content e copie:

<?php
/*
    Plugin Name: Just for testing Drop-ins
    Version: 0.1
    Author: WPSE-53866
    Author URI: http://wordpress.stackexchange.com/
*/

O plugin obrigatório

Em seguida, este dentro da pasta mu-plugins e defina os parâmetros da classe.

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

Referência

por hakre no wordpress

    
por brasofilo 31.05.2012 / 19:53
1

Outro uso: em um ambiente Multisite , suponha que tenhamos um plug-in específico do site . Não é preciso usar, mas um plugin regular, feito sob medida para apenas um site.

Ele vive em example.com/wp-content/plugins/my-plugin/my-plugin.php .

Faremos um plug-in obrigatório, /mu-plugins/hide-plugins.php como:

<?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;
    });
});
    
por brasofilo 30.09.2013 / 15:01