Обрезание изображения перед вставкой в ​​сообщение

У меня есть форма сообщения в форме frontend, и я использую этот PHP-код, чтобы разрешить загрузку изображения и вставить его в сообщение.

// image upload and attatching to post if ( ! empty( $_FILES ) && ! empty( $_FILES['upload-image']['name'] ) ) { // upload image to server $upload = wp_upload_bits( $_FILES['upload-image']['name'], null, file_get_contents( $_FILES['upload-image']['tmp_name'] ) ); // insert new image to the just created post ================================ $wp_filetype = wp_check_filetype( basename( $upload['file'] ), null ); $wp_upload_dir = wp_upload_dir(); $attachment = array( 'guid' => $wp_upload_dir['baseurl'] . _wp_relative_upload_path( $upload['file'] ), 'post_mime_type' => $wp_filetype['type'], 'post_title' => preg_replace('/\.[^.]+$/', '', basename( $upload['file'] )), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $upload['file'], $post_id ); require_once(ABSPATH . 'wp-admin/includes/image.php'); $attach_data = wp_generate_attachment_metadata( $attach_id, $upload['file'] ); wp_update_attachment_metadata( $attach_id, $attach_data ); update_post_meta( $post_id, '_thumbnail_id', $attach_id ); // end insert ============================================== } 

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

Я нашел функцию, которая всегда приравнивает изображение к соотношению 16: 9 здесь, на котором я мог бы основывать его: https://stackoverflow.com/questions/29063094/php-fit-any-size-image-to-169 -спектральное отношение (не проверено). Но я не уверен, как использовать это в моем вышеприведенном коде выше – изображение соотношения 16: 9 должно быть готово перед вставкой в ​​сообщение.

Любая помощь оценивается.

Я думаю, что вы хороши, но вам не нужно использовать другие функции. У вас есть все

 File: wp-includes/media.php 

Например, вы можете _wp_get_image_size_from_meta получить размеры изображения, поэтому вам не нужно использовать что-то вроде этого:

 $size = getimagesize($file); $width = $size[0]; $height = $size[1]; $mime = $size['mime']; 

Чтобы получить размеры и тип изображения.

С другой стороны, неясно, почему бы не использовать add_image_size

 File: wp-includes/media.php 256: /** 257: * Register a new image size. 258: * 259: * Cropping behavior for the image size is dependent on the value of $crop: 260: * 1. If false (default), images will be scaled, not cropped. 261: * 2. If an array in the form of array( x_crop_position, y_crop_position ): 262: * - x_crop_position accepts 'left' 'center', or 'right'. 263: * - y_crop_position accepts 'top', 'center', or 'bottom'. 264: * Images will be cropped to the specified dimensions within the defined crop area. 265: * 3. If true, images will be cropped to the specified dimensions using center positions. 266: * 267: * @since 2.9.0 268: * 269: * @global array $_wp_additional_image_sizes Associative array of additional image sizes. 270: * 271: * @param string $name Image size identifier. 272: * @param int $width Image width in pixels. 273: * @param int $height Image height in pixels. 274: * @param bool|array $crop Optional. Whether to crop images to specified width and height or resize. 275: * An array can specify positioning of the crop area. Default false. 276: */ 277: function add_image_size( $name, $width = 0, $height = 0, $crop = false ) { 278: global $_wp_additional_image_sizes; 279: 280: $_wp_additional_image_sizes[ $name ] = array( 281: 'width' => absint( $width ), 282: 'height' => absint( $height ), 283: 'crop' => $crop, 284: ); 285: } 

Вы можете установить для параметра $crop значение true и создать эскизы с соотношением 16: 9. Это упорядочивает ваши изображения до определенного размера.

Вы можете добавить несколько раз:

 add_image_size( 'andy1', 160, 90 , true); add_image_size( 'andy2', 1600, 900, true); 

И, если возможно, миниатюры будут созданы, и вам понравится.

Если вы работаете с атрибутом image srcset это будет удобно.