Zakładając, że udostępniasz funkcję wysyłania za pośrednictwem natywnych funkcji WordPress, liku wp_handle_upload
lub czegoś bardziej wysokiego poziomu, doszliśmy do wniosku, że zostanie wyciągniętych kilka haczyków.
http://core.trac.wordpress.org/browser/tags/3.3/wp-admin/include/file.php#L212
Ta wp_handle_upload
funkcja prawdopodobnie byłaby ostatnią natywną funkcją, która dotknęła pliku i znała wszystkie informacje niezbędne do śledzenia.
Interesujące są dwa haczyki wewnątrz tej funkcji: wp_handle_upload
i wp_handle_upload_prefilter
. Ten ostatni jest na pierwszym miejscu, co może sprawdzić aktualne limity i uniemożliwić przesłanie pliku. Ten pierwszy śledziłby rozmiary plików i liczył. Przechowywanie informacji byłoby obsługiwane przez nikogo innego 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;
}
Teoretycznie to działa; praktycznie - niesprawdzone. Poinformuj nas jak to idzie.
Limity wysyłania postów byłyby zachowane w meta postach, prawdopodobnie jak {$user_id}_upload_count
itp. Nie rozumiem, dlaczego to nie zadziałałoby.
Jeśli używasz niestandardowego kodu do obsługi przesyłania (co dubluję), możesz zaimplementować własne akcje i filtry, tak jak wp_handle_uploads
robi to.
$upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
apply_filters
Kod pozwoliłoby inne wtyczki do podłączenia do tam, pomyślałem, że byłoby użyteczne. Czy mógłbyś opisać naturę problemów?Poprawiłem nieco kod Soulseekaha, ponieważ
apply_filter
zmienne nie działały dla mnie - prawdopodobnie dlatego, że ich nie rozumiem!Utworzenie wtyczki byłoby bardzo proste, więc mógłbym ją wypuścić w przyszłości, kiedy opracuję dla niej interfejs.
źródło