Kullanıcılara maksimum yükleme kapasitesi verin; kullanıcının yükleyebileceği dosya sayısını sınırlayın VEYA yükleme başına dosya sayısını sınırlayın


9

Web sitemin ön ucunda Medya Kütüphanesi kullanıyorum ve kullanıcıların sınırsız sayıda dosya yükleyerek sunucumun spam göndermesini engellemek istiyorum.

Bu nedenle, aşağıdakilerden birini veya belki tümünü yapmak istiyorum:

  1. Kullanıcılara maksimum yükleme kapasitesi verin; yani kullanıcılar 10 megabayta kadar dosya yükleyebilir.
  2. Bir kullanıcının gönderi başına yükleyebileceği dosya sayısını sınırlayın
  3. Bir kullanıcının "Ekle" düğmesini tıkladığında yükleyebileceği dosya sayısını sınırlandırın; örneğin, Flash yükleyici ve Klasik yükleyici aynı anda yalnızca 2 dosya yüklemenize izin verir.

Bunların hiçbiri kurşun geçirmez değildir, ancak umarım böyle bir “spam” ı bir zorluk haline getirir.

Şimdiden teşekkürler,

Yanıtlar:


11

WordPress'in yerel işlevleri, benzeri wp_handle_uploadveya daha üst düzey bir şey aracılığıyla yükleme işlevselliği sağladığınızı varsayarsak, birkaç kanca çekileceği sonucuna varıyoruz.

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

wp_handle_uploadFonksiyon muhtemelen dosyayı dokunan son yerli işlev olacaktır ve takip etmek için gerekli olan tüm bilgileri bilemez.

Bu işlevin içindeki iki kanca ilgi çekicidir: wp_handle_uploadve wp_handle_upload_prefilter. İkincisi önce gelir, bu mevcut sınırlamaları kontrol edebilir ve dosyanın yüklenmesini engelleyebilir. İlki dosya boyutlarını izler ve sayır. Bilgilerin depolanması, başkası tarafından ele alınmaz 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;
}

Teorik olarak, bu işe yarar; pratikte - denenmemiş. Nasıl gittiğini bize bildirin.

Gönderi başına yükleme sınırları, büyük olasılıkla {$user_id}_upload_countvb. Gibi meta metalarda tutulur . Bunun neden işe yaramadığını görmeyin.

Yüklemeleri işlemek için özel bir kod kullanıyorsanız (ki bu da ikiye katladığım), kendi işlemlerinizi ve filtrelerinizi aynen uygulayabilirsiniz wp_handle_uploads.


Merhaba Soul - mükemmel yazı, çok teşekkürler. Bunu şimdi çalıştırıyorum. Bu çizgilerin ne yaptığını açıklayabilir misiniz? $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
dunc

Bana sorunlara neden oldukları için bahsettiğim satırları değiştirmek için kodu güncelledim - Sanırım bir filtre işlevini kaçırıyorum ama onunla ne yapmam gerektiğinden emin değilim! Kodumu cevap olarak gönderdim, eleştirebilir misin?
dunc

apply_filtersKodunun başka eklentileri orada kanca için izin verecek, bu faydalı olacağını düşündük. Sorunların doğasını tarif eder misiniz?
soulseekah

1
Wp_handle_upload içinde $ args döndürmelisiniz, aksi takdirde görüntü kaydedilmeyecektir!
skylarkcob

Ayrıca, ekin silinmesini işleyecek ve upload_count ve upload_bytes meta alanlarını azaltacak bir kod olması gerekir.
Svetoslav Marinov

1

apply_filterDeğişkenler benim için çalışmadığı için Soulseekah'ın kodunu biraz değiştirdim - muhtemelen onları anlamıyorum çünkü!

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

Bu bir eklenti yapmak gerçekten basit olurdu, bu yüzden gelecekte bir noktada, bunun için bir arayüz geliştirdiğimde serbest bırakabilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.