Title: WP_Customize_Widgets::enqueue_scripts
Published: April 25, 2014
Last modified: February 24, 2026

---

# WP_Customize_Widgets::enqueue_scripts()

## In this article

 * [Source](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#wp--skip-link--target)

Enqueues scripts and styles for Customizer panel and export data to JavaScript.

## 󠀁[Source](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#source)󠁿

    ```php
    public function enqueue_scripts() {
    	global $wp_scripts, $wp_registered_sidebars, $wp_registered_widgets;

    	wp_enqueue_style( 'customize-widgets' );
    	wp_enqueue_script( 'customize-widgets' );

    	/** This action is documented in wp-admin/admin-header.php */
    	do_action( 'admin_enqueue_scripts', 'widgets.php' );

    	/*
    	 * Export available widgets with control_tpl removed from model
    	 * since plugins need templates to be in the DOM.
    	 */
    	$available_widgets = array();

    	foreach ( $this->get_available_widgets() as $available_widget ) {
    		unset( $available_widget['control_tpl'] );
    		$available_widgets[] = $available_widget;
    	}

    	$widget_reorder_nav_tpl = sprintf(
    		'<div class="widget-reorder-nav"><span class="move-widget" tabindex="0">%1$s</span><span class="move-widget-down" tabindex="0">%2$s</span><span class="move-widget-up" tabindex="0">%3$s</span></div>',
    		__( 'Move to another area&hellip;' ),
    		__( 'Move down' ),
    		__( 'Move up' )
    	);

    	$move_widget_area_tpl = str_replace(
    		array( '{description}', '{btn}' ),
    		array(
    			__( 'Select an area to move this widget into:' ),
    			_x( 'Move', 'Move widget' ),
    		),
    		'<div class="move-widget-area">
    			<p class="description">{description}</p>
    			<ul class="widget-area-select">
    				<% _.each( sidebars, function ( sidebar ){ %>
    					<li class="" data-id="<%- sidebar.id %>" tabindex="0">
    						<div><strong><%- sidebar.name %></strong></div>
    						<div><%- sidebar.description %></div>
    					</li>
    				<% }); %>
    			</ul>
    			<div class="move-widget-actions">
    				<button class="move-widget-btn button" type="button">{btn}</button>
    			</div>
    		</div>'
    	);

    	/*
    	 * Gather all strings in PHP that may be needed by JS on the client.
    	 * Once JS i18n is implemented (in #20491), this can be removed.
    	 */
    	$some_non_rendered_areas_messages    = array();
    	$some_non_rendered_areas_messages[1] = html_entity_decode(
    		__( 'Your theme has 1 other widget area, but this particular page does not display it.' ),
    		ENT_QUOTES,
    		get_bloginfo( 'charset' )
    	);
    	$registered_sidebar_count            = count( $wp_registered_sidebars );
    	for ( $non_rendered_count = 2; $non_rendered_count < $registered_sidebar_count; $non_rendered_count++ ) {
    		$some_non_rendered_areas_messages[ $non_rendered_count ] = html_entity_decode(
    			sprintf(
    				/* translators: %s: The number of other widget areas registered but not rendered. */
    				_n(
    					'Your theme has %s other widget area, but this particular page does not display it.',
    					'Your theme has %s other widget areas, but this particular page does not display them.',
    					$non_rendered_count
    				),
    				number_format_i18n( $non_rendered_count )
    			),
    			ENT_QUOTES,
    			get_bloginfo( 'charset' )
    		);
    	}

    	if ( 1 === $registered_sidebar_count ) {
    		$no_areas_shown_message = html_entity_decode(
    			sprintf(
    				__( 'Your theme has 1 widget area, but this particular page does not display it.' )
    			),
    			ENT_QUOTES,
    			get_bloginfo( 'charset' )
    		);
    	} else {
    		$no_areas_shown_message = html_entity_decode(
    			sprintf(
    				/* translators: %s: The total number of widget areas registered. */
    				_n(
    					'Your theme has %s widget area, but this particular page does not display it.',
    					'Your theme has %s widget areas, but this particular page does not display them.',
    					$registered_sidebar_count
    				),
    				number_format_i18n( $registered_sidebar_count )
    			),
    			ENT_QUOTES,
    			get_bloginfo( 'charset' )
    		);
    	}

    	$settings = array(
    		'registeredSidebars'          => array_values( $wp_registered_sidebars ),
    		'registeredWidgets'           => $wp_registered_widgets,
    		'availableWidgets'            => $available_widgets, // @todo Merge this with registered_widgets.
    		'l10n'                        => array(
    			'saveBtnLabel'     => __( 'Apply' ),
    			'saveBtnTooltip'   => __( 'Save and preview changes before publishing them.' ),
    			'removeBtnLabel'   => __( 'Remove' ),
    			'removeBtnTooltip' => __( 'Keep widget settings and move it to the inactive widgets' ),
    			'error'            => __( 'An error has occurred. Please reload the page and try again.' ),
    			'widgetMovedUp'    => __( 'Widget moved up' ),
    			'widgetMovedDown'  => __( 'Widget moved down' ),
    			'navigatePreview'  => __( 'You can navigate to other pages on your site while using the Customizer to view and edit the widgets displayed on those pages.' ),
    			'someAreasShown'   => $some_non_rendered_areas_messages,
    			'noAreasShown'     => $no_areas_shown_message,
    			'reorderModeOn'    => __( 'Reorder mode enabled' ),
    			'reorderModeOff'   => __( 'Reorder mode closed' ),
    			'reorderLabelOn'   => esc_attr__( 'Reorder widgets' ),
    			/* translators: %d: The number of widgets found. */
    			'widgetsFound'     => __( 'Number of widgets found: %d' ),
    			'noWidgetsFound'   => __( 'No widgets found.' ),
    		),
    		'tpl'                         => array(
    			'widgetReorderNav' => $widget_reorder_nav_tpl,
    			'moveWidgetArea'   => $move_widget_area_tpl,
    		),
    		'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(),
    	);

    	foreach ( $settings['registeredWidgets'] as &$registered_widget ) {
    		unset( $registered_widget['callback'] ); // May not be JSON-serializable.
    	}

    	$wp_scripts->add_data(
    		'customize-widgets',
    		'data',
    		sprintf( 'var _wpCustomizeWidgetsSettings = %s;', wp_json_encode( $settings, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) )
    	);

    	/*
    	 * TODO: Update 'wp-customize-widgets' to not rely so much on things in
    	 * 'customize-widgets'. This will let us skip most of the above and not
    	 * enqueue 'customize-widgets' which saves bytes.
    	 */

    	if ( wp_use_widgets_block_editor() ) {
    		$block_editor_context = new WP_Block_Editor_Context(
    			array(
    				'name' => 'core/customize-widgets',
    			)
    		);

    		$editor_settings = get_block_editor_settings(
    			get_legacy_widget_block_editor_settings(),
    			$block_editor_context
    		);

    		wp_add_inline_script(
    			'wp-customize-widgets',
    			sprintf(
    				'wp.domReady( function() {
    				   wp.customizeWidgets.initialize( "widgets-customizer", %s );
    				} );',
    				wp_json_encode( $editor_settings, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
    			)
    		);

    		// Preload server-registered block schemas.
    		wp_add_inline_script(
    			'wp-blocks',
    			'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings(), JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) . ');'
    		);

    		// Preload server-registered block bindings sources.
    		$registered_sources = get_all_registered_block_bindings_sources();
    		if ( ! empty( $registered_sources ) ) {
    			$filtered_sources = array();
    			foreach ( $registered_sources as $source ) {
    				$filtered_sources[] = array(
    					'name'        => $source->name,
    					'label'       => $source->label,
    					'usesContext' => $source->uses_context,
    				);
    			}
    			$script = sprintf( 'for ( const source of %s ) { wp.blocks.registerBlockBindingsSource( source ); }', wp_json_encode( $filtered_sources, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) );
    			wp_add_inline_script(
    				'wp-blocks',
    				$script
    			);
    		}

    		wp_add_inline_script(
    			'wp-blocks',
    			sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $block_editor_context ), JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ) ),
    			'after'
    		);

    		wp_enqueue_script( 'wp-customize-widgets' );
    		wp_enqueue_style( 'wp-customize-widgets' );

    		/** This action is documented in edit-form-blocks.php */
    		do_action( 'enqueue_block_editor_assets' );
    	}
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/class-wp-customize-widgets.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/class-wp-customize-widgets.php#L700)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-wp-customize-widgets.php#L700-L903)

## 󠀁[Hooks](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#hooks)󠁿

 [do_action( ‘admin_enqueue_scripts’, string $hook_suffix )](https://developer.wordpress.org/reference/hooks/admin_enqueue_scripts/)

Fires when enqueuing scripts for all admin pages.

 [do_action( ‘enqueue_block_editor_assets’ )](https://developer.wordpress.org/reference/hooks/enqueue_block_editor_assets/)

Fires after block assets have been enqueued for the editing interface.

## 󠀁[Related](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#related)󠁿

| Uses | Description | 
| [get_all_registered_block_bindings_sources()](https://developer.wordpress.org/reference/functions/get_all_registered_block_bindings_sources/)`wp-includes/block-bindings.php` |

Retrieves the list of all registered block bindings sources.

  | 
| [WP_Scripts::add_data()](https://developer.wordpress.org/reference/classes/wp_scripts/add_data/)`wp-includes/class-wp-scripts.php` |

This overrides the add_data method from [WP_Dependencies](https://developer.wordpress.org/reference/classes/wp_dependencies/), to support normalizing of $args.

  | 
| [WP_Block_Editor_Context::__construct()](https://developer.wordpress.org/reference/classes/wp_block_editor_context/__construct/)`wp-includes/class-wp-block-editor-context.php` |

Constructor.

  | 
| [get_block_editor_settings()](https://developer.wordpress.org/reference/functions/get_block_editor_settings/)`wp-includes/block-editor.php` |

Returns the contextualized block editor settings for a selected editor context.

  | 
| [get_legacy_widget_block_editor_settings()](https://developer.wordpress.org/reference/functions/get_legacy_widget_block_editor_settings/)`wp-includes/block-editor.php` |

Returns the block editor settings needed to use the Legacy Widget block which is not registered by default.

  | 
| [wp_use_widgets_block_editor()](https://developer.wordpress.org/reference/functions/wp_use_widgets_block_editor/)`wp-includes/widgets.php` |

Determines whether or not to use the block editor to manage widgets.

  | 
| [get_block_editor_server_block_settings()](https://developer.wordpress.org/reference/functions/get_block_editor_server_block_settings/)`wp-admin/includes/post.php` |

Prepares server-registered blocks for the block editor.

  | 
| [get_block_categories()](https://developer.wordpress.org/reference/functions/get_block_categories/)`wp-includes/block-editor.php` |

Returns all the categories for block types that will be shown in the block editor.

  | 
| [wp_add_inline_script()](https://developer.wordpress.org/reference/functions/wp_add_inline_script/)`wp-includes/functions.wp-scripts.php` |

Adds extra code to a registered script.

  | 
| [WP_Customize_Widgets::get_selective_refreshable_widgets()](https://developer.wordpress.org/reference/classes/wp_customize_widgets/get_selective_refreshable_widgets/)`wp-includes/class-wp-customize-widgets.php` |

List whether each registered widget can be use selective refresh.

  | 
| [_n()](https://developer.wordpress.org/reference/functions/_n/)`wp-includes/l10n.php` |

Translates and retrieves the singular or plural form based on the supplied number.

  | 
| [esc_attr__()](https://developer.wordpress.org/reference/functions/esc_attr__/)`wp-includes/l10n.php` |

Retrieves the translation of $text and escapes it for safe use in an attribute.

  | 
| [wp_enqueue_script()](https://developer.wordpress.org/reference/functions/wp_enqueue_script/)`wp-includes/functions.wp-scripts.php` |

Enqueues a script.

  | 
| [wp_enqueue_style()](https://developer.wordpress.org/reference/functions/wp_enqueue_style/)`wp-includes/functions.wp-styles.php` |

Enqueues a CSS stylesheet.

  | 
| [WP_Customize_Widgets::get_available_widgets()](https://developer.wordpress.org/reference/classes/wp_customize_widgets/get_available_widgets/)`wp-includes/class-wp-customize-widgets.php` |

Builds up an index of all available widgets for use in Backbone models.

  | 
| [wp_json_encode()](https://developer.wordpress.org/reference/functions/wp_json_encode/)`wp-includes/functions.php` |

Encodes a variable into JSON, with some confidence checks.

  | 
| [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` |

Retrieves the translation of $text.

  | 
| [_x()](https://developer.wordpress.org/reference/functions/_x/)`wp-includes/l10n.php` |

Retrieves translated string with gettext context.

  | 
| [get_bloginfo()](https://developer.wordpress.org/reference/functions/get_bloginfo/)`wp-includes/general-template.php` |

Retrieves information about the current site.

  | 
| [number_format_i18n()](https://developer.wordpress.org/reference/functions/number_format_i18n/)`wp-includes/functions.php` |

Converts float number to format based on the locale.

  | 
| [do_action()](https://developer.wordpress.org/reference/functions/do_action/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to an action hook.

  |

[Show 16 more](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#)

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/wp_customize_widgets/enqueue_scripts/?output_format=md#changelog)󠁿

| Version | Description | 
| [3.9.0](https://developer.wordpress.org/reference/since/3.9.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwp_customize_widgets%2Fenqueue_scripts%2F)
before being able to contribute a note or feedback.