函数文档

wp_list_widgets()

💡 云策文档标注

概述

wp_list_widgets() 函数用于显示可用小部件的列表,通过排序和过滤已显示的多小部件来生成控制界面。

关键要点

  • 函数基于全局变量 $wp_registered_widgets 和 $wp_registered_widget_controls 操作。
  • 使用 usort() 和 _sort_name_callback 对注册的小部件进行排序。
  • 通过 is_active_widget() 检查小部件是否在前端激活。
  • 动态生成控制参数,调用 wp_list_widget_controls_dynamic_sidebar() 和 wp_widget_control() 来显示小部件控制表单。

代码示例

global $wp_registered_widgets, $wp_registered_widget_controls;

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

foreach ( $sort as $widget ) {
    if ( in_array( $widget['callback'], $done, true ) ) {
        continue;
    }

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

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

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

    if ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) ) {
        $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 ) {
            $args['_hide'] = '1';
        }
    }

    $control_args = array(
        0 => $args,
        1 => $widget['params'][0],
    );
    $sidebar_args = wp_list_widget_controls_dynamic_sidebar( $control_args );

    wp_widget_control( ...$sidebar_args );
}

📄 原文内容

Display list of the available widgets.

Source

function wp_list_widgets() {
	global $wp_registered_widgets, $wp_registered_widget_controls;

	$sort = $wp_registered_widgets;
	usort( $sort, '_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();
		}

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

		if ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) ) {
			$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 ) {
				$args['_hide'] = '1';
			}
		}

		$control_args = array(
			0 => $args,
			1 => $widget['params'][0],
		);
		$sidebar_args = wp_list_widget_controls_dynamic_sidebar( $control_args );

		wp_widget_control( ...$sidebar_args );
	}
}

Changelog

Version Description
2.5.0 Introduced.