[wp-trac] [WordPress Trac] #64804: REST API: Add finalize endpoint to `WP_REST_Attachments_Controller` for client-side media processing

WordPress Trac noreply at wordpress.org
Thu Mar 5 09:23:14 UTC 2026


#64804: REST API: Add finalize endpoint to `WP_REST_Attachments_Controller` for
client-side media processing
-----------------------------+-----------------------
 Reporter:  adamsilverstein  |      Owner:  (none)
     Type:  defect (bug)     |     Status:  new
 Priority:  normal           |  Milestone:  7.0
Component:  REST API         |    Version:  trunk
 Severity:  normal           |   Keywords:  has-patch
  Focuses:                   |
-----------------------------+-----------------------
 When client-side media processing is active, the editor handles image
 resizing, thumbnail generation, and format conversion in the browser using
 WebAssembly. This bypasses the `wp_generate_attachment_metadata` filter
 that normally fires during `wp_generate_attachment_metadata()` in `wp-
 admin/includes/image.php`.

 Many plugins rely on this filter to post-process uploads — for example,
 adding watermarks, syncing to a CDN, generating custom image sizes, or
 updating external indexes. When client-side processing is active, these
 plugins silently stop working because the filter never fires.

 ### Proposed solution

 Add a `POST /wp/v2/media/{id}/finalize` REST API endpoint to
 `WP_REST_Attachments_Controller`. This endpoint:

 1. Retrieves the current attachment metadata
 2. Re-applies the `wp_generate_attachment_metadata` filter with context
 `'update'`
 3. Saves the (potentially modified) metadata back
 4. Returns the updated attachment object

 The endpoint is only registered when
 `wp_is_client_side_media_processing_enabled()` returns `true`, so it has
 zero impact on sites not using client-side processing.

 ### How it works

 The client-side media pipeline calls this endpoint after all operations
 (upload, thumbnail sideloads, scaled image sideload) are complete. No new
 hooks are needed — the existing `wp_generate_attachment_metadata` filter
 is reused. Plugins that already hook into this filter will work without
 modification; they can distinguish client-side finalization by checking
 the `$context` parameter:

 ```php
 add_filter( 'wp_generate_attachment_metadata', function( $metadata,
 $attachment_id, $context ) {
     if ( 'update' === $context ) {
         // Called from finalize endpoint after client-side processing.
         my_plugin_process_attachment( $attachment_id, $metadata );
     }
     return $metadata;
 }, 10, 3 );
 ```

 ### Permissions

 The endpoint reuses `edit_media_item_permissions_check()`, consistent with
 the existing `sideload` and `edit` endpoints. A user must have permission
 to edit the attachment.

 ### Related

 - Gutenberg PR (hooks + JS pipeline):
 https://github.com/WordPress/gutenberg/pull/74913
 - Gutenberg issue: https://github.com/WordPress/gutenberg/issues/74358
 - Core PR: https://github.com/WordPress/wordpress-develop/pull/11168
 - Parent ticket (client-side media processing):
 https://core.trac.wordpress.org/ticket/62243
 - Previous Core backport PR: https://github.com/WordPress/wordpress-
 develop/pull/10868

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/64804>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list