[wp-trac] [WordPress Trac] #61335: block_editor_rest_api_preload function is restoring $wp_scripts and styles enqueued by wp_enqueue_media are lost
WordPress Trac
noreply at wordpress.org
Fri May 31 15:42:37 UTC 2024
#61335: block_editor_rest_api_preload function is restoring $wp_scripts and styles
enqueued by wp_enqueue_media are lost
--------------------------+------------------------------
Reporter: oglekler | Owner: (none)
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Widgets | Version:
Severity: normal | Resolution:
Keywords: | Focuses: administration
--------------------------+------------------------------
Description changed by oglekler:
Old description:
> Widgets screen > block_editor_rest_api_preload()
> ACF Pro is calling wp_enqueue_media():
> {{{
> Array
> (
> [0] => wp_enqueue_media
> [1] => ACF_Assets->enqueue_uploader
> [2] => acf_enqueue_uploader
> [3] => acf_field_image->render_field
> [4] => WP_Hook->apply_filters
> [5] => WP_Hook->do_action
> [6] => do_action_ref_array('acf/render_field/type=image')
> [7] => _acf_apply_hook_variations
> [8] => WP_Hook->apply_filters
> [9] => WP_Hook->do_action
> [10] => do_action('acf/render_field')
> [11] => acf_render_field
> [12] => acf_render_field_wrap
> [13] => ACF_Repeater_Table->row
> [14] => ACF_Repeater_Table->rows
> [15] => ACF_Repeater_Table->render
> [16] => acf_field_repeater->render_field
> [17] => WP_Hook->apply_filters
> [18] => WP_Hook->do_action
> [19] => do_action_ref_array('acf/render_field/type=repeater')
> [20] => _acf_apply_hook_variations
> [21] => WP_Hook->apply_filters
> [22] => WP_Hook->do_action
> [23] => do_action('acf/render_field')
> [24] => acf_render_field
> [25] => acf_render_field_wrap
> [26] => acf_render_fields
> [27] => acf_form_widget->edit_widget
> [28] => WP_Hook->apply_filters
> [29] => WP_Hook->do_action
> [30] => do_action_ref_array('in_widget_form')
> [31] => WP_Widget->form_callback
> [32] => wp_render_widget_control
> [33] => WP_REST_Widgets_Controller->prepare_item_for_response
> [34] => WP_REST_Widgets_Controller->get_items
> [35] => WP_REST_Server->respond_to_request
> [36] => WP_REST_Server->dispatch
> [37] => rest_do_request
> [38] => rest_preload_api_request
> [39] => array_reduce
> [40] => block_editor_rest_api_preload
> [41] => require('wp-admin/widgets-form-blocks.php')
> )
> }}}
> But next, what block_editor_rest_api_preload() is doing is restoring
> everything into previous state:
>
> {{{
> $post = $backup_global_post;
> $wp_scripts = $backup_wp_scripts;
> $wp_styles = $backup_wp_styles;
> }}}
> It could have been fine, but wp_enqueue_media() has a check that it has
> already been called (due to #45913, it looks necessary):
>
> {{{
> function wp_enqueue_media( $args = array() ) {
> // Enqueue me just once per page, please.
> if ( did_action( 'wp_enqueue_media' ) ) {
> return;
> }
> ....
> }}}
>
> And as a result, I am getting a broken media uploader on the Widget's
> page, and calling wp_enqueue_media() is doing no good in this situation,
> and there is no right way to fix it. I can change $wp_actions global
> before calling wp_enqueue_media() second time or add
> {{{
> wp_enqueue_style( 'media-views' );
> wp_enqueue_style( 'imgareaselect' );
> }}}
> hoping that I don't need any additional logic from the function. I
> believe that both solutions are not the correct way to do things, and
> something needs to be done in the core to fix the root of the problem
> (not the ACF plugin because from one point of view it can have its reason
> to this call and another is that other plugins can have similar
> behaviour).
New description:
Widgets screen > block_editor_rest_api_preload()
ACF Pro is calling wp_enqueue_media():
{{{
Array
(
[0] => wp_enqueue_media
[1] => ACF_Assets->enqueue_uploader
[2] => acf_enqueue_uploader
[3] => acf_field_image->render_field
[4] => WP_Hook->apply_filters
[5] => WP_Hook->do_action
[6] => do_action_ref_array('acf/render_field/type=image')
[7] => _acf_apply_hook_variations
[8] => WP_Hook->apply_filters
[9] => WP_Hook->do_action
[10] => do_action('acf/render_field')
[11] => acf_render_field
[12] => acf_render_field_wrap
[13] => ACF_Repeater_Table->row
[14] => ACF_Repeater_Table->rows
[15] => ACF_Repeater_Table->render
[16] => acf_field_repeater->render_field
[17] => WP_Hook->apply_filters
[18] => WP_Hook->do_action
[19] => do_action_ref_array('acf/render_field/type=repeater')
[20] => _acf_apply_hook_variations
[21] => WP_Hook->apply_filters
[22] => WP_Hook->do_action
[23] => do_action('acf/render_field')
[24] => acf_render_field
[25] => acf_render_field_wrap
[26] => acf_render_fields
[27] => acf_form_widget->edit_widget
[28] => WP_Hook->apply_filters
[29] => WP_Hook->do_action
[30] => do_action_ref_array('in_widget_form')
[31] => WP_Widget->form_callback
[32] => wp_render_widget_control
[33] => WP_REST_Widgets_Controller->prepare_item_for_response
[34] => WP_REST_Widgets_Controller->get_items
[35] => WP_REST_Server->respond_to_request
[36] => WP_REST_Server->dispatch
[37] => rest_do_request
[38] => rest_preload_api_request
[39] => array_reduce
[40] => block_editor_rest_api_preload
[41] => require('wp-admin/widgets-form-blocks.php')
)
}}}
But next, what block_editor_rest_api_preload() is doing is restoring
everything into previous state:
{{{
$post = $backup_global_post;
$wp_scripts = $backup_wp_scripts;
$wp_styles = $backup_wp_styles;
}}}
It could have been fine, but wp_enqueue_media() has a check that it has
already been called (due to #45913, it looks necessary):
{{{
function wp_enqueue_media( $args = array() ) {
// Enqueue me just once per page, please.
if ( did_action( 'wp_enqueue_media' ) ) {
return;
}
....
}}}
And as a result, I am getting a broken media uploader on the Widget's
page, and calling wp_enqueue_media() is doing no good in this situation,
and there is no right way to fix it. I can change $wp_actions global
before calling wp_enqueue_media() second time or add
{{{
wp_enqueue_style( 'media-views' );
wp_enqueue_style( 'imgareaselect' );
}}}
hoping that I don't need any additional logic from the function. I believe
that both solutions are not the correct way to do things, and something
needs to be done in the core to fix the root of the problem (not the ACF
plugin because from one point of view it can have its reason to this call
and another is that other plugins can have similar behaviour).
I decided to add action on 'current_screen' and call wp_enqueue_media() on
widgets screen preventively. But this is also a workaround and cannot be
counted as a proper solution.
--
--
Ticket URL: <https://core.trac.wordpress.org/ticket/61335#comment:1>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list