ให้ความสามารถในการอัปโหลดสูงสุดแก่ผู้ใช้ จำกัด จำนวนไฟล์ที่ผู้ใช้สามารถอัพโหลดหรือ จำกัด จำนวนไฟล์ต่อการอัปโหลด


9

ฉันใช้ Media Library ที่ส่วนหน้าของเว็บไซต์ของฉันและฉันต้องการหยุดผู้ใช้ไม่ให้สแปมเซิร์ฟเวอร์ของฉันด้วยการอัพโหลดไฟล์ไม่ จำกัด จำนวน

เช่นนี้ฉันต้องการทำอย่างใดอย่างหนึ่งหรือทั้งหมดด้านล่าง:

  1. ให้ความสามารถในการอัปโหลดสูงสุดแก่ผู้ใช้ คือผู้ใช้สามารถอัปโหลดไฟล์ได้สูงสุด 10 เมกะไบต์
  2. จำกัด จำนวนไฟล์ที่ผู้ใช้สามารถอัปโหลดได้ต่อโพสต์
  3. จำกัด จำนวนไฟล์ที่ผู้ใช้สามารถอัปโหลดได้เมื่อคลิกปุ่ม "แทรก" เช่นตัวอัปโหลดแฟลชและตัวอัปโหลดแบบคลาสสิคจะช่วยให้คุณอัปโหลดเช่นครั้งละ 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ฟังก์ชั่นอาจจะเป็นฟังก์ชั่นพื้นเมืองสุดท้ายที่จะสัมผัสแฟ้มและจะได้รู้ว่าข้อมูลทั้งหมดที่จำเป็นในการติดตาม

สองตะขอภายในฟังก์ชั่นนี้เป็นที่สนใจ: และ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 );
dunc

ฉันได้อัปเดตโค้ดเพื่อเปลี่ยนบรรทัดที่ฉันเพิ่งพูดถึงเพราะมันทำให้ฉันมีปัญหา - ฉันเดาว่าฉันขาดฟังก์ชั่นตัวกรอง แต่ฉันไม่แน่ใจว่าสิ่งที่ฉันต้องทำคืออะไร! ฉันโพสต์รหัสของฉันเป็นคำตอบคุณสามารถวิจารณ์ได้ไหม
dunc

apply_filtersรหัสจะช่วยให้ปลั๊กอินอื่น ๆ ที่จะขอเข้ามามีความคิดที่จะเป็นประโยชน์ คุณสามารถอธิบายลักษณะของปัญหาได้หรือไม่?
soulseekah

1
คุณต้องส่งคืน $ args ใน wp_handle_upload มิเช่นนั้นรูปภาพจะไม่ถูกบันทึก!
skylarkcob

นอกจากนี้จะต้องมีรหัสบางอย่างที่จะจัดการการลบสิ่งที่แนบมาและเพื่อลดฟิลด์เมตา upload_count และ upload_bytes
Svetoslav Marinov

1

ฉันได้แก้ไขโค้ดของ Soulseekah บ้างเนื่องจาก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.