函数文档

wp_ajax_autocomplete_user()

💡 云策文档标注

概述

wp_ajax_autocomplete_user() 是一个用于处理用户自动补全的 AJAX 函数,主要应用于 WordPress 多站点环境。它通过检查用户权限和网络规模,并根据请求参数返回匹配的用户列表。

关键要点

  • 函数仅在多站点环境中可用,且当前用户需具备 'promote_users' 权限,否则会调用 wp_die() 终止执行。
  • 支持两种请求类型:'add'(默认)和 'search',分别用于添加用户和搜索用户。
  • 支持两种字段类型:'user_login'(默认)和 'user_email',用于指定返回值的字段。
  • 通过 get_users() 函数检索用户,可基于站点 ID、搜索词和包含/排除条件进行过滤。
  • 返回格式为 JSON 数组,包含 'label'(用户登录名和邮箱)和 'value'(指定字段值)。
  • 使用 apply_filters('autocomplete_users_for_site_admins', bool $enable) 钩子允许非超级管理员在多站点中使用自动补全功能。

代码示例

// 示例 AJAX 请求参数
$params = array(
    'autocomplete_type' => 'search',
    'autocomplete_field' => 'user_email',
    'term' => 'example',
    'site_id' => 1
);
// 函数内部会处理这些参数并返回匹配的用户列表

注意事项

  • 如果网络用户数量过大(通过 wp_is_large_network('users') 检测),函数会终止执行。
  • 在多站点中,非超级管理员默认无法使用此功能,除非通过过滤器启用。
  • 函数使用 wp_die() 输出 JSON 响应,确保前端 AJAX 调用能正确处理返回数据。

📄 原文内容

Handles user autocomplete via AJAX.

Source

function wp_ajax_autocomplete_user() {
	if ( ! is_multisite() || ! current_user_can( 'promote_users' ) || wp_is_large_network( 'users' ) ) {
		wp_die( -1 );
	}

	/** This filter is documented in wp-admin/user-new.php */
	if ( ! current_user_can( 'manage_network_users' ) && ! apply_filters( 'autocomplete_users_for_site_admins', false ) ) {
		wp_die( -1 );
	}

	$return = array();

	/*
	 * Check the type of request.
	 * Current allowed values are `add` and `search`.
	 */
	if ( isset( $_REQUEST['autocomplete_type'] ) && 'search' === $_REQUEST['autocomplete_type'] ) {
		$type = $_REQUEST['autocomplete_type'];
	} else {
		$type = 'add';
	}

	/*
	 * Check the desired field for value.
	 * Current allowed values are `user_email` and `user_login`.
	 */
	if ( isset( $_REQUEST['autocomplete_field'] ) && 'user_email' === $_REQUEST['autocomplete_field'] ) {
		$field = $_REQUEST['autocomplete_field'];
	} else {
		$field = 'user_login';
	}

	// Exclude current users of this blog.
	if ( isset( $_REQUEST['site_id'] ) ) {
		$id = absint( $_REQUEST['site_id'] );
	} else {
		$id = get_current_blog_id();
	}

	$include_blog_users = ( 'search' === $type ? get_users(
		array(
			'blog_id' => $id,
			'fields'  => 'ID',
		)
	) : array() );

	$exclude_blog_users = ( 'add' === $type ? get_users(
		array(
			'blog_id' => $id,
			'fields'  => 'ID',
		)
	) : array() );

	$users = get_users(
		array(
			'blog_id'        => false,
			'search'         => '*' . $_REQUEST['term'] . '*',
			'include'        => $include_blog_users,
			'exclude'        => $exclude_blog_users,
			'search_columns' => array( 'user_login', 'user_nicename', 'user_email' ),
		)
	);

	foreach ( $users as $user ) {
		$return[] = array(
			/* translators: 1: User login, 2: User email address. */
			'label' => sprintf( _x( '%1$s (%2$s)', 'user autocomplete result' ), $user->user_login, $user->user_email ),
			'value' => $user->$field,
		);
	}

	wp_die( wp_json_encode( $return ) );
}

Hooks

apply_filters( ‘autocomplete_users_for_site_admins’, bool $enable )

Filters whether to enable user auto-complete for non-super admins in Multisite.

Changelog

Version Description
3.4.0 Introduced.