WP_Customize_Widgets::get_available_widgets(): array

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

Description

See also

Return

array List of available widgets.

Source

public function get_available_widgets() {
	static $available_widgets = array();
	if ( ! empty( $available_widgets ) ) {
		return $available_widgets;
	}

	global $wp_registered_widgets, $wp_registered_widget_controls;
	require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number().

	$sort = $wp_registered_widgets;
	usort( $sort, array( $this, '_sort_name_callback' ) );
	$done = array();

	foreach ( $sort as $widget ) {
		if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget.
			continue;
		}

		$sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false );
		$done[]  = $widget['callback'];

		if ( ! isset( $widget['params'][0] ) ) {
			$widget['params'][0] = array();
		}

		$available_widget = $widget;
		unset( $available_widget['callback'] ); // Not serializable to JSON.

		$args = array(
			'widget_id'   => $widget['id'],
			'widget_name' => $widget['name'],
			'_display'    => 'template',
		);

		$is_disabled     = false;
		$is_multi_widget = ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) );
		if ( $is_multi_widget ) {
			$id_base            = $wp_registered_widget_controls[ $widget['id'] ]['id_base'];
			$args['_temp_id']   = "$id_base-__i__";
			$args['_multi_num'] = next_widget_id_number( $id_base );
			$args['_add']       = 'multi';
		} else {
			$args['_add'] = 'single';

			if ( $sidebar && 'wp_inactive_widgets' !== $sidebar ) {
				$is_disabled = true;
			}
			$id_base = $widget['id'];
		}

		$list_widget_controls_args = wp_list_widget_controls_dynamic_sidebar(
			array(
				0 => $args,
				1 => $widget['params'][0],
			)
		);
		$control_tpl               = $this->get_widget_control( $list_widget_controls_args );

		// The properties here are mapped to the Backbone Widget model.
		$available_widget = array_merge(
			$available_widget,
			array(
				'temp_id'      => isset( $args['_temp_id'] ) ? $args['_temp_id'] : null,
				'is_multi'     => $is_multi_widget,
				'control_tpl'  => $control_tpl,
				'multi_number' => ( 'multi' === $args['_add'] ) ? $args['_multi_num'] : false,
				'is_disabled'  => $is_disabled,
				'id_base'      => $id_base,
				'transport'    => $this->is_widget_selective_refreshable( $id_base ) ? 'postMessage' : 'refresh',
				'width'        => $wp_registered_widget_controls[ $widget['id'] ]['width'],
				'height'       => $wp_registered_widget_controls[ $widget['id'] ]['height'],
				'is_wide'      => $this->is_wide_widget( $widget['id'] ),
			)
		);

		$available_widgets[] = $available_widget;
	}

	return $available_widgets;
}

Changelog

VersionDescription
3.9.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.