web-dev-qa-db-ja.com

特定のユーザーロールのユーザーの最大アップグレード数を設定する

Contributorユーザーロール を持つユーザーの場合、アップロードを許可されている画像の総数を制限します。私はこのコードが に答えているのを見つけた

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

2つ問題があります。まず、上記のコードは正しく機能しません。10回のアップロードを許可することになっていますが、アップロード制限メッセージは何に関係なく表示されます。次に、これはallユーザーロールに適用されます。

さらに調査したところ、 この実用的な回答 が見つかりましたが、この解決策は投稿ごとの合計アップロード数に適用されます。

特定のユーザーロールのユーザーにアップロード数制限を設定するにはどうすればよいですか。ユーザーがアップロードした画像を完全に削除した場合にカウントを差し引くソリューションが理想的です。

4

あなたが投稿したコードのどれがrealの問題なのか、私にはよくわかりませんが、2つの関数が1つで十分なのになぜ使用するのか理解できません...

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

この関数とフィルタを追加すると、カウントが開始されます。以前にアップロードされたファイルはすべてカウントされません。

制限する役割はフィルタによっても変更できます。

制限はfilter(私のコードではデフォルトの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 );
   }
}

これは、貢献者がファイルをアップロードすることを可能にする関数/ plugin/codeによって処理されるべきで(デフォルトでは一度はできない)、'delete_attachment'フックが原因であるためです。の後に添付ファイルはすでに削除されています。ただし、添付ファイルが現在のユーザーによってアップロードされていない場合、減少は実行されません。

5
gmazzap

ユーザーごとにデータベース内の追加のメタフィールドを管理する代わりに、物事を単純に保ち、その場でアップロードの数を数えることができます。

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

これは非常に大規模なデータベースにはあまり実用的ではないかもしれませんが、多くの場合、うまくいくでしょう。既存のデータベースではそのまま使用でき、常にカウントが正しいことを確認します。ユーザーが制限された役割に一致した場合にのみアップロードをカウントするため、制限のないユーザーには影響しません。

1
David

私はユーザーロールをチェックするために後で答えを調整しました、私はそれをテストしていませんがこれはうまくいくはずです

フィルタ 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;
}
0
Maruti Mohanty