[wp-trac] [WordPress Trac] #65367: REST API: expose per-attachment output format and progressive flags for client-side media processing
WordPress Trac
noreply at wordpress.org
Thu May 28 17:58:49 UTC 2026
#65367: REST API: expose per-attachment output format and progressive flags for
client-side media processing
-----------------------------+------------------------------------------
Reporter: adamsilverstein | Owner: (none)
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: REST API | Version:
Severity: normal | Keywords: needs-patch needs-unit-tests
Focuses: |
-----------------------------+------------------------------------------
Client-side media processing encodes sub-sizes (and, when applicable, the
threshold-scaled "scaled" copy) in the browser before uploading. To match
server-side output, the browser needs two pieces of information that today
are not exposed on the attachment response:
* The output MIME type a given file should be saved as, per the
[https://developer.wordpress.org/reference/hooks/image_editor_output_format/
image_editor_output_format] filter. The filter is filename- and MIME-aware
(`( array $formats, string $filename, string $mime_type )`), so a value
computed in the REST index without a real filename is incorrect for any
non-trivial site.
* Whether progressive / interlaced encoding is requested for that MIME
type, per the
[https://developer.wordpress.org/reference/hooks/image_save_progressive/
image_save_progressive] filter.
Today these values are surfaced (in Gutenberg) on the REST API root index
with empty filename and `image_save_progressive` evaluated against hard-
coded MIME types. That is wrong: the filter contract requires the real
filename and MIME of the file being saved, and plugins can return
different decisions per file. The bypass-labelled Gutenberg PR
[https://github.com/WordPress/gutenberg/pull/75793 #75793] moved this
information to the per-attachment upload response in the Gutenberg plugin;
this ticket backports the same change to Core.
== Proposed change ==
Add two readonly fields to `WP_REST_Attachments_Controller`, in the `edit`
context, alongside the existing `exif_orientation` field:
{{{#!json
"image_output_format": "image/webp",
"image_save_progressive": false
}}}
* `image_output_format` returns the resolved output MIME type when
`image_editor_output_format` maps the source MIME to a different one (e.g.
JPEG → WebP), or `null` when no conversion is needed. The filter is called
with the real attached filename and MIME type, so plugins can make per-
file decisions.
* `image_save_progressive` returns the boolean result of the
`image_save_progressive` filter for the attachment's MIME type.
* Both fields are evaluated only for image attachments
(`wp_attachment_is_image()`).
* `prepare_item_for_response()` and the upload / sideload code paths
recompute the values after lifting the temporary `__return_empty_array` /
`__return_zero` guards that the controller installs around the initial
response, so the values surfaced reflect the site's real configuration.
This deprecates the legacy generic surfacing of `image_output_formats`,
`jpeg_interlaced`, `png_interlaced`, and `gif_interlaced` on the REST API
root index (which used empty filenames and hard-coded MIME types). Those
entries should be removed when the new per-attachment fields land.
== Patch / PRs ==
* Gutenberg PR (merged 2026-04-23):
https://github.com/WordPress/gutenberg/pull/75793
* Gutenberg issue: https://github.com/WordPress/gutenberg/issues/75784
* Core backport PR: (open after this ticket is filed; will be linked from
PR description)
* Related ticket — sibling `image_quality` field:
https://core.trac.wordpress.org/ticket/65262
(Gutenberg [https://github.com/WordPress/gutenberg/pull/78420 #78420] /
core
[https://github.com/WordPress/wordpress-develop/pull/11856 #11856]).
* Context: client-side media processing was
[https://core.trac.wordpress.org/ticket/63884 reverted and re-introduced]
for 7.1; the Gutenberg PR was originally labelled `No Core Sync Required`
because client-side media was Gutenberg-only at the time. The Core sync is
now required.
== Tests ==
New coverage in `tests/phpunit/tests/rest-api/rest-attachments-
controller.php`:
* `test_image_output_format_schema` - field is present, nullable string,
`readonly`, `edit`-context.
* `test_image_save_progressive_schema` - field is present, boolean,
`readonly`, `edit`-context.
* `test_image_output_format_default` - returns `null` when no filter
remaps the source MIME.
* `test_image_output_format_with_filter` - JPEG→WebP filter is reflected
in the response and uses the real attached filename.
* `test_image_save_progressive_default` - returns `false` for JPEG with
no filter.
* `test_image_save_progressive_with_filter` - a MIME-aware
`image_save_progressive` filter is honored.
* `test_get_item_schema` - property count updated to match the two new
fields.
* Existing `sideload` / `finalize` test coverage extended to assert the
recomputed values after the controller's internal guards are removed.
--
Ticket URL: <https://core.trac.wordpress.org/ticket/65367>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list