Multisite Database Tables

WordPress Multisite adds network-level tables and per-site table copies.

Network Tables

These tables exist once per network, typically without a numeric prefix.

wp_blogs

Stores all sites in the network.

ColumnTypeNullDefaultDescription
blog_idbigint(20)NOauto_incrementSite ID
site_idbigint(20)NO0Network ID (FK → wp_site.id)
domainvarchar(200)NOSite domain
pathvarchar(100)NOSite path
registereddatetimeNO0000-00-00 00:00:00Registration date
last_updateddatetimeNO0000-00-00 00:00:00Last update
publictinyint(2)NO1Is public
archivedtinyint(2)NO0Is archived
maturetinyint(2)NO0Is mature content
spamtinyint(2)NO0Is spam
deletedtinyint(2)NO0Is deleted
lang_idint(11)NO0Language ID

Indexes:

  • PRIMARY (blog_id)
  • domain (domain(50), path(5))
  • lang_id (lang_id)

wp_site

Stores network definitions (for multi-network setups).

ColumnTypeNullDefaultDescription
idbigint(20)NOauto_incrementNetwork ID
domainvarchar(200)NONetwork domain
pathvarchar(100)NONetwork path

Indexes:

  • PRIMARY (id)
  • domain (domain(140), path(51))

wp_sitemeta

Network-wide options (like wp_options but for the network).

ColumnTypeNullDefaultDescription
meta_idbigint(20)NOauto_incrementUnique ID
site_idbigint(20)NO0Network ID
meta_keyvarchar(255)YESNULLOption name
meta_valuelongtextYESNULLOption value

Indexes:

  • PRIMARY (meta_id)
  • meta_key (meta_key(191))
  • site_id (site_id)

Common sitemeta keys:

  • site_name – Network name
  • admin_email – Super admin email
  • active_sitewide_plugins – Network-activated plugins
  • site_admins – Super admin usernames
  • registration – Registration settings
  • blog_upload_space – Upload quota per site

wp_blogmeta

Per-site metadata (added WordPress 5.1).

ColumnTypeNullDefaultDescription
meta_idbigint(20) unsignedNOauto_incrementUnique ID
blog_idbigint(20)NO0Site ID
meta_keyvarchar(255)YESNULLMeta key
meta_valuelongtextYESNULLMeta value

Indexes:

  • PRIMARY (meta_id)
  • meta_key (meta_key(191))
  • blog_id (blog_id)

wp_registration_log

User registration log (legacy).

ColumnTypeNullDefaultDescription
IDbigint(20)NOauto_incrementLog ID
emailvarchar(255)NOEmail used
IPvarchar(30)NOIP address
blog_idbigint(20)NO0Site registered on
date_registereddatetimeNO0000-00-00 00:00:00Registration date

wp_signups

Pending user/site signups awaiting activation.

ColumnTypeNullDefaultDescription
signup_idbigint(20)NOauto_incrementSignup ID
domainvarchar(200)NORequested domain
pathvarchar(100)NORequested path
titlelongtextNONULLRequested site title
user_loginvarchar(60)NOUsername
user_emailvarchar(100)NOEmail
registereddatetimeNO0000-00-00 00:00:00Signup date
activateddatetimeNO0000-00-00 00:00:00Activation date
activetinyint(1)NO0Is activated
activation_keyvarchar(50)NOActivation key
metalongtextYESNULLSignup metadata

Per-Site Tables

Each site in a multisite network gets its own set of core tables with a numeric prefix:

Main SiteSite 2Site 3
wp_postswp_2_postswp_3_posts
wp_postmetawp_2_postmetawp_3_postmeta
wp_commentswp_2_commentswp_3_comments
wp_commentmetawp_2_commentmetawp_3_commentmeta
wp_termswp_2_termswp_3_terms
wp_termmetawp_2_termmetawp_3_termmeta
wp_term_taxonomywp_2_term_taxonomywp_3_term_taxonomy
wp_term_relationshipswp_2_term_relationshipswp_3_term_relationships
wp_optionswp_2_optionswp_3_options
wp_linkswp_2_linkswp_3_links

Shared Tables

These tables are shared across all sites:

  • wp_users – Single user table for entire network
  • wp_usermeta – User meta with per-site capabilities

Per-site user capabilities:

wp_capabilities     → Main site roles
wp_2_capabilities   → Site 2 roles
wp_3_capabilities   → Site 3 roles

Common Queries

List all sites

sql
SELECT blog_id, domain, path, registered 
FROM wp_blogs 
WHERE deleted = 0 AND spam = 0 
ORDER BY blog_id;

Get site by domain

sql
SELECT * FROM wp_blogs 
WHERE domain = 'example.com' 
  AND path = '/';

Get network options

sql
SELECT meta_key, meta_value 
FROM wp_sitemeta 
WHERE site_id = 1;

Get super admins

sql
SELECT meta_value 
FROM wp_sitemeta 
WHERE meta_key = 'site_admins';

Count posts across all sites

sql
SELECT 
  b.blog_id,
  b.domain,
  (SELECT COUNT(*) FROM CONCAT('wp_', IF(b.blog_id=1,'','2_'), 'posts') 
   WHERE post_status='publish') as post_count
FROM wp_blogs b
WHERE b.deleted = 0;
-- Note: Dynamic table names require procedural code

Get users for a specific site

sql
SELECT u.* 
FROM wp_users u
JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.meta_key = 'wp_2_capabilities';

WordPress API Functions

  • get_sites( $args ) – Get sites
  • get_site( $site_id ) – Get single site
  • get_blog_details( $blog_id ) – Get site details
  • get_current_blog_id() – Current site ID
  • switch_to_blog( $blog_id ) – Switch context
  • restore_current_blog() – Restore context
  • is_multisite() – Check if multisite
  • get_network_option( $network_id, $option ) – Get sitemeta
  • update_network_option( $network_id, $option, $value ) – Update sitemeta
  • get_blog_option( $blog_id, $option ) – Get site option
  • add_blog_meta( $blog_id, $key, $value ) – Add blogmeta
  • get_blog_meta( $blog_id, $key, $single ) – Get blogmeta

Table Prefix in Multisite

php
global $wpdb;

// Current site prefix (e.g., "wp_" or "wp_2_")
$wpdb->prefix;

// Base prefix (always "wp_")
$wpdb->base_prefix;

// Get prefix for specific site
$wpdb->get_blog_prefix( $blog_id );