WP_Session_Tokens::destroy() 问题:调用无效果,如何删除指定会话?
WordPress 如何正确销毁指定会话
你之前的代码无效,是因为WP_Session_Tokens::destroy()方法的参数不是数组索引(比如0),而是会话对应的token字符串。直接传0会因为找不到匹配的token而执行失败。
一、获取指定会话的token并销毁
要删除指定会话,首先需要获取该会话对应的token。可以通过get_all()方法获取当前用户的所有会话数据,这个方法返回的数组中,键就是会话token,值是包含会话详情(如登录时间、用户代理、过期时间)的数组。
示例1:删除第一个会话(对应你想删的"索引0"会话)
$user_id = get_current_user_id(); $manager = WP_Session_Tokens::get_instance($user_id); $all_sessions = $manager->get_all(); if (!empty($all_sessions)) { // 获取第一个会话的token(PHP 7.3+ 可用array_key_first) $target_token = array_key_first($all_sessions); // 兼容PHP 7.2及以下版本的写法: // reset($all_sessions); // $target_token = key($all_sessions); // 销毁该会话 $manager->destroy($target_token); }
示例2:根据会话特征删除指定会话
如果需要根据会话的具体信息(比如用户代理、登录时间)删除,可以遍历会话数组匹配目标:
$user_id = get_current_user_id(); $manager = WP_Session_Tokens::get_instance($user_id); $all_sessions = $manager->get_all(); // 比如删除匹配特定用户代理的会话 $target_user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'; foreach ($all_sessions as $token => $session_data) { // 会话数据中的`ua`字段存储了用户代理信息 if (strpos($session_data['ua'], $target_user_agent) !== false) { $manager->destroy($token); break; // 找到匹配项后停止遍历,如需删除所有匹配项可去掉此句 } }
二、额外补充:销毁当前会话
如果你的需求是销毁当前用户正在使用的会话,可以直接使用destroy_current()方法,无需手动获取token:
$user_id = get_current_user_id(); $manager = WP_Session_Tokens::get_instance($user_id); $manager->destroy_current();
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

