我正在构建一个插件,用户只能看到分配给他的用户角色可以访问的类别中的媒体文件。
我已经能够在媒体列表视图模式下过滤掉结果,当它首次加载时,通过将函数挂接到pre_get_posts
操作,但不知道如何对网格视图模式执行相同的操作。
这是正在发生的事情:
User-A
被分配给有权访问类别Cat-A
和Cat-B
的Role-A
。
当用户 A 登录到管理员并导航到媒体列表视图页面时,会出现正确的媒体文件,即仅来自 Cat-A 和 Cat-B。但是在媒体网格视图模式下,所有媒体文件都出现了,而我只希望显示来自上述两个类别的媒体。
我在网上搜索并查看了Stack Overflow中的一些帖子,但没有找到我正在寻找的内容。
编辑
经过更多搜索,我发现:
参考: https://codex.wordpress.org/Plugin_API/Filter_Reference/ajax_query_attachments_args
add_filter( 'ajax_query_attachments_args', array( $this, 'load_media_library_by_category_access' ), 10, 1 );
function load_media_library_by_category_access( $query = array() ) {
$user_id = get_current_user_id();
if( $user_id ) {
$query['author'] = $user_id;
}
return $query;
}
由于上述是可能的,是否也可以找到附加到每个媒体项的类别,然后创建一个由与给定类别关联的媒体项组成的过滤数组?
像这样:
function load_media_library_by_category_access( $query = array() ) {
// Get an array of category ids, which I already have
$cat_array = get_category_array_by_role();
// Modify $query to filter media items by given categories (array may be?)
return $query;
}
这可能吗?
根据这篇文章,网格视图是不可能的。 您只能操作列表视图的媒体结果。
我终于让它工作了。我是这样做的:
function load_media_library_by_category_access( $query = array() ) {
$cats = $this->get_accessible_categories();
$tax_query = array(
array(
'taxonomy' => 'category',
'field' => 'id',
'terms' => $cats,
),
);
if( !current_user_can( 'update_core' ) ) {
$query['tax_query'] = $tax_query;
}
return $query;
}
add_filter('ajax_query_attachments_args', array($this, 'load_media_library_by_category_access'), 10, 1);
现在,我的媒体网格视图根据当前用户角色有权访问的类别筛选出正确的媒体项。
由于administrator
不需要限制,因此我在实际将$tax_query
过滤器注入原始查询之前进行了以下检查。
if( !current_user_can( 'update_core' ) ) {
$query['tax_query'] = $tax_query;
}
认为这可能对其他人有帮助。
add_filter( 'ajax_query_attachments_args', 'show_current_user_attachments', 10, 1 );
function show_current_user_attachments( $query = array() ) {
//echo "<pre>";
//print_r($query);
$user_id = get_current_user_id();
if( $user_id ) {
//$query['author'] = $user_id;
}
$query['post_mime_type'] = 'image';
return $query;
}