我不确定你发布的代码到底是哪个问题,但是我不明白为什么在一个函数足够的情况下使用两个函数。。。
add_filter( \'wp_handle_upload_prefilter\', \'limit_uploads_for_user_roles\' );
function limit_uploads_for_user_roles( $file ) {
$user = wp_get_current_user();
// add the role you want to limit in the array
$limit_roles = array(\'contributor\');
$filtered = apply_filters( \'limit_uploads_for_roles\', $limit_roles, $user );
if ( array_intersect( $limit_roles, $user->roles ) ) {
$upload_count = get_user_meta( $user->ID, \'upload_count\', true ) ? : 0;
$limit = apply_filters( \'limit_uploads_for_user_roles_limit\', 10, $user, $upload_count, $file );
if ( ( $upload_count + 1 ) > $limit ) {
$file[\'error\'] = __(\'Upload limit has been reached for this account!\', \'yourtxtdomain\');
} else {
update_user_meta( $user->ID, \'upload_count\', $upload_count + 1 );
}
}
return $file;
}
请注意,计数从添加函数和过滤器时开始:不计算以前上载的所有文件。
要限制的角色也可以通过过滤器进行更改。
该限制可以通过过滤器更改(在我的代码中默认为10),我还可以通过过滤器过滤用户对象和当前用户上载的数量,这样过滤器可以考虑更多信息。。。
编辑以减少参与者删除附件挂钩时的计数delete_attachment
然后做一些逻辑:
add_action(\'delete_attachment\', \'decrease_limit_uploads_for_user\');
function decrease_limit_uploads_for_user( $id ) {
$user = wp_get_current_user();
// add the role you want to limit in the array
$limit_roles = array(\'contributor\');
$filtered = apply_filters( \'limit_uploads_for_roles\', $limit_roles, $user );
if ( array_intersect( $limit_roles, $user->roles ) ) {
$post = get_post( $id);
if ( $post->post_author != $user->ID ) return;
$count = get_user_meta( $user->ID, \'upload_count\', true ) ? : 0;
if ( $count ) update_user_meta( $user->ID, \'upload_count\', $count - 1 );
}
}
请注意,前面的代码不阻止其他用户上载被删除的附件,因为这应该由允许贡献者上载文件的函数/插件/代码来处理(默认情况下,贡献者不能这样做一次),并且因为
\'delete_attachment\'
挂钩发生在附件已删除之后。但是,如果当前用户未上载附件,则不会执行减少,只是可以肯定。。。