为特定用户角色的用户设置最大上载计数

时间:2013-10-24 作者:Christine Cooper

对于具有Contributor user role, 我想限制他们可以上传的图片总量。我在一个answer here:

add_filter( \'wp_handle_upload\', \'wpse47580_update_upload_stats\' );
function wpse47580_update_upload_stats( $args ) {

    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, \'upload_count\', $single = true );

    update_user_meta( $user_id, \'upload_count\', $upload_count + 1 );
}

add_filter( \'wp_handle_upload_prefilter\', \'wpse47580_check_upload_limits\' );
function wpse47580_check_upload_limits( $file ) {
    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, \'upload_count\', $single = true );

    $upload_count_limit_reached = apply_filters( \'wpse47580_upload_count_limit_reached\', 10 ) > ( $upload_count + 1 );

    if ( $upload_count_limit_reached  )
        $file[\'error\'] = \'Upload limit has been reached for this account!\';

    return $file;
}
有两个问题。首先,上述代码功能不正常,应该允许10次上载,但无论如何都会显示上载限制消息。其次,它适用于所有用户角色。

经过进一步研究,我发现this working answer, 但该解决方案适用于每个帖子的总上传量,而不是用户。

如何为特定用户角色的用户设置上载计数限制?理想的解决方案是,如果用户永久删除上载的图像,则可以减少计数。

3 个回复
最合适的回答,由SO网友:gmazzap 整理而成

我不确定你发布的代码到底是哪个问题,但是我不明白为什么在一个函数足够的情况下使用两个函数。。。

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\' 挂钩发生在附件已删除之后。但是,如果当前用户未上载附件,则不会执行减少,只是可以肯定。。。

SO网友:David

与其在数据库中为每个用户管理一个额外的元字段,您只需简单地计算动态上载的数量,如下所示:

add_filter( \'wp_handle_upload_prefilter\', \'limit_user_uploads\' );

function limit_user_uploads( $file ) {
    global $wpdb;
    $user = wp_get_current_user();
    $roles = array( \'contributor\' ); // Roles to limit
    if ( array_intersect( $roles, $user->roles ) ) { // User has a restricted role
        // Count user\'s uploads
        $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = \'attachment\' AND post_author = " . $user->ID );
        if ( 10 <= $count ) {
            $file[\'error\'] = \'Upload limit has been reached for this account!\';
        }
    }
    return $file;
}
对于非常大的数据库,这可能不太实用,但在许多情况下,它会做得很好。它适用于现有数据库,并始终确保计数正确。它仅统计用户匹配受限角色时的上载,因此不会影响非受限用户。

SO网友:Maruti Mohanty

我已经调整了后面的答案以检查用户角色,我还没有测试它,但这应该可以工作

过滤器wp_handle_upload_prefilter 在文件移动到最终位置之前,您可以检查或更改文件名。因此,这里我们将检查角色和上载计数。

add_filter( \'wp_handle_upload_prefilter\', \'wp_check_upload_limits\' );
function wp_check_upload_limits( $file ) {
    $current_user = wp_get_current_user();
    $current_user_role = $current_user->roles[0];

    if ( $current_user_role != "contributor" )
        return false;

    $upload_count = get_user_meta( $current_user->ID, \'upload_count\', true );
    $upload_count_limit_reached = apply_filters( \'wpse47580_upload_count_limit_reached\', 100 ) > ( $upload_count + 1 );

    if ( $upload_count_limit_reached )
        $file[\'error\'] = \'Upload limit has been reached for this user!\';

    return $file;
}

结束

相关推荐

users and usermeta table

每个用户在usermeta表中也必须有条目,还是可选的?最近,我遇到了一个wordpress数据库,它在用户表中有数千个用户,但只有少数用户在usermeta表中有条目。我想知道在什么情况下会发生这种情况,因为这些条目看起来不像是手动从数据库中删除的。