it-swarm.com.de

Deaktivieren Sie die Registerkarte Medienbibliothek für Nicht-Administratoren im Uploader-Bildschirm

Ich entwickle ein Plugin, mit dem ich Front-End-Benutzern das Hochladen von Medien ermöglichen muss, was ich tun kann. Aber ich möchte nicht, dass sie sich in die Medienbibliothek einschleichen, die als Registerkarte mit Uploader-Bildschirm geliefert wird.

Ich habe folgendes versucht

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');

Aber anscheinend ist dieser Filter veraltet und funktioniert nicht mehr.

4
codepixlabs

Diese Funktion zeigt die Registerkarte Medienbibliothek im Upload-Bildschirm nicht an

   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');

Ich fand heraus, dass das Wechseln zur Registerkarte "Medienbibliothek" tatsächlich diese Ajax-Aktion Anhänge abfragen aufruft. Daher habe ich dieser Aktion eine weitere Rückruffunktion mit höchster Priorität hinzugefügt, die überprüft, ob der Benutzer kein Administrator ist. Die Aktion wird genau dort angehalten. Das hat den Trick für mich getan :)

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

Die Funktion media_upload_tabs() ist nicht veraltet. Es wird nur von the_media_upload_tabs() (perfekte Benennung, ich weiß) aufgerufen, die auch nur einmal von media_upload_header() aufgerufen wird ...

Bearbeiten - Gerade den Filter mit einem Plugin getestet und während es funktioniert und eine var_dump( $tabs ) in einem angehängten Callback die Tabs ausspuckt, macht es nichts. Der Grund scheint zu sein, dass all dies jetzt von Backbone und Underscore Templates mit JavaScript generiert wird. Die für alle Vorlagen verantwortliche Datei ist ~/wp-includes/media-template.php. Nach einer Suche gibt es keinen Filter, um die Ausgabe zu ändern. Grundsätzlich ist es nur eine massive PHP -Funktion mit dem Namen wp_print_media_templates(), die alle Vorlagen umschließt und einige Aktionen vor und nach verschiedenen Vorlagen ausführt.

Ich habe gerade versucht, console.log() das Objekt wp zu __en und habe wp.media.view gefunden, der scheint ... etwas zu halten. ~/wp-includes/js/media-modals.js scheint die Wurzel aller von JavaScript generierten Benutzeroberflächen zu sein. Wenn ich jetzt tiefer grabe, finde ich wp.template, der "Unterstrich -extended" in wp.media.template bekommt. Dann habe ich den Verweis auf ~/wp-includes/js/wp-util.js gefunden, der dann erklärt, dass das Argument für diese JS-Funktion ein #id ist, dem tmpl- vorangestellt ist.

Das ist jetzt nur ein Wrapper für _.memoize(), der einen benutzerdefinierten Rückruf hinzufügt, der berechnete Ergebnisse "speichert", um Dinge zu "beschleunigen" ... ein bisschen. Der Inhalt ist nur ein Bündel von Regexen, die dann an eine Funktion mit dem Namen compiled() weitergeleitet werden, für die (wieder) nur ein Wrapper ist

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

.. OK. Es gibt auch Sachen von ~/wp-includes/js/media-views.js und ~/wp-includes/js/media-models.js, und da ich so gut wie nichts mehr über Backbone weiß, habe ich keine Ahnung, wie ich weiter vorgehen soll. Ich werde mein Debugging-Plugin für diese Antwort sowie die Antwort als Ausgangspunkt für andere hier belassen.

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