ユーザーに最大アップロード容量を与えます。ユーザーがアップロードできるファイル数を制限するか、アップロードごとのファイル数を制限する


9

私は自分のウェブサイトのフロントエンドでメディアライブラリを使用しており、ユーザーが無制限の数のファイルをアップロードしてサーバーにスパムを送信できないようにしたいと思います。

そのため、以下の1つまたはおそらくすべてを実行したいと思います。

  1. ユーザーに最大アップロード容量を与えます。つまり、ユーザーは最大10メガバイトのファイルをアップロードできます。
  2. ユーザーが投稿ごとにアップロードできるファイルの数を制限する
  3. ユーザーが[挿入]ボタンをクリックしたときにアップロードできるファイルの数を制限します。つまり、Flashアップローダーとクラシックアップローダーでは、一度に2つのファイルしかアップロードできません。

これらはいずれも防弾にはなりませんが、うまくいけば、そのような「スパム行為」を困難にするでしょう。

前もって感謝します、

回答:


11

WordPressのネイティブ関数、lik wp_handle_uploadなどの高度な機能を介してアップロード機能を提供していると仮定すると、いくつかのフックがプルされるという結論に達しました。

http://core.trac.wordpress.org/browser/tags/3.3/wp-admin/includes/file.php#L212

wp_handle_uploadこの関数は、おそらくファイルに触れる最後のネイティブ関数となり、かつを追跡するために必要なすべての情報を知っているだろう。

この関数内の2つのフックが重要です:wp_handle_uploadおよびwp_handle_upload_prefilter。後者が最初に来ます。これにより、現在の制限をチェックし、ファイルがアップロードされない可能性があります。前者はファイルサイジングとカウントを追跡します。情報の保存は、他の誰によっても処理されupdate_user_metaます。

add_filter( 'wp_handle_upload', 'wpse47580_update_upload_stats' );
function wpse47580_update_upload_stats( $args ) {
    $file = $args['file'];
    $size = filesize( $file ); // bytes

    $user_id = get_current_user_id();

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

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

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_bytes = get_user_meta( $user_id, 'upload_bytes', $single = true );

    $filesize = /* get filesize from $file array */;
    $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
    $upload_count_limit_reached = apply_filters( 'wpse47580_upload_count_limit_reached', 100 ) > ( $upload_count + 1 );

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

    return $file;
}

理論的には、これは機能します。実質的に-未テスト。どうなるか教えてください。

ポストごとのアップロード制限は、おそらくポストメタ{$user_id}_upload_countなどに保持されます。それが機能しない理由はわかりません。

カスタムコードを使用してアップロードを処理している場合(これは間違いです)、独自のアクションとフィルターを実装することができますwp_handle_uploads


こんにちは魂-素晴らしいポスト、どうもありがとう。これは現在機能しています。これらの行が何をするか説明してくれませんか?$upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
2012

私が問題を引き起こしていたので、先ほど述べた行を変更するようにコードを更新しました-フィルター関数がないと思いますが、それをどうする必要があるのか​​わかりません!私は自分のコードを回答として投稿しましたが、批評していただけませんか?
2012

このapply_filtersコードは、他のプラグインがそこにフックすることを可能にします。問題の性質について説明していただけますか?
soulseekah

1
$ argsをwp_handle_uploadで返す必要があります。そうしないと、画像は保存されません。
skylarkcob 2014

また、添付ファイルの削除を処理し、upload_countおよびupload_bytesメタフィールドを減らすコードが必要です。
Svetoslav Marinov 2015年

1

apply_filter変数が機能しなかったため、Soulseekahのコードをいくらか修正しました。おそらく変数が理解できないためです。

# [File Upload]
#
# Two filters to give users a maximum upload limit of 10Mb and 100 files.
# This function runs after the file has been uploaded.
add_filter( 'wp_handle_upload', 'wpse47580_update_upload_stats' );
function wpse47580_update_upload_stats( $args ) {
    $size = filesize( $args['file'] );

    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', true );

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

# This function runs before the file is uploaded.
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', true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', true );

    $filesize = $file['size']; // bytes

    $upload_bytes_limit_reached = ( ( $filesize + $upload_bytes ) > ( 1024 * 1024 * 10 ) );

    $upload_count_limit_reached = ( $upload_count + 1 ) > 100;

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

    return $file;
}

これは、プラグインを作成するのが本当に簡単なので、将来インターフェイスを開発したときに、いつかリリースする可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.