函数文档

wp_dropdown_users()

💡 云策文档标注

概述

wp_dropdown_users() 函数用于生成用户下拉列表的 HTML 内容,支持通过参数控制输出方式、用户筛选和显示选项。默认直接输出 HTML,也可通过设置 'echo' 参数为 false 来返回字符串。

关键要点

  • 函数接受数组或字符串形式的参数,用于自定义下拉列表的行为,如用户包含/排除、排序、显示字段等。
  • 参数 'echo' 控制是否直接输出 HTML(默认 true),'include' 和 'exclude' 用于指定用户 ID,但两者不能同时使用。
  • 支持角色和权限筛选,包括 'role'、'role__in'、'role__not_in'、'capability' 等参数,自 WordPress 5.9 起 'who' 参数已弃用。
  • 函数返回 HTML 字符串,可通过过滤器 'wp_dropdown_users' 和 'wp_dropdown_users_args' 进行修改。
  • 包含默认参数设置,如 'orderby' 为 'display_name','order' 为 'ASC','show' 为 'display_name'。

代码示例

// 基本用法:生成用户下拉列表并输出
wp_dropdown_users();

// 高级用法:返回 HTML 字符串并自定义参数
$args = array(
    'show_option_all' => '所有用户',
    'orderby' => 'user_login',
    'order' => 'DESC',
    'role' => 'editor',
    'echo' => false
);
$dropdown = wp_dropdown_users($args);
echo $dropdown;

注意事项

  • 参数 'include' 和 'exclude' 互斥,不能在同一调用中同时使用。
  • 自 WordPress 5.9 起,'who' 参数已弃用,应使用 'role' 或 'capability' 参数进行用户筛选。
  • 权限参数(如 'capability')仅对数据库中存在的或通过 'map_meta_cap' 过滤的权限有效。
  • 函数内部使用 get_users() 查询用户,并应用过滤器以允许自定义查询参数和输出。

📄 原文内容

Creates dropdown HTML content of users.

Description

The content can either be displayed, which it is by default, or retrieved by setting the ‘echo’ argument to false. The ‘include’ and ‘exclude’ arguments are optional; if they are not specified, all users will be displayed. Only one can be used in a single call, either ‘include’ or ‘exclude’, but not both.

Parameters

$argsarray|stringoptional
Array or string of arguments to generate a drop-down of users.
See WP_User_Query::prepare_query() for additional available arguments.

  • show_option_all string
    Text to show as the drop-down default (all).
    Default empty.
  • show_option_none string
    Text to show as the drop-down default when no users were found. Default empty.
  • option_none_value int|string
    Value to use for $show_option_none when no users were found. Default -1.
  • hide_if_only_one_author string
    Whether to skip generating the drop-down if only one user was found. Default empty.
  • orderby string
    Field to order found users by. Accepts user fields.
    Default 'display_name'.
  • order string
    Whether to order users in ascending or descending order. Accepts 'ASC' (ascending) or 'DESC' (descending).
    Default 'ASC'.
  • include int[]|string
    Array or comma-separated list of user IDs to include.
    Default empty.
  • exclude int[]|string
    Array or comma-separated list of user IDs to exclude.
    Default empty.
  • multi bool|int
    Whether to skip the ID attribute on the 'select' element.
    Accepts 1|true or 0|false. Default 0|false.
  • show string
    User data to display. If the selected item is empty then the 'user_login' will be displayed in parentheses.
    Accepts any user field, or 'display_name_with_login' to show the display name with user_login in parentheses.
    Default 'display_name'.
  • echo int|bool
    Whether to echo or return the drop-down. Accepts 1|true (echo) or 0|false (return). Default 1|true.
  • selected int
    Which user ID should be selected. Default 0.
  • include_selected bool
    Whether to always include the selected user ID in the drop- down. Default false.
  • name string
    Name attribute of select element. Default 'user'.
  • id string
    ID attribute of the select element. Default is the value of $name.
  • class string
    Class attribute of the select element. Default empty.
  • blog_id int
    ID of blog (Multisite only). Default is ID of the current blog.
  • who string
    Deprecated, use $capability instead.
    Which type of users to query. Accepts only an empty string or 'authors'. Default empty (all users).
  • role string|string[]
    An array or a comma-separated list of role names that users must match to be included in results. Note that this is an inclusive list: users must match *each* role. Default empty.
  • role__in string[]
    An array of role names. Matched users must have at least one of these roles. Default empty array.
  • role__not_in string[]
    An array of role names to exclude. Users matching one or more of these roles will not be included in results. Default empty array.
  • capability string|string[]
    An array or a comma-separated list of capability names that users must match to be included in results. Note that this is an inclusive list: users must match *each* capability.
    Does NOT work for capabilities not in the database or filtered via ‘map_meta_cap’. Default empty.
  • capability__in string[]
    An array of capability names. Matched users must have at least one of these capabilities.
    Does NOT work for capabilities not in the database or filtered via ‘map_meta_cap’. Default empty array.
  • capability__not_in string[]
    An array of capability names to exclude. Users matching one or more of these capabilities will not be included in results.
    Does NOT work for capabilities not in the database or filtered via ‘map_meta_cap’. Default empty array.

Return

string HTML dropdown list of users.

Source

function wp_dropdown_users( $args = '' ) {
	$defaults = array(
		'show_option_all'         => '',
		'show_option_none'        => '',
		'hide_if_only_one_author' => '',
		'orderby'                 => 'display_name',
		'order'                   => 'ASC',
		'include'                 => '',
		'exclude'                 => '',
		'multi'                   => 0,
		'show'                    => 'display_name',
		'echo'                    => 1,
		'selected'                => 0,
		'name'                    => 'user',
		'class'                   => '',
		'id'                      => '',
		'blog_id'                 => get_current_blog_id(),
		'who'                     => '',
		'include_selected'        => false,
		'option_none_value'       => -1,
		'role'                    => '',
		'role__in'                => array(),
		'role__not_in'            => array(),
		'capability'              => '',
		'capability__in'          => array(),
		'capability__not_in'      => array(),
	);

	$defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0;

	$parsed_args = wp_parse_args( $args, $defaults );

	$query_args = wp_array_slice_assoc(
		$parsed_args,
		array(
			'blog_id',
			'include',
			'exclude',
			'orderby',
			'order',
			'who',
			'role',
			'role__in',
			'role__not_in',
			'capability',
			'capability__in',
			'capability__not_in',
		)
	);

	$fields = array( 'ID', 'user_login' );

	$show = ! empty( $parsed_args['show'] ) ? $parsed_args['show'] : 'display_name';
	if ( 'display_name_with_login' === $show ) {
		$fields[] = 'display_name';
	} else {
		$fields[] = $show;
	}

	$query_args['fields'] = $fields;

	$show_option_all   = $parsed_args['show_option_all'];
	$show_option_none  = $parsed_args['show_option_none'];
	$option_none_value = $parsed_args['option_none_value'];

	/**
	 * Filters the query arguments for the list of users in the dropdown.
	 *
	 * @since 4.4.0
	 *
	 * @param array $query_args  The query arguments for get_users().
	 * @param array $parsed_args The arguments passed to wp_dropdown_users() combined with the defaults.
	 */
	$query_args = apply_filters( 'wp_dropdown_users_args', $query_args, $parsed_args );

	$users = get_users( $query_args );

	$output = '';
	if ( ! empty( $users ) && ( empty( $parsed_args['hide_if_only_one_author'] ) || count( $users ) > 1 ) ) {
		$name = esc_attr( $parsed_args['name'] );
		if ( $parsed_args['multi'] && ! $parsed_args['id'] ) {
			$id = '';
		} else {
			$id = $parsed_args['id'] ? " id='" . esc_attr( $parsed_args['id'] ) . "'" : " id='$name'";
		}
		$output = "<select name='{$name}'{$id} class='" . $parsed_args['class'] . "'>n";

		if ( $show_option_all ) {
			$output .= "t<option value='0'>$show_option_all</option>n";
		}

		if ( $show_option_none ) {
			$_selected = selected( $option_none_value, $parsed_args['selected'], false );
			$output   .= "t<option value='" . esc_attr( $option_none_value ) . "'$_selected>$show_option_none</option>n";
		}

		if ( $parsed_args['include_selected'] && ( $parsed_args['selected'] > 0 ) ) {
			$found_selected          = false;
			$parsed_args['selected'] = (int) $parsed_args['selected'];

			foreach ( (array) $users as $user ) {
				$user->ID = (int) $user->ID;
				if ( $user->ID === $parsed_args['selected'] ) {
					$found_selected = true;
				}
			}

			if ( ! $found_selected ) {
				$selected_user = get_userdata( $parsed_args['selected'] );
				if ( $selected_user ) {
					$users[] = $selected_user;
				}
			}
		}

		foreach ( (array) $users as $user ) {
			if ( 'display_name_with_login' === $show ) {
				/* translators: 1: User's display name, 2: User login. */
				$display = sprintf( _x( '%1$s (%2$s)', 'user dropdown' ), $user->display_name, $user->user_login );
			} elseif ( ! empty( $user->$show ) ) {
				$display = $user->$show;
			} else {
				$display = '(' . $user->user_login . ')';
			}

			$_selected = selected( $user->ID, $parsed_args['selected'], false );
			$output   .= "t<option value='$user->ID'$_selected>" . esc_html( $display ) . "</option>n";
		}

		$output .= '</select>';
	}

	/**
	 * Filters the wp_dropdown_users() HTML output.
	 *
	 * @since 2.3.0
	 *
	 * @param string $output HTML output generated by wp_dropdown_users().
	 */
	$html = apply_filters( 'wp_dropdown_users', $output );

	if ( $parsed_args['echo'] ) {
		echo $html;
	}
	return $html;
}

Hooks

apply_filters( ‘wp_dropdown_users’, string $output )

Filters the wp_dropdown_users() HTML output.

apply_filters( ‘wp_dropdown_users_args’, array $query_args, array $parsed_args )

Filters the query arguments for the list of users in the dropdown.

Changelog

Version Description
5.9.0 Added the 'capability', 'capability__in', and 'capability__not_in' parameters.
Deprecated the 'who' parameter.
4.7.0 Added the 'role', 'role__in', and 'role__not_in' parameters.
4.5.0 Added the 'display_name_with_login' value for 'show'.
2.3.0 Introduced.

User Contributed Notes

  1. Skip to note 6 content

    Query users by role (that work):

    $query_users_ids_by_role = [
    	'fields' => ['id'],
    	'role' => $role
    ];
    
    $array_of_users = get_users( $query_users_ids_by_role );
    
    $array_of_users_ids = array_map(function ($user) {
    	return $user->id;
    }, $array_of_users);
    
    $users_ids_list = implode( ',', $array_of_users_ids );
    
    $query_for_dropdown = [
    	'show_option_all'   => __('All users'),
    	'orderby'           => 'display_name',
    	'order'             => 'ASC',
    	'include'           => $users_ids_list
    ];
    
    wp_dropdown_users($query_for_dropdown);

  2. Skip to note 8 content

    Query users by role:

    $role = 'subscriber';
    
    $query_users_ids_by_role = array(
    	'field' => 'id',
    	'role' => $role
    );
    
    $array_of_users_ids = get_users( $query_users_ids_by_role );
    
    $users_ids_list = implode( ',',$array_of_users_ids );
    
    $query_for_dropdown = array(
        'include' => $user_ids_list,
    );
    
    wp_dropdown_users( $query_for_dropdown );

    * Accumulated from others’ work too.