Berikan pengguna kapasitas unggah maksimum; batasi jumlah file yang bisa diunggah pengguna ATAU batasi jumlah file per unggahan

9

Saya menggunakan Media Library di ujung depan situs web saya dan saya ingin menghentikan pengguna agar dapat melakukan spam ke server saya dengan mengunggah file dalam jumlah tidak terbatas.

Karena itu, saya ingin melakukan satu atau mungkin semua hal di bawah ini:

  1. Berikan pengguna kapasitas unggah maksimum; yaitu pengguna dapat mengunggah hingga 10 megabyte file.
  2. Batasi jumlah file yang dapat diunggah pengguna berdasarkan per-posting
  3. Batasi jumlah file yang dapat diunggah pengguna ketika mereka mengklik tombol "Sisipkan", yaitu pengunggah Flash dan pengunggah Klasik hanya akan membiarkan Anda mengunggah, misalnya, 2 file sekaligus.

Tidak satu pun dari ini adalah bukti-peluru tetapi mudah-mudahan mereka membuat "spam" seperti kesulitan.

Terima kasih sebelumnya,

dunc
sumber

Jawaban:

11

Dengan asumsi Anda menyediakan fungsionalitas unggah melalui fungsi asli WordPress, wp_handle_uploadatau sesuatu yang lebih tinggi, kami sampai pada kesimpulan bahwa beberapa kait akan ditarik.

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

The wp_handle_uploadFungsi mungkin akan menjadi fungsi asli terakhir untuk menyentuh file, dan akan tahu semua informasi yang diperlukan untuk melacak.

Dua kait di dalam fungsi ini menarik: wp_handle_uploaddan wp_handle_upload_prefilter. Yang terakhir datang terlebih dahulu, ini bisa memeriksa terhadap batas saat ini dan mencegah file diunggah. Yang pertama akan melacak filesizes dan menghitung. Menyimpan informasi akan ditangani oleh siapa pun 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;
}

Secara teoritis, ini berfungsi; praktis - belum diuji. Marilah kita tahu bagaimana kelanjutannya.

Batas unggah per posting akan disimpan di meta pos, mungkin seperti {$user_id}_upload_countdll. Tidak mengerti mengapa itu tidak berhasil.

Jika Anda menggunakan kode khusus untuk menangani unggahan (yang saya gandakan), maka Anda dapat menerapkan tindakan dan filter Anda sendiri seperti wp_handle_uploadshalnya.

soulseekah
sumber
Hai Jiwa - posting yang luar biasa, terima kasih banyak. Saya mendapatkan ini berfungsi sekarang. Bisakah Anda menjelaskan apa yang dilakukan garis-garis ini? $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
dunc
Saya telah memperbarui kode untuk mengubah baris yang baru saja saya sebutkan, karena mereka menyebabkan masalah bagi saya - saya kira saya kehilangan fungsi filter tetapi saya tidak yakin apa yang harus saya lakukan dengan itu! Saya telah mengirimkan kode saya sebagai jawaban, bisakah Anda mengkritiknya?
dunc
The apply_filterskode akan memungkinkan plugin lain untuk menghubungkan ke sana, berpikir bahwa akan berguna. Bisakah Anda menggambarkan sifat masalah?
soulseekah
1
Anda harus mengembalikan $ args di wp_handle_upload atau gambar tidak akan disimpan!
skylarkcob
Juga, harus ada beberapa kode yang akan menangani penghapusan lampiran dan untuk mengurangi bidang meta upload_count dan upload_bytes.
Svetoslav Marinov
1

Saya telah mengubah kode Soulseekah karena apply_filtervariabel tidak bekerja untuk saya - mungkin karena saya tidak memahaminya!

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

Ini akan sangat mudah untuk membuat sebuah plugin dari jadi saya mungkin melepaskannya di beberapa titik di masa depan, ketika saya telah mengembangkan antarmuka untuk itu.

dunc
sumber