it-swarm.com.de

Legen Sie eine maximale Anzahl von Uploads für Benutzer einer bestimmten Benutzerrolle fest

Für Benutzer mit der ContributorBenutzerrolle möchte ich die Gesamtanzahl der Bilder einschränken, die sie hochladen dürfen. Ich habe diesen Code auf einer Antwort hier gefunden :

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

Es gibt zwei Probleme. Erstens funktioniert der obige Code nicht richtig, er soll 10 Uploads erlauben, aber die Upload-Limit-Meldung wird angezeigt, egal was passiert. Zweitens gilt dies für all Benutzerrollen.

Nach weiteren Recherchen habe ich diese funktionierende Antwort gefunden, aber die Lösung gilt für die Gesamtzahl der Uploads pro Beitrag, nicht für Benutzer.

Wie kann ich ein Upload-Limit für Benutzer einer bestimmten Benutzerrolle festlegen? Idealerweise mit einer Lösung, die die Anzahl abzieht, wenn der Benutzer ein hochgeladenes Bild dauerhaft entfernt.

4

Ich bin mir nicht sicher, welches das echte Problem mit dem von Ihnen geposteten Code ist, aber ich kann nicht verstehen, warum ich 2 Funktionen verwende, wenn eine ausreicht ...

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

Beachten Sie, dass die Zählung beginnt, wenn Sie die Funktion und den Filter hinzufügen: Alle zuvor hochgeladenen Dateien werden nicht gezählt.

Die zu beschränkenden Rollen können auch über Filter geändert werden.

Das Limit kann per Filter geändert werden (Standard 10 in meinem Code) und ich übergebe auch das Benutzerobjekt und die aktuelle Anzahl der Benutzer-Uploads zu filtern, auf diese Weise kann der Filter weitere Informationen berücksichtigen ...

Bearbeiten

Um die Anzahl zu verringern, wenn ein Mitwirkender einen Anhangshook löscht, delete_attachment und führen Sie eine Logik aus:

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

Beachten Sie, dass der vorherige Code nicht das Löschen von Anhängen verhindert, die von anderen Benutzern hochgeladen wurden, da dies von den Funktionen/plugin/code behandelt werden sollte, mit denen Mitwirkende Dateien hochladen können (einmal standardmäßig können sie das nicht tun), und weil der Haken 'delete_attachment' passiert nachdem der Anhang bereits gelöscht wurde. Wenn der Anhang jedoch nicht vom aktuellen Benutzer hochgeladen wurde, wird die Verkleinerung nicht durchgeführt, nur um sicherzugehen ...

5
gmazzap

Anstatt ein zusätzliches Metafeld in der Datenbank pro Benutzer zu verwalten, können Sie die Dinge einfach halten und die Anzahl der Uploads im laufenden Betrieb wie folgt zählen:

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

Dies kann für sehr große Datenbanken weniger praktisch sein, reicht aber in vielen Fällen aus. Es funktioniert sofort für vorhandene Datenbanken und stellt immer sicher, dass die Zählung korrekt ist. Es werden nur Uploads gezählt, wenn der Benutzer einer eingeschränkten Rolle entspricht, daher hat dies keine Auswirkungen auf uneingeschränkte Benutzer.

1
David

Ich habe die spätere Antwort angepasst, um nach der Benutzerrolle zu suchen. Ich habe sie nicht getestet, aber das sollte funktionieren

Der Filter wp_handle_upload_prefilter bietet Ihnen die Möglichkeit, den Dateinamen zu überprüfen oder zu ändern, bevor die Datei an ihren endgültigen Speicherort verschoben wird. also würden wir hier nach der Rolle und der Anzahl der Uploads suchen.

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