wp_ajax_destroy_sessions()
云策文档标注
概述
wp_ajax_destroy_sessions() 是一个 WordPress AJAX 处理函数,用于销毁用户的多个开放会话。它通过验证用户权限和非ce,调用 WP_Session_Tokens 类来管理会话销毁,并返回 JSON 响应。
关键要点
- 函数通过 AJAX 处理用户会话销毁,支持销毁当前用户的其他会话或指定用户的所有会话。
- 使用 get_userdata() 获取用户数据,并通过 current_user_can() 和 wp_verify_nonce() 进行权限和安全验证。
- 根据当前用户与目标用户是否相同,调用 WP_Session_Tokens::destroy_others() 或 destroy_all() 方法。
- 返回 JSON 响应,使用 wp_send_json_success() 或 wp_send_json_error() 指示操作结果。
代码示例
function wp_ajax_destroy_sessions() {
$user = get_userdata( (int) $_POST['user_id'] );
if ( $user ) {
if ( ! current_user_can( 'edit_user', $user->ID ) ) {
$user = false;
} elseif ( ! wp_verify_nonce( $_POST['nonce'], 'update-user_' . $user->ID ) ) {
$user = false;
}
}
if ( ! $user ) {
wp_send_json_error(
array(
'message' => __( 'Could not log out user sessions. Please try again.' ),
)
);
}
$sessions = WP_Session_Tokens::get_instance( $user->ID );
if ( get_current_user_id() === $user->ID ) {
$sessions->destroy_others( wp_get_session_token() );
$message = __( 'You are now logged out everywhere else.' );
} else {
$sessions->destroy_all();
/* translators: %s: User's display name. */
$message = sprintf( __( '%s has been logged out.' ), $user->display_name );
}
wp_send_json_success( array( 'message' => $message ) );
}注意事项
- 函数依赖于 POST 参数 user_id 和 nonce,需确保前端正确传递这些数据。
- 权限检查使用 'edit_user' 能力,确保当前用户有编辑目标用户的权限。
- 非ce验证基于用户 ID,防止 CSRF 攻击。
- 销毁会话时区分当前用户和其他用户,避免意外注销当前会话。
原文内容
Handles destroying multiple open sessions for a user via AJAX.
Source
function wp_ajax_destroy_sessions() {
$user = get_userdata( (int) $_POST['user_id'] );
if ( $user ) {
if ( ! current_user_can( 'edit_user', $user->ID ) ) {
$user = false;
} elseif ( ! wp_verify_nonce( $_POST['nonce'], 'update-user_' . $user->ID ) ) {
$user = false;
}
}
if ( ! $user ) {
wp_send_json_error(
array(
'message' => __( 'Could not log out user sessions. Please try again.' ),
)
);
}
$sessions = WP_Session_Tokens::get_instance( $user->ID );
if ( get_current_user_id() === $user->ID ) {
$sessions->destroy_others( wp_get_session_token() );
$message = __( 'You are now logged out everywhere else.' );
} else {
$sessions->destroy_all();
/* translators: %s: User's display name. */
$message = sprintf( __( '%s has been logged out.' ), $user->display_name );
}
wp_send_json_success( array( 'message' => $message ) );
}
Changelog
| Version | Description |
|---|---|
| 4.1.0 | Introduced. |