add_cap('upload_files')
上传照片,但是在他们的个人资料页面中,媒体库显示了所有已上传的图像。我该如何过滤以便他们只能查看上传的图像?这是我目前的解决方案……我正在做一个简单的WP查询,然后在用户的“个人资料”页面上循环
$querystr = " SELECT wposts.post_date,wposts.post_content,wposts.post_title, guid
FROM $wpdb->posts wposts
WHERE wposts.post_author = $author
AND wposts.post_type = 'attachment'
ORDER BY wposts.post_date DESC";
$pageposts = $wpdb->get_results($querystr, OBJECT);
#1 楼
您始终可以使用pre_get_posts
过滤器过滤媒体列表,该过滤器首先确定页面和用户的能力,并在满足某些条件时设置author参数。.示例
add_action('pre_get_posts','users_own_attachments');
function users_own_attachments( $wp_query_obj ) {
global $current_user, $pagenow;
$is_attachment_request = ($wp_query_obj->get('post_type')=='attachment');
if( !$is_attachment_request )
return;
if( !is_a( $current_user, 'WP_User') )
return;
if( !in_array( $pagenow, array( 'upload.php', 'admin-ajax.php' ) ) )
return;
if( !current_user_can('delete_pages') )
$wp_query_obj->set('author', $current_user->ID );
return;
}
我以删除页面上限为条件,因此管理员和编辑人员仍然可以看到完整的媒体清单。
有一个小的副作用,我可以看不到任何钩子,这与媒体列表上方显示的附件计数(仍将显示媒体项目的总数,而不是给定用户的总数-我认为这是一个小问题)。
如果我也将其全部发布,可能会很有用..;)
评论
我已允许将文件上传到订户级别的用户。尝试使用您的代码,但不起作用。
–西西尔
2012年5月6日17:52
“不工作”没什么可继续的。
– t31os
13年8月8日在22:03
我可以确认相同的观察结果。对我来说,“不工作”意味着“贡献者”角色在上载jpg时仍可以看到所有媒体项目。但是,当他从菜单转到媒体库时,它是空的。 (我的“贡献者”角色已经具有上传文件的额外功能,并且可以正常工作。)
–火花
2014年2月3日,19:27
因此,只需填充上载窗口的“媒体库”标签中的所有页面即可调整您的代码。我正在研究这个。
–火花
2014年2月3日,19:30
如果我没记错(并且确实发生了错误),那么在编写此答案时就没有适当的挂钩,这与没有挂钩来固定媒体计数的方式类似。自撰写本文以来,已有3个新的WordPress好版本,因此现在可能有解决方案。
– t31os
14年2月3日,19:33
#2 楼
从WP 3.7开始,通过文档中提供的ajax_query_attachments_args
过滤器有一种更好的方法:add_filter( 'ajax_query_attachments_args', 'show_current_user_attachments' );
function show_current_user_attachments( $query ) {
$user_id = get_current_user_id();
if ( $user_id ) {
$query['author'] = $user_id;
}
return $query;
}
#3 楼
这是针对帖子和媒体的完整解决方案(此代码专门针对作者,但您可以针对任何用户角色进行更改)。这也可以解决帖子/媒体计数,而不会破坏核心文件。// Show only posts and media related to logged in author
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
global $current_user;
if( is_admin() && !current_user_can('edit_others_posts') ) {
$wp_query->set( 'author', $current_user->ID );
add_filter('views_edit-post', 'fix_post_counts');
add_filter('views_upload', 'fix_media_counts');
}
}
// Fix post counts
function fix_post_counts($views) {
global $current_user, $wp_query;
unset($views['mine']);
$types = array(
array( 'status' => NULL ),
array( 'status' => 'publish' ),
array( 'status' => 'draft' ),
array( 'status' => 'pending' ),
array( 'status' => 'trash' )
);
foreach( $types as $type ) {
$query = array(
'author' => $current_user->ID,
'post_type' => 'post',
'post_status' => $type['status']
);
$result = new WP_Query($query);
if( $type['status'] == NULL ):
$class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
$views['all'] = sprintf(
'<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
admin_url('edit.php?post_type=post'),
$class,
$result->found_posts,
__('All')
);
elseif( $type['status'] == 'publish' ):
$class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
$views['publish'] = sprintf(
'<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
admin_url('edit.php?post_type=post'),
$class,
$result->found_posts,
__('Publish')
);
elseif( $type['status'] == 'draft' ):
$class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
$views['draft'] = sprintf(
'<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
admin_url('edit.php?post_type=post'),
$class,
$result->found_posts,
__('Draft')
);
elseif( $type['status'] == 'pending' ):
$class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
$views['pending'] = sprintf(
'<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
admin_url('edit.php?post_type=post'),
$class,
$result->found_posts,
__('Pending')
);
elseif( $type['status'] == 'trash' ):
$class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
$views['trash'] = sprintf(
'<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
admin_url('edit.php?post_type=post'),
$class,
$result->found_posts,
__('Trash')
);
endif;
}
return $views;
}
// Fix media counts
function fix_media_counts($views) {
global $wpdb, $current_user, $post_mime_types, $avail_post_mime_types;
$views = array();
$count = $wpdb->get_results( "
SELECT post_mime_type, COUNT( * ) AS num_posts
FROM $wpdb->posts
WHERE post_type = 'attachment'
AND post_author = $current_user->ID
AND post_status != 'trash'
GROUP BY post_mime_type
", ARRAY_A );
foreach( $count as $row )
$_num_posts[$row['post_mime_type']] = $row['num_posts'];
$_total_posts = array_sum($_num_posts);
$detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );
if ( !isset( $total_orphans ) )
$total_orphans = $wpdb->get_var("
SELECT COUNT( * )
FROM $wpdb->posts
WHERE post_type = 'attachment'
AND post_author = $current_user->ID
AND post_status != 'trash'
AND post_parent < 1
");
$matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
foreach ( $matches as $type => $reals )
foreach ( $reals as $real )
$num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];
$class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';
$views['all'] = "<a href='upload.php'$class>" . sprintf( __('All <span class="count">(%s)</span>', 'uploaded files' ), number_format_i18n( $_total_posts )) . '</a>';
foreach ( $post_mime_types as $mime_type => $label ) {
$class = '';
if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
continue;
if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
$class = ' class="current"';
if ( !empty( $num_posts[$mime_type] ) )
$views[$mime_type] = "<a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), $num_posts[$mime_type] ) . '</a>';
}
$views['detached'] = '<a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( __( 'Unattached <span class="count">(%s)</span>', 'detached files' ), $total_orphans ) . '</a>';
return $views;
}
评论
很棒的代码段,但如果媒体库中没有任何项目,则会吐出错误,警告:array_sum()期望参数1为数组,给定null,警告:array_keys()期望参数1为数组,给定null
–chrismccoy
2012-2-25在0:40
您只需要在fix_media_counts()函数中将$ _num_posts定义为一个数组。 $ _num_posts = array();
– Paul
2012年9月8日23:37
此答案中的代码有效,但它也会删除“高级自定义字段”插件创建的所有自定义字段。
–火花
2014年2月3日20:26
密切相关:wordpress.stackexchange.com/questions/178236/…
– Cregox
2015年10月9日,11:58
#4 楼
这是已接受答案的修改版本。由于接受的答案仅针对左侧的“媒体”菜单项,因此当将照片上传到帖子时,用户仍可以在模式框中看到整个媒体库。稍加修改的代码可以解决这种情况。目标用户只能从帖子中弹出的模式框的“媒体库”选项卡中看到他们自己的媒体项目。 ...add_action('pre_get_posts','users_own_attachments');
function users_own_attachments( $wp_query_obj ) {
global $current_user, $pagenow;
if( !is_a( $current_user, 'WP_User') )
return;
if( 'upload.php' != $pagenow ) // <-- let's work on this line
return;
if( !current_user_can('delete_pages') )
$wp_query_obj->set('author', $current_user->id );
return;
}
要让用户仅从上载模式的“媒体”菜单和“媒体库”选项卡中查看自己的媒体,请用此行替换指示的行...
if( ( 'upload.php' != $pagenow ) &&
( ( 'admin-ajax.php' != $pagenow ) || ( $_REQUEST['action'] != 'query-attachments' ) ) )
(为便于阅读,仅插入了换行符和空格)
以下内容与上述相同,但也限制了他们查看“帖子”菜单项中的帖子。
if( ( 'edit.php' != $pagenow ) &&
( 'upload.php' != $pagenow ) &&
( ( 'admin-ajax.php' != $pagenow ) || ( $_REQUEST['action'] != 'query-attachments' ) ) )
(为便于阅读,仅在此处插入了换行符和空格)
注意:接受答案后,帖子和媒体计数器将是错误的。但是,此页面上的其他一些答案中也提供解决方案。我之所以没有合并这些仅仅是因为我没有测试它们。
#5 楼
完整的工作代码。唯一的问题是,“添加帖子”页面上的媒体库中的图像计数有误。function my_files_only( $wp_query ) {
if ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/upload.php' ) !== false ) {
if ( !current_user_can( 'level_5' ) ) {
global $current_user;
$wp_query->set( 'author', $current_user->id );
}
}
else if ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/media-upload.php' ) !== false ) {
if ( !current_user_can( 'level_5' ) ) {
global $current_user;
$wp_query->set( 'author', $current_user->id );
}
}
}
add_filter('parse_query', 'my_files_only' );
评论
您不应该使用用户级别,它们在WordPress中仍然主要是为了向后兼容(WP 2.0之前的版本),它们对于确定现代WordPress中的用户功能并不可靠(因为不再需要该兼容性时它们可能会从核心中消失)。使用实际功能来确定用户权限。
– t31os
2014年1月28日13:56
尽管包含media-upload.php,您的代码仍无法通过“后编辑”页面生成的上传模式进行操作。仍然可以看到所有库项目。
–火花
2014年2月3日,19:58
#6 楼
t31os在那里有很好的解决方案。唯一的事情是所有帖子的数量仍然显示出来。我想出了一种方法来防止使用jQuery来显示数量。
只需将其添加到您的功能文件中即可。
function jquery_remove_counts()
{
?>
<script type="text/javascript">
jQuery(function(){
jQuery("ul.subsubsub").find("span.count").remove();
});
</script>
<?php
}
add_action('admin_head', 'jquery_remove_counts');
对我有用!
#7 楼
我用一个很粗糙但可行的解决方案解决了我的问题。1)我安装了WP Hide Dashboard插件,因此用户只会看到指向其个人资料编辑表单的链接。
2)在author.php模板文件中,我插入了上面使用的代码。
3)然后,对于已登录的用户,我显示了一个指向“ wp-admin”上传页面的直接链接。 /media-new.php“
4)我注意到的下一个问题是,他们上传照片后,会将其重定向到upload.php ...,他们可以看到所有其他图片。我还没有找到media-new.php页面的钩子,所以我最终侵入了核心“ media-upload.php”并将其重定向到他们的个人资料页面:
global $current_user;
get_currentuserinfo();
$userredirect = get_bloginfo('home') . "/author/" .$current_user->user_nicename;
然后将
wp_redirect( admin_url($location) );
替换为wp_redirect($userredirect);
有两个问题。首先,如果登录的用户知道存在,则仍可以转到“ upload.php”。除了查看文件外,他们什么也做不了,而且99%的人甚至都不知道,但是仍然不是最佳选择。其次,上传后还将管理员重定向到个人资料页面。通过检查用户角色,并且仅重定向订户,可以很简单地解决这些问题。
如果有人对挂入“媒体”页面而不进入核心文件有任何想法,我将不胜感激。谢谢!
评论
每个管理请求上都有一个admin_init挂钩。万一用户请求upload.php而您想防止您阻止该请求(例如wp_die('Access Denied'))或通过每个挂钩重定向到某个有效位置。
– hakre
2010年9月11日下午0:49
#8 楼
<?php
/*
Plugin Name: Manage Your Media Only
Version: 0.1
*/
//Manage Your Media Only
function mymo_parse_query_useronly( $wp_query ) {
if ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/upload.php' ) !== false ) {
if ( !current_user_can( 'level_5' ) ) {
global $current_user;
$wp_query->set( 'author', $current_user->id );
}
}
}
add_filter('parse_query', 'mymo_parse_query_useronly' );
?>
将上面的代码另存为manage_your_media_only.php,将其压缩,将其作为插件上传到您的WP中并激活它。
评论
如果找到自己问题的答案,则最好在下面将其添加为答案,而不是在问题本身中。与系统配合使用会更好,我们可以投票给您答案,这将改善您在该网站上的声誉。wordpress.org/plugins/view-own-posts-media-only
我真的必须第二个“仅查看自己的帖子媒体”插件,在到处寻找jquery或php / html / css解决方案后,它对我来说效果很好。