wp_usermeta

Key-value storage for user metadata. Stores capabilities, preferences, and custom user data.

Schema

ColumnTypeNullDefaultDescription
umeta_idbigint(20) unsignedNOauto_incrementUnique identifier for the meta entry
user_idbigint(20) unsignedNO0Associated user ID (FK → wp_users.ID)
meta_keyvarchar(255)YESNULLMeta key name
meta_valuelongtextYESNULLMeta value (can be serialized)

Indexes

Key NameColumnsUniquePurpose
PRIMARYumeta_idYesPrimary key
user_iduser_idNoAll meta for a user
meta_keymeta_key(191)NoLookup by key name

Foreign Key Relationships

  • user_idwp_users.ID (the user this meta belongs to)

Core Meta Keys

Authentication & Capabilities

KeyDescription
wp_capabilitiesSerialized array of role(s) → true
wp_user_levelDeprecated numeric user level (0-10)
session_tokensActive login sessions

Profile Information

KeyDescription
nicknameUser’s nickname
first_nameFirst name
last_nameLast name
descriptionBiographical info

Preferences

KeyDescription
admin_colorAdmin color scheme
use_sslForce SSL on admin
show_admin_bar_frontShow admin bar on frontend
localeUser-specific locale
rich_editingUse visual editor
syntax_highlightingCode syntax highlighting
comment_shortcutsKeyboard shortcuts for comments

Dashboard & Admin

KeyDescription
dismissed_wp_pointersDismissed admin pointers
wp_dashboard_quick_press_last_post_idQuick Draft post ID
community-events-locationDashboard events location
closedpostboxes_*Collapsed metaboxes
metaboxhidden_*Hidden metaboxes
screen_layout_*Screen column layout

Capabilities Format

php
// wp_capabilities value (serialized)
a:1:{s:13:"administrator";b:1;}

// Decoded
['administrator' => true]

Common Queries

Get all meta for a user

sql
SELECT meta_key, meta_value 
FROM wp_usermeta 
WHERE user_id = 1;

Get specific meta value

sql
SELECT meta_value 
FROM wp_usermeta 
WHERE user_id = 1 
  AND meta_key = 'first_name';

Get all administrators

sql
SELECT u.* 
FROM wp_users u
JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.meta_key = 'wp_capabilities' 
  AND um.meta_value LIKE '%administrator%';

Get users with specific meta

sql
SELECT u.*, um.meta_value as custom_field
FROM wp_users u
JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.meta_key = 'my_custom_field';

Delete orphaned usermeta

sql
DELETE um FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL;

Count users by role

sql
SELECT 
  CASE 
    WHEN meta_value LIKE '%administrator%' THEN 'administrator'
    WHEN meta_value LIKE '%editor%' THEN 'editor'
    WHEN meta_value LIKE '%author%' THEN 'author'
    WHEN meta_value LIKE '%contributor%' THEN 'contributor'
    WHEN meta_value LIKE '%subscriber%' THEN 'subscriber'
    ELSE 'other'
  END as role,
  COUNT(*) as count
FROM wp_usermeta
WHERE meta_key = 'wp_capabilities'
GROUP BY role;

WordPress API Functions

  • get_user_meta( $user_id, $key, $single ) – Get meta value(s)
  • add_user_meta( $user_id, $key, $value, $unique ) – Add meta
  • update_user_meta( $user_id, $key, $value ) – Update meta
  • delete_user_meta( $user_id, $key, $value ) – Delete meta
  • get_user_option( $option, $user_id ) – Get user option
  • update_user_option( $user_id, $option, $value ) – Update user option

Multisite Notes

In multisite, capabilities use the blog prefix:

  • wp_capabilities → single site or main site
  • wp_2_capabilities → site ID 2
  • wp_3_capabilities → site ID 3

The {$prefix}_user_level follows the same pattern.

Performance Notes

  • Session tokens can grow large with many active sessions
  • Stale session data should be periodically cleaned
  • Use get_user_meta() with $single = true when expecting one value