问题描述

我正在使用我网站前端的媒体库,我想阻止用户通过上传无限数量的文件来垃圾邮件。

因此,我想做一个或者以下全部:

  1. 为用户提供最大上载能力; 即用户最多可以上传 10 兆字节的文件。

  2. 限制用户可以在 per-post 上上传的文件数

  3. 限制用户在点击”Insert” 按钮时可以上传的文件数量,即 Flash 上​​传者和经典上传者只允许您一次上传 2 个文件。

这些都不是 bullet-proof,但他们希望使这样的”spamming” 成为一个难题。

提前致谢,

最佳解决方案

假设您通过 WordPress 的本机功能,wp_handle_upload 或更多的 high-level 提供上传功能,我们得出结论,几个钩子将被拉。

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 那样实现自己的操作和过滤器。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。