如何获取含日期/时间的用户角色变更历史
获取WordPress用户角色变更历史的方法
默认情况下,WordPress不会自动记录用户角色的变更历史(含日期/时间),但可以通过以下两种方式实现需求:
一、自定义开发实现记录
通过WordPress的钩子函数,在角色发生变更时触发日志记录操作,推荐将数据存储到自定义数据库表中:
- 创建自定义日志表
执行以下SQL语句(可通过phpMyAdmin或代码执行)创建存储角色变更记录的表:
CREATE TABLE wp_user_role_history ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, old_roles TEXT NOT NULL, new_roles TEXT NOT NULL, change_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES wp_users(ID) ON DELETE CASCADE );
- 添加钩子函数记录变更
在主题的functions.php文件或自定义插件中添加以下代码:
// 记录角色添加操作 add_action('user_role_added', 'log_user_role_change', 10, 2); // 记录角色移除操作 add_action('user_role_removed', 'log_user_role_change', 10, 2); function log_user_role_change($role, $user_id) { $user = get_userdata($user_id); $old_roles = implode(',', $user->roles); // 延迟获取新角色,确保变更已生效 wp_schedule_single_event(time() + 1, 'log_final_role_change', array($user_id, $old_roles)); } add_action('log_final_role_change', 'log_final_role_change_callback', 10, 2); function log_final_role_change_callback($user_id, $old_roles) { $user = get_userdata($user_id); $new_roles = implode(',', $user->roles); global $wpdb; $table_name = $wpdb->prefix . 'user_role_history'; $wpdb->insert( $table_name, array( 'user_id' => $user_id, 'old_roles' => $old_roles, 'new_roles' => $new_roles, 'change_time' => current_time('mysql') ), array('%d', '%s', '%s', '%s') ); }
- 查询角色变更记录
使用以下代码可以获取指定用户的角色变更历史:
function get_user_role_history($user_id) { global $wpdb; $table_name = $wpdb->prefix . 'user_role_history'; $results = $wpdb->get_results($wpdb->prepare( "SELECT * FROM $table_name WHERE user_id = %d ORDER BY change_time ASC", $user_id )); return $results; } // 示例:获取用户ID为1的角色历史 $role_history = get_user_role_history(1); foreach ($role_history as $record) { echo "用户{$record->user_id} 在 {$record->change_time} 从【{$record->old_roles}】变更为【{$record->new_roles}】<br>"; }
二、使用现成插件
如果不想自定义开发,可以使用成熟的活动日志插件自动记录角色变更:
- Simple History:轻量级插件,会记录用户角色变更、用户创建等操作,自带日志查看界面
- WP Activity Log:功能更全面的日志插件,支持详细的角色变更追踪,可按用户筛选记录
这些插件会自动处理日志存储和展示,无需编写代码即可查看带时间戳的角色变更历史。
内容的提问来源于stack exchange,提问作者IUK
相关产品推荐
相关产品推荐

