Изменение загруженного изображения с помощью 'wp_get_image_editor' и 'wp_handle_upload_prefilter'

Я пытаюсь перехватить загрузку изображения, изменить его размер, а затем просто продолжить загрузку.

Я использую фильтр wp_handle_upload_prefilter, который передает в качестве аргумента один файл $ FILES array.

Загрузите редактор изображений с помощью wp_get_image_editor ($ file ['tmp_name']), измените его размер и сохраните с новым именем. Все это прекрасно работает, и измененное изображение создается в моей папке tmp. Все хорошо здесь.

Однако цель состоит в том, чтобы заменить исходное изображение на измененный размер.

Поэтому я изменяю $ file ['name'] и ['tmp_name'], чтобы указать на новый файл и вернуть $ file. Однако WordPress ему не нравится, поскольку он считает, что я выполняю захват файла и выдает ошибку «Указанный файл с ошибкой при загрузке (core file.php L297)»

Если я не изменю переменную $ file, переданную изначально, я получаю измененное изображение в моей папке tmp, но исходное изображение большого размера загружается вместо моего измененного размера.

Ниже функции:

add_filter('wp_handle_upload_prefilter', array($this, 'upload_image_filter')); public function upload_image_filter($file) { $image_editor = wp_get_image_editor($file['tmp_name']); if (!is_wp_error($image_editor)) { // Resize to 400px $image_editor->resize(400); // Generate a new filename with suffix abcd $filename = $image_editor->generate_filename('abcd'); $saved = $image_editor->save($filename); // Try to alter the original $file and inject the new name and path for our new image $file['name'] = $saved['file']; $file['tmp_name'] = $saved['path']; } // Return the filtered $file variable return $file; 

Я также попытался использовать $ image_editor-> save ($ file ['tmp_name']), чтобы сохранить измененное изображение по сравнению с оригиналом, но я все равно получаю ту же ошибку. Однако файл перезаписывается.

Поэтому я попытался изменить tmp_name на новый файл и переписать сам файл, а также не повезло.

Строки, которые вызывают ошибку из файла core.php, следующие:

 // A properly uploaded file will pass this test. There should be no // reason to override this one. $test_uploaded_file = 'wp_handle_upload' === $action ? @ is_uploaded_file( $file['tmp_name'] ) : @ is_file( $file['tmp_name'] ); if ( $test_upload && ! $test_uploaded_file ) { return call_user_func( $upload_error_handler, $file, __( 'Specified file failed upload test.' ) ); } 

Я думаю, что загрузка не выполняется, потому что она тестирует мой вновь созданный файл с is_uploaded_file, который проверяет, был ли загружен HTTP-файл. Увидев, что он был создан на сервере, он потерпит неудачу.

Документы для предварительного фильтра загрузки дескриптора wp ( http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_handle_upload_prefilter ) говорят: «Wp_handle_upload_prefilter предоставляет вам возможность изучить или изменить имя файла до того, как файл будет перенесен в его окончательное местоположение. "

У меня нет идей. Если у кого-нибудь есть, я бы хотел их услышать! Приветствия.

Solutions Collecting From Web of "Изменение загруженного изображения с помощью 'wp_get_image_editor' и 'wp_handle_upload_prefilter'"

Я решил подойти по-другому. Вместо того, чтобы подключаться к «wp_handle_upload_prefilter» и подделывать переменную $ file, я решил сделать размер после загрузки файла и после того, как я получу идентификатор вложения следующим образом:

 public function resize_attachment($attachment_id, $width, $height) { // Get file path $file = get_attached_file($attachment_id); // Get editor, resize and overwrite file $image_editor = wp_get_image_editor($file); $image_editor->resize(1600, 1600); $saved = $image_editor->save($file); // We need to change the metadata of the attachment to reflect the new size // Get attachment meta $image_meta = get_post_meta($attachment_id, '_wp_attachment_metadata', true); // We need to change width and height in metadata $image_meta['height'] = $saved['height']; $image_meta['width'] = $saved['width']; // Update metadata return update_post_meta($attachment_id, '_wp_attachment_metadata', $image_meta); } 

Это кажется слишком сложным, когда WordPress предлагает встроенную функцию для добавления размеров изображений. Я знаю, что это добавляет другой файл с другим именем, но как он НЕ соответствует вашим потребностям?

Функция: add_image_size

Проблема заключается в том, что вы не сохраняли загруженное изображение после его обработки, прежде чем возвращать его, чтобы WP завершился.

 function original_resize( $image_data ){ //get the orig file in WP image editor $image_editor = wp_get_image_editor( $image_data['file'] ); if ( ! is_wp_error( $image_editor ) ) { //we have image so get relevant settings if($imgRESIZE == true){ $w_RESIZE = 500; $h_RESIZE = 500; //get the dimensions of the original uploaded image $sizeORIG = $image_editor->get_size(); //check if resizing is needed if( ( isset( $sizeORIG['width'] ) && $sizeORIG['width'] > $w_RESIZE ) || ( isset( $sizeORIG['height'] ) && $sizeORIG['height'] > $max_height ) ) { //perform the resize $image_editor->resize( $w_RESIZE, h_RESIZE, false ); //apply minor compression $image_editor->set_quality(80); //save the image $image_editor->save( $image_data['file'] ); } } } //return image in same format as received return $image_data; }