WP_REST_Attachments_Controller::create_item_permissions_check
Checks if a given request has access to create an attachment.
Method of the class: WP_REST_Attachments_Controller{}
Hooks from the method
Returns
true|WP_Error. Boolean true if the attachment may be created, or a WP_Error if not.
Usage
$WP_REST_Attachments_Controller = new WP_REST_Attachments_Controller(); $WP_REST_Attachments_Controller->create_item_permissions_check( $request );
- $request(WP_REST_Request) (required)
- Full details about the request.
Changelog
| Since 4.7.0 | Introduced. |
WP_REST_Attachments_Controller::create_item_permissions_check() WP REST Attachments Controller::create item permissions check code WP 7.1
public function create_item_permissions_check( $request ) {
$ret = parent::create_item_permissions_check( $request );
if ( ! $ret || is_wp_error( $ret ) ) {
return $ret;
}
if ( ! current_user_can( 'upload_files' ) ) {
return new WP_Error(
'rest_cannot_create',
__( 'Sorry, you are not allowed to upload media on this site.' ),
array( 'status' => 400 )
);
}
// Attaching media to a post requires ability to edit said post.
if ( ! empty( $request['post'] ) && ! current_user_can( 'edit_post', (int) $request['post'] ) ) {
return new WP_Error(
'rest_cannot_edit',
__( 'Sorry, you are not allowed to upload media to this post.' ),
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, $files['file']['type'] ?? null );
/*
* When the client handles image processing (generate_sub_sizes is false),
* skip the server-side image editor support check. This check exists
* because the server cannot process the image, so it is only relaxed when
* client side media processing is enabled and something else can. Asking
* to skip sub sizes on a site without it does not make an unsupported
* image type any more usable.
*/
if ( wp_is_client_side_media_processing_enabled() && false === $request['generate_sub_sizes'] ) {
$prevent_unsupported_uploads = false;
}
/*
* Always allow still HEIC/HEIF uploads through even if the server's
* image editor doesn't support them. The client-side canvas fallback
* handles processing using the browser's native HEVC decoder.
*
* The '-sequence' variants (multi-frame Live Photos) are deliberately
* excluded: neither the server nor the browser fallback can process
* them yet, so they should fall through to the standard unsupported
* mime-type error rather than be stored unprocessable.
*/
$still_heic_mime_types = array( 'image/heic', 'image/heif' );
if (
$prevent_unsupported_uploads &&
! empty( $files['file']['type'] ) &&
in_array( $files['file']['type'], $still_heic_mime_types, true )
) {
$prevent_unsupported_uploads = false;
}
// 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/' )
) {
// List of non-resizable image formats.
$editor_non_resizable_formats = array(
'image/svg+xml',
);
// Check if the image editor supports the type or ignore if it isn't a format resizable by an editor.
if (
! in_array( $files['file']['type'], $editor_non_resizable_formats, true ) &&
! 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;
}