ব্যবহারকারীদের সর্বোচ্চ আপলোডের ক্ষমতা দিন; কোনও ব্যবহারকারী আপলোড করতে পারে এমন ফাইলের সংখ্যা সীমাবদ্ধ করুন বা প্রতি আপলোড ফাইলগুলির সংখ্যা সীমাবদ্ধ করুন


9

আমি আমার ওয়েবসাইটের প্রথম প্রান্তে মিডিয়া লাইব্রেরিটি ব্যবহার করছি এবং আমি সীমাহীন সংখ্যক ফাইল আপলোড করে আমার সার্ভারটি স্প্যাম করতে সক্ষম হওয়া থেকে বিরত করতে চাই।

এর মতো, আমি নীচের সমস্তগুলি বা সম্ভবত কিছু করতে চাই:

  1. ব্যবহারকারীদের সর্বোচ্চ আপলোডের ক্ষমতা দিন; অর্থাৎ ব্যবহারকারীরা 10 মেগাবাইট পর্যন্ত ফাইল আপলোড করতে পারবেন।
  2. ব্যবহারকারী প্রতি পোস্টের ভিত্তিতে ফাইল আপলোড করতে পারে তার সীমাবদ্ধ করুন
  3. ব্যবহারকারীরা "সন্নিবেশ" বোতামটি ক্লিক করার সময় কোনও ফাইল আপলোড করতে পারে তার সীমাবদ্ধ করুন, যেমন ফ্ল্যাশ আপলোডার এবং ক্লাসিক আপলোডার কেবলমাত্র একবারে 2 টি ফাইল আপলোড করতে দেয়।

এর কোনওটিই বুলেট-প্রুফ নয় তবে তারা আশা করে এই জাতীয় "স্প্যামিং" কে কোন অসুবিধা তৈরি করবে।

আগাম ধন্যবাদ,

উত্তর:


11

ধরে নিই যে আপনি ওয়ার্ডপ্রেসের স্থানীয় ফাংশনগুলি, পছন্দ wp_handle_uploadবা আরও কিছু উচ্চ স্তরের মাধ্যমে আপলোড কার্যকারিতা সরবরাহ করছেন , আমরা এই সিদ্ধান্তে পৌঁছেছি যে বেশ কয়েকটি হুক আঁকতে চলেছে।

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

wp_handle_uploadফাংশন সম্ভবত গত নেটিভ ফাংশন ফাইল স্পর্শ করতে হবে, এবং সমস্ত তথ্য প্রয়োজন যে ট্র্যাক রাখতে জানতেন।

এই ফাংশনটির ভিতরে দুটি হুক আগ্রহী: 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 );
দুপুর

আমি সবেমাত্র উল্লিখিত রেখাগুলি পরিবর্তন করার জন্য কোডটি আপডেট করেছি, কারণ তারা আমার সমস্যার কারণ হচ্ছিল - আমি অনুমান করি যে আমি একটি ফিল্টার ফাংশন মিস করছি তবে এটির সাথে আমার কী করা দরকার তা আমি নিশ্চিত নই! আমি উত্তর হিসাবে আমার কোড পোস্ট করেছি, আপনি কি এটি সমালোচনা করতে পারেন?
দুপুর

apply_filtersকোড অন্যান্য প্লাগিন সেখানে প্রবেশ হুক সম্ভব হবে, যে চিন্তা দরকারী হবে। আপনি সমস্যার প্রকৃতি বর্ণনা করতে পারেন?
সোলেন্সেকাহ

1
আপনাকে অবশ্যই ডাব্লুপি_হ্যান্ডল_আপলোডে gs আরোগুলি ফিরিয়ে দিতে হবে বা চিত্রটি সংরক্ষণ করা হবে না!
স্কাইলার্ককব

এছাড়াও, এমন কিছু কোড থাকতে হবে যা সংযুক্তি মোছার কাজটি পরিচালনা করবে এবং মেটা ক্ষেত্রগুলি আপলোড_কাউন্ট এবং আপলোড_কে হ্রাস করবে।
স্বেটোস্লাভ মেরিনভ

1

apply_filterভেরিয়েবলগুলি আমার পক্ষে কাজ না করায় আমি সোলসেকার কোডটি কিছুটা সংশোধন করেছি - সম্ভবত কারণ আমি সেগুলি বুঝতে পারি না!

# [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.