User Debug page. */ public function register_debug_page() { add_management_page( esc_html__( 'User Debug', 'user-id' ), esc_html__( 'User Debug', 'user-id' ), 'manage_options', 'user-id-debug', array( $this, 'render_page' ) ); } /** * Render the User Debug page. */ public function render_page() { if ( ! current_user_can( 'manage_options' ) ) { return; } // phpcs:ignore WordPress.Security.NonceVerification.Recommended $search_query = isset( $_GET['user_search_query'] ) ? sanitize_text_field( wp_unslash( $_GET['user_search_query'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $target_user_id = isset( $_GET['user_id'] ) ? intval( wp_unslash( $_GET['user_id'] ) ) : 0; $user_list = false; // Perform deep search if query provided and no distinct target yet OR target provided if ( ! empty( $search_query ) && ! $target_user_id ) { $user_list = $this->perform_deep_search( $search_query ); // If only 1 user found, auto select them if ( count( $user_list ) === 1 ) { $target_user_id = $user_list[0]->ID; $user_list = false; // clear list mode since we mapped to a single user } } echo '
'; echo '

' . esc_html__( 'User Debug & Support', 'user-id' ) . '

'; $this->render_search_form( $search_query ); // Show List if multiple users found, otherwise show specific user if ( $user_list !== false ) { $this->render_search_results( $user_list ); } elseif ( $target_user_id ) { $user = get_userdata( $target_user_id ); if ( $user ) { $this->render_user_inspector( $user ); } else { echo '

' . esc_html__( 'User not found.', 'user-id' ) . '

'; } } else { echo '

' . esc_html__( 'Enter a user ID, email, username, or search term to discover users.', 'user-id' ) . '

'; } echo '
'; } /** * Perform deep search across ID, email, username, and user meta. * * @param string $query Query string. * @return WP_User[] */ private function perform_deep_search( $query ) { // If query is an ID if ( is_numeric( $query ) ) { $user = get_userdata( intval( $query ) ); if ( $user ) { return array( $user ); } } // WP_User_Query using search $args = array( 'search' => '*' . $query . '*', 'search_columns' => array( 'user_login', 'user_email', 'user_nicename', ), 'number' => 50, ); $user_query = new WP_User_Query( $args ); $results = $user_query->get_results(); // If nothing found in standard fields, deep dive into meta if ( empty( $results ) ) { global $wpdb; // Warning: potentially heavy query, limited to 50 $like = '%' . $wpdb->esc_like( $query ) . '%'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $sql = $wpdb->prepare( " SELECT DISTINCT user_id FROM " . $wpdb->usermeta . " WHERE meta_value LIKE %s LIMIT 50 ", $like ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared $meta_user_ids = $wpdb->get_col( $sql ); if ( ! empty( $meta_user_ids ) ) { $meta_args = array( 'include' => $meta_user_ids, 'number' => 50, ); $meta_query = new WP_User_Query( $meta_args ); $results = $meta_query->get_results(); } } return $results; } /** * Render search form UI. */ private function render_search_form( $current_query ) { ?>

' . esc_html__( 'No users found matching that query.', 'user-id' ) . '

'; return; } echo '

' . esc_html__( 'Search Results', 'user-id' ) . '

'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; foreach ( $users as $u ) { $inspect_url = admin_url( 'tools.php?page=user-id-debug&user_id=' . $u->ID ); $roles = ! empty( $u->roles ) ? implode( ', ', $u->roles ) : '-'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } echo '
' . esc_html__( 'ID', 'user-id' ) . '' . esc_html__( 'Username', 'user-id' ) . '' . esc_html__( 'Email', 'user-id' ) . '' . esc_html__( 'Roles', 'user-id' ) . '' . esc_html__( 'Actions', 'user-id' ) . '
' . esc_html( $u->ID ) . '' . esc_html( $u->user_login ) . '' . esc_html( $u->user_email ) . '' . esc_html( $roles ) . '' . esc_html__( 'Inspect User', 'user-id' ) . '
'; } /** * Render specific user inspector. * * @param WP_User $user Target user object. */ private function render_user_inspector( $user ) { $roles = ! empty( $user->roles ) ? implode( ', ', $user->roles ) : 'None'; $edit_link = get_edit_user_link( $user->ID ); ?>

allcaps ) ? array_keys( array_filter( $user->allcaps ) ) : array(); if ( empty( $caps ) ) { esc_html_e( 'No specific capabilities.', 'user-id' ); } else { $caps_list = array_map(function($cap) { return '' . esc_html($cap) . ''; }, $caps); echo wp_kses_post( implode( ', ', $caps_list ) ); } ?>

render_meta_table( $user->ID ); ?>
ID ); } /** * Render safe meta table block. */ private function render_meta_table( $user_id ) { $all_meta = get_user_meta( $user_id ); /** * Filter user_meta keys to be retrieved. * By default empty allows all. * * @param array $meta_keys Array of valid meta keys. */ $allowed_keys = apply_filters( 'user_id_meta_keys', array() ); if ( empty( $all_meta ) ) { echo '

' . esc_html__( 'No meta found.', 'user-id' ) . '

'; return; } echo ''; echo ''; echo ''; ksort( $all_meta ); foreach ( $all_meta as $key => $values ) { if ( ! empty( $allowed_keys ) && ! in_array( $key, $allowed_keys, true ) ) { continue; } $value = maybe_unserialize( $values[0] ); // Attempt to decode JSON strings if ( is_string( $value ) && isset( $value[0] ) && in_array( $value[0], array( '{', '[' ), true ) ) { $json = json_decode( $value, true ); if ( json_last_error() === JSON_ERROR_NONE ) { $value = $json; } } if ( is_array( $value ) || is_object( $value ) ) { $display_value = '
' . esc_html( wp_json_encode( $value, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ) . '
'; } elseif ( is_bool( $value ) || $value === 'true' || $value === 'false' ) { $is_true = is_bool( $value ) ? $value : ( $value === 'true' ); $badge_color = $is_true ? '#00a32a' : '#d63638'; $display_value = '' . ( $is_true ? 'true' : 'false' ) . ''; } elseif ( $value === '' ) { $display_value = '(' . esc_html__( 'empty', 'user-id' ) . ')'; } else { $display_value = esc_html( $value ); } echo ''; echo ''; echo ''; echo ''; } echo '
' . esc_html__( 'Meta Key', 'user-id' ) . '' . esc_html__( 'Meta Value / Data', 'user-id' ) . '
' . esc_html( $key ) . '' . wp_kses_post( $display_value ) . '
'; } } new User_ID_User_Debug();