web-dev-qa-db-fra.com

Désactiver l'onglet de la bibliothèque multimédia pour les non administrateurs dans l'écran de téléchargement

Je développe un plug-in dans lequel je dois autoriser les utilisateurs frontaux à télécharger des médias, ce que je suis capable de faire. Mais je ne veux pas les laisser se faufiler dans la médiathèque qui se présente sous forme d'onglet avec l'écran de téléchargement.

J'ai essayé le suivant

function remove_medialibrary_tab($tabs) {
    if ( !current_user_can( 'administrator' ) ) {
        unset($tabs['library']);
        return $tabs;
    }
    else
    {
        return $tabs;
    }
}
add_filter('media_upload_tabs','remove_medialibrary_tab');

Mais il semble que ce filtre soit obsolète et ne fonctionne plus.

4
codepixlabs

Cette fonction n'affichera pas l'onglet de la bibliothèque multimédia dans l'écran de téléchargement

   function remove_medialibrary_tab($strings) {
        if ( !current_user_can( 'administrator' ) ) {
            unset($strings["mediaLibraryTitle"]);
        return $strings;
        }
        else
        {
            return $strings;
        }
    }
    add_filter('media_view_strings','remove_medialibrary_tab');

J'ai découvert que le passage à l'onglet médiathèque appelle en fait cette action ajax query-attachments . J'ai donc ajouté une autre fonction de rappel à cette action avec la priorité la plus haute, qui vérifie si l'utilisateur n'est pas admin, l'action s'arrête là. Cela a fait le tour pour moi :)

function restrict_non_Admins(){

        if(!current_user_can('administrator')){
            exit;
        }
    }

add_action('wp_ajax_query-attachments','restrict_non_Admins',1);
add_action('wp_ajax_nopriv_query-attachments','restrict_non_Admins',1);
7
codepixlabs

La fonction media_upload_tabs() n'est pas obsolète. Il est appelé uniquement par the_media_upload_tabs() (dénomination parfaite, je le sais), qui n'est appelé qu'une seule fois par media_upload_header()...

Éditer - Il suffit de tester le filtre avec un plugin et tant qu'il fonctionne et qu'un var_dump( $tabs ) dans un rappel attaché crache les onglets, il ne fait rien. La raison semble en être que tout cela est maintenant généré par backbone et underscore templates avec JavaScript. Le fichier responsable de tous les modèles est ~/wp-includes/media-template.php. À partir d'une recherche dans ce domaine, il n'y a pas de filtre pour modifier la sortie. En gros, il s’agit d’une fonction massive PHP nommée wp_print_media_templates() qui englobe tous les modèles et qui comporte certaines actions avant et après différents modèles.

Je viens d'essayer de console.log() l'objet wp et de trouver wp.media.view dont semble pour ... quelque chose. ~/wp-includes/js/media-modals.js semble être la racine de toute l'interface utilisateur générée par JavaScript. Maintenant, quand je creuse plus profondément, je trouve wp.template qui obtient "underscore -extended" dans wp.media.template. Ensuite, j'ai trouvé la référence à ~/wp-includes/js/wp-util.js qui explique ensuite que l'argument de cette fonction JS est un #id préfixé par tmpl-.

Maintenant, il n’ya qu’un wrapper pour _.memoize() qui ajoute un rappel personnalisé "enregistre" les résultats calculés pour "accélérer les choses" ... un peu. Le contenu est juste un groupe de Regex-es qui sont ensuite poussés vers une fonction nommée compiled(), qui est (encore) un wrapper pour

_.template( $( '#tmpl-' + id ).html(), null, options )

.. D'accord. Il y a aussi des éléments de ~/wp-includes/js/media-views.js et ~/wp-includes/js/media-models.js impliqués et, comme je ne connais presque plus rien sur Backbone, je ne sais pas comment procéder à partir de là. Je laisserai mon plugin de débogage pour cette réponse ainsi que la réponse comme point de départ pour les autres ici.

<?php
defined( 'ABSPATH' ) or exit;
/**
 * Plugin Name: (#125669) Media Upload Tabs by role
 * Description: Removes media upload tabs on a by-role base.
 */

add_action( 'admin_footer', 'wpse125669MediaUploadTabsRemove', 0 );
function wpse125669MediaUploadTabsRemove()
{
    if ( "edit.php" !== get_current_screen()->parent_file )
        return;

    ?>
<script type="text/javascript">
console.log( wp.media );
</script>
    <?php
}
2
kaiser