diff --git a/wp-admin/includes/media.php b/wp-admin/includes/media.php index 73a2585f84..5c0b5d0b38 100644 --- a/wp-admin/includes/media.php +++ b/wp-admin/includes/media.php @@ -2194,14 +2194,19 @@ function media_upload_form( $errors = null ) { $plupload_init['multi_selection'] = false; } - // Check if WebP images can be edited. - if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) { - $plupload_init['webp_upload_error'] = true; - } + /** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php */ + $prevent_unsupported_uploads = apply_filters( 'wp_prevent_unsupported_mime_type_uploads', true, null ); - // Check if AVIF images can be edited. - if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) { - $plupload_init['avif_upload_error'] = true; + if ( $prevent_unsupported_uploads ) { + // Check if WebP images can be edited. + if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) { + $plupload_init['webp_upload_error'] = true; + } + + // Check if AVIF images can be edited. + if ( ! wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) { + $plupload_init['avif_upload_error'] = true; + } } /** diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php index 0c98a729e4..4c49a1f335 100644 --- a/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php +++ b/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php @@ -134,6 +134,36 @@ class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { array( 'status' => rest_authorization_required_code() ) ); } + $files = $request->get_file_params(); + + /** + * Filter whether the server should prevent uploads for image types it doesn't support. Default true. + * + * Developers can use this filter to enable uploads of certain image types. By default image types that are not + * supported by the server are prevented from being uploaded. + * + * @since 6.8.0 + * + * @param bool $check_mime Whether to prevent uploads of unsupported image types. + * @param string|null $mime_type The mime type of the file being uploaded (if available). + */ + $prevent_unsupported_uploads = apply_filters( 'wp_prevent_unsupported_mime_type_uploads', true, isset( $files['file']['type'] ) ? $files['file']['type'] : null ); + + // If the upload is an image, check if the server can handle the mime type. + if ( + $prevent_unsupported_uploads && + isset( $files['file']['type'] ) && + str_starts_with( $files['file']['type'], 'image/' ) + ) { + // Check if the image editor supports the type. + if ( ! wp_image_editor_supports( array( 'mime_type' => $files['file']['type'] ) ) ) { + return new WP_Error( + 'rest_upload_image_type_not_supported', + __( 'The web server cannot generate responsive image sizes for this image. Convert it to JPEG or PNG before uploading.' ), + array( 'status' => 400 ) + ); + } + } return true; } diff --git a/wp-includes/version.php b/wp-includes/version.php index acd44b97b4..e33f5b142b 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.8-beta3-60083'; +$wp_version = '6.8-beta3-60084'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.