web-dev-qa-db-fra.com

Définir un nombre maximal de téléchargements pour les utilisateurs d'un rôle d'utilisateur spécifique

Pour les utilisateurs dotés de la variable Contributoruser , je souhaite limiter le nombre total d'images qu'ils sont autorisés à télécharger. J'ai trouvé ce code posté sur un répondre ici :

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

Il y a deux problèmes. Premièrement, le code ci-dessus ne fonctionne pas correctement, il est censé autoriser 10 téléchargements mais le message de limite de téléchargement est affiché quoi qu'il en soit. Deuxièmement, cela s'applique aux rôles all user.

Après d’autres recherches, j’ai trouvé cette réponse satisfaisante , mais la solution s’applique au nombre total de téléchargements par publication, et non par utilisateur.

Comment définir une limite de nombre de téléchargements pour les utilisateurs associés à un rôle d'utilisateur spécifique? Idéalement, avec une solution qui déduit le nombre si l’utilisateur supprime définitivement une image téléchargée.

4
Christine Cooper

Je ne sais pas vraiment quel est le problème real avec le code que vous avez posté, mais je ne comprends pas pourquoi utiliser 2 fonctions quand une seule suffit ...

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

Notez que le décompte commence lorsque vous ajoutez la fonction et le filtre: tous les fichiers précédemment téléchargés ne sont pas comptés.

Les rôles à limiter peuvent également être modifiés via un filtre.

La limite peut être changée via un filtre (10 par défaut dans mon code) et je passe également au filtrage de l'objet utilisateur et du nombre actuel de téléchargements d'utilisateurs, de cette manière le filtre peut prendre en compte plus d'informations ...

Modifier

Pour diminuer le nombre lorsqu'un contributeur supprime une pièce jointe, crochetez delete_attachment et faites un peu de logique:

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

Notez que le code précédent n'empêchait pas la suppression de la pièce jointe, car elle devrait être gérée par les fonctions/plugin/code qui autorisent les contributeurs à télécharger des fichiers (une fois par défaut, ils ne peuvent pas le faire) et parce que le hook 'delete_attachment' se passe après la pièce jointe a déjà été supprimée. Cependant, si la pièce jointe n'a pas été téléchargée par l'utilisateur actuel, la diminution n'est pas effectuée, c'est sûr ...

5
gmazzap

Au lieu de gérer un méta-champ supplémentaire dans la base de données par utilisateur, vous pouvez simplement garder les choses simples et compter le nombre de téléchargements à la volée, comme suit:

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

Cela pourrait être moins pratique pour les très grandes bases de données, mais dans de nombreux cas, cela suffira. Il fonctionne immédiatement avec les bases de données existantes et garantit toujours que le nombre est correct. Il ne compte les téléchargements que si l'utilisateur correspond à un rôle restreint, de sorte qu'il n'affecte pas les utilisateurs non restreints.

1
David

J'ai ajusté la dernière réponse pour vérifier le rôle d'utilisateur, je ne l'ai pas testée mais cela devrait fonctionner

Le filtre wp_handle_upload_prefilter vous offre l’occasion d’examiner ou de modifier le nom de fichier avant que le fichier ne soit déplacé vers son emplacement final. Nous vérifions ici le rôle et le nombre de téléchargements.

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;
}
0
Maruti Mohanty