get_names();
if ( '' === $role || ! isset( $roles[ $role ] ) ) {
return new WP_Error(
'desktop_mode_agent_invalid_role',
__( 'Pick a valid WordPress role for the agent.', 'desktop-mode' )
);
}
if ( '' === $slug ) {
$slug = sanitize_title( $name );
}
if ( '' === $slug ) {
return new WP_Error(
'desktop_mode_agent_invalid_slug',
__( 'Agent slug could not be derived from the name.', 'desktop-mode' )
);
}
$user_id = wp_insert_user(
array(
'user_login' => desktop_mode_agent_resolve_unique_login( $slug ),
'user_email' => desktop_mode_agent_synthetic_email( $slug ),
'user_pass' => wp_generate_password( 64, true, true ),
'display_name' => $name,
'nickname' => $name,
'role' => $role,
'show_admin_bar_front' => false,
)
);
if ( is_wp_error( $user_id ) ) {
return $user_id;
}
update_user_meta( $user_id, DESKTOP_MODE_AGENT_USER_MARKER_META, '1' );
return new WP_User( $user_id );
}
/**
* Delete an agent user. Definition meta rows die with the user
* (`wp_delete_user()` removes all usermeta). Content the agent
* authored is NOT reassigned — pass a reassign id when the caller
* wants to keep it.
*
* @param int $user_id Agent user id.
* @param int|null $reassign Optional user id to reassign authored content to.
* @return true|WP_Error
*/
function desktop_mode_agent_delete( $user_id, $reassign = null ) {
if ( ! desktop_mode_agent_is_agent( $user_id ) ) {
return new WP_Error(
'desktop_mode_agent_not_an_agent',
__( 'User is not a Desktop Mode agent.', 'desktop-mode' )
);
}
if ( ! function_exists( 'wp_delete_user' ) ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
}
$deleted = wp_delete_user( (int) $user_id, $reassign );
if ( ! $deleted ) {
return new WP_Error(
'desktop_mode_agent_delete_failed',
__( 'Could not delete the agent user.', 'desktop-mode' )
);
}
/**
* Fires after an agent is deleted.
*
* @param int $user_id Agent user id (row no longer exists when this fires).
* @param int $actor_id User who deleted the agent.
*/
do_action( 'desktop_mode_agent_deleted', (int) $user_id, get_current_user_id() );
return true;
}
// ---------------------------------------------------------------------------
// Identity surface
// ---------------------------------------------------------------------------
/**
* URL of the bot avatar as a real static file.
*
* The avatar MUST be a file URL, not the data URI: consumers routinely
* run avatar URLs through `esc_url()` (wp-admin's `get_avatar()`, the
* desktop user-tile renderer), and `data` is not in
* `wp_allowed_protocols()` — the data URI silently becomes an empty
* string and the avatar renders broken.
*
* @return string
*/
function desktop_mode_agent_avatar_url() {
return DESKTOP_MODE_URL . 'assets/images/agent-avatar.svg';
}
/**
* Substitute the bot glyph for agent avatars across the WP admin.
*
* @param array $args Args being assembled by `get_avatar_data()`.
* @param int|string|WP_User|WP_Comment $id_or_email Identifier the caller passed.
* @return array
*/
function desktop_mode_agent_avatar( $args, $id_or_email ) {
$user_id = 0;
if ( is_numeric( $id_or_email ) ) {
$user_id = (int) $id_or_email;
} elseif ( $id_or_email instanceof WP_User ) {
$user_id = (int) $id_or_email->ID;
} elseif ( $id_or_email instanceof WP_Comment ) {
$user_id = (int) $id_or_email->user_id;
} elseif ( is_string( $id_or_email ) && is_email( $id_or_email ) ) {
$user = get_user_by( 'email', $id_or_email );
if ( $user ) {
$user_id = (int) $user->ID;
}
}
if ( $user_id > 0 && desktop_mode_agent_is_agent( $user_id ) ) {
$args['url'] = desktop_mode_agent_avatar_url();
$args['found_avatar'] = true;
}
return $args;
}
add_filter( 'pre_get_avatar_data', 'desktop_mode_agent_avatar', 10, 2 );
/**
* Add a "Type" column to the wp-admin Users list that labels agents.
*
* @param string[] $columns Existing column id => label map.
* @return string[]
*/
function desktop_mode_agent_users_columns( $columns ) {
$columns['desktop_mode_agent_type'] = __( 'Type', 'desktop-mode' );
return $columns;
}
add_filter( 'manage_users_columns', 'desktop_mode_agent_users_columns' );
/**
* Render the cell for the "Type" column.
*
* @param string $output Existing rendered HTML.
* @param string $column_name Column id.
* @param int $user_id User id being rendered.
* @return string
*/
function desktop_mode_agent_users_custom_column( $output, $column_name, $user_id ) {
if ( 'desktop_mode_agent_type' !== $column_name ) {
return $output;
}
if ( desktop_mode_agent_is_agent( $user_id ) ) {
return ''
. ' '
. esc_html__( 'Agent', 'desktop-mode' )
. '';
}
return '' . esc_html__( 'Person', 'desktop-mode' ) . '';
}
add_filter( 'manage_users_custom_column', 'desktop_mode_agent_users_custom_column', 10, 3 );