在上传器屏幕中禁用非管理员的媒体库标签

时间:2013-12-07 作者:Prince Singh

我正在开发一个插件,要求我允许前端用户上传媒体,我可以做到这一点。但我不想让他们溜进媒体库,它是作为上传器屏幕的选项卡提供的。

我尝试了以下方法

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\');
但这个过滤器似乎已被弃用,不再适用。

2 个回复
SO网友:Prince Singh

This function will not show media library tab in upload screen

   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\');
我发现切换到“媒体库”选项卡实际上会调用此ajax操作query-attachments. 所以我在这个操作中添加了另一个具有最高优先级的回调函数,该函数检查用户是否为admin,操作将立即停止。这对我起到了作用:)

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

SO网友:kaiser

功能media_upload_tabs() 未弃用。它仅由调用the_media_upload_tabs() (我知道,这是一个完美的名字),也只有一次media_upload_header()...

Edit - 刚刚用插件测试了过滤器,当它工作时var_dump( $tabs ) 在一个附带的回调中弹出标签,它什么也不做。原因似乎是,现在所有这些都是由带有JavaScript的主干和下划线模板生成的。负责所有模板的文件是~/wp-includes/media-template.php. 从整个搜索过程中,没有任何过滤器可以更改输出。基本上,它只是一个名为wp_print_media_templates() 它包装了所有模板,并且在不同模板之前和之后都有一些操作。

我只是想console.log() 这个wp 对象并找到wp.media.view 这似乎是。。。某物~/wp-includes/js/media-modals.js 似乎是JavaScript生成的所有UI的根。现在当我深入挖掘时,我发现wp.template 得到“下划线”-extended“进入wp.media.template. 然后我找到了~/wp-includes/js/wp-util.js 这就解释了,JS函数的参数是#id 前缀为tmpl-.

现在这只是_.memoize() 它添加了一个自定义回调“保存”计算结果以“加快速度”。。。有一点。内容只是一组正则表达式,然后被推送到一个名为compiled(), 这又是一个包装

_.template( $( \'#tmpl-\' + id ).html(), null, options )
。。好啊还有来自~/wp-includes/js/media-views.js~/wp-includes/js/media-models.js 因为我对脊梁几乎一无所知,所以我不知道如何从那里开始。我将为这个答案留下我的调试插件,也将这个答案作为其他人的起点。

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

结束