class wpdb
WordPress database access abstraction class.
Since: 0.71
Source: wp-includes/class-wpdb.php
Overview
The wpdb class provides methods for interacting with the WordPress database. A global instance $wpdb is available throughout WordPress.
global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM {$wpdb->posts}" );
Properties
Table Name Properties (Per-Site)
These properties contain the prefixed table names for per-site tables.
| Property | Type | Since | Description |
|---|---|---|---|
$posts |
string | 1.5.0 | Posts table |
$postmeta |
string | 1.5.0 | Post metadata table |
$comments |
string | 1.5.0 | Comments table |
$commentmeta |
string | 2.9.0 | Comment metadata table |
$terms |
string | 2.3.0 | Terms table |
$term_taxonomy |
string | 2.3.0 | Term taxonomy table |
$term_relationships |
string | 2.3.0 | Term relationships table |
$termmeta |
string | 4.4.0 | Term metadata table |
$options |
string | 1.5.0 | Options table |
$links |
string | 1.5.0 | Links table |
Table Name Properties (Global)
Global tables shared across multisite.
| Property | Type | Since | Description |
|---|---|---|---|
$users |
string | 1.5.0 | Users table |
$usermeta |
string | 2.3.0 | User metadata table |
Table Name Properties (Multisite Global)
Multisite-only global tables.
| Property | Type | Since | Description |
|---|---|---|---|
$blogs |
string|null | 3.0.0 | Blogs table |
$blogmeta |
string|null | 5.1.0 | Blog metadata table |
$site |
string|null | 3.0.0 | Sites table |
$sitemeta |
string|null | 3.0.0 | Site metadata table |
$signups |
string|null | 3.0.0 | Signups table |
$registration_log |
string|null | 3.0.0 | Registration log table |
$sitecategories |
string|null | 3.0.0 | Sitewide terms table (deprecated) |
Table List Arrays
| Property | Type | Since | Description |
|---|---|---|---|
$tables |
string[] | 2.5.0 | List of per-site table names (unprefixed) |
$global_tables |
string[] | 3.0.0 | List of global table names |
$ms_global_tables |
string[] | 3.0.0 | List of multisite global table names |
$old_tables |
string[] | 2.9.0 | List of deprecated table names |
$old_ms_global_tables |
string[] | 6.1.0 | List of deprecated MS global table names |
Prefix Properties
| Property | Type | Since | Description |
|---|---|---|---|
$prefix |
string | 2.5.0 | Current table prefix (includes blog ID in multisite) |
$base_prefix |
string | 3.0.0 | Base table prefix (without blog ID) |
Query State Properties
| Property | Type | Since | Description |
|---|---|---|---|
$last_query |
string | 0.71 | The last SQL query executed |
$last_result |
stdClass[]|null | 0.71 | Results from the last query |
$last_error |
string | 2.5.0 | Error message from the last query |
$num_queries |
int | 1.2.0 | Total number of queries executed |
$num_rows |
int | 0.71 | Number of rows returned by last SELECT |
$rows_affected |
int | 0.71 | Number of rows affected by last query |
$insert_id |
int | 0.71 | AUTO_INCREMENT ID from last INSERT |
$func_call |
string | 3.0.0 | Description of last query call |
Query Logging
| Property | Type | Since | Description |
|---|---|---|---|
$queries |
array[] | 1.5.0 | Log of executed queries (when SAVEQUERIES enabled) |
Each query log entry is an array: [ SQL, time, caller, start_time, custom_data ]
Error Handling Properties
| Property | Type | Since | Description |
|---|---|---|---|
$show_errors |
bool | 0.71 | Whether to display SQL errors |
$suppress_errors |
bool | 2.5.0 | Whether to suppress errors during bootstrap |
$error |
WP_Error|string | 2.5.0 | Last SQL error encountered |
Connection Properties
| Property | Type | Since | Description |
|---|---|---|---|
$ready |
bool | 2.3.2 | Whether connection is ready for queries |
$blogid |
int | 3.0.0 | Current blog ID |
$siteid |
int | 3.0.0 | Current site/network ID |
$is_mysql |
bool | 3.3.0 | Whether using MySQL |
Character Set Properties
| Property | Type | Since | Description |
|---|---|---|---|
$charset |
string | 2.2.0 | Database character set |
$collate |
string | 2.2.0 | Database collation |
$field_types |
array | 2.8.0 | Format specifiers for known columns |
Protected/Private Properties
| Property | Type | Since | Description |
|---|---|---|---|
$dbh |
mysqli|false|null | 0.71 | Database connection handle |
$dbuser |
string | 2.9.0 | Database username |
$dbpassword |
string | 3.1.0 | Database password |
$dbname |
string | 3.1.0 | Database name |
$dbhost |
string | 3.1.0 | Database host |
$result |
mysqli_result|bool|null | 0.71 | Raw query result |
$col_info |
array | 0.71 | Column info from last query |
$col_meta |
array | 4.2.0 | Cached column metadata |
$table_charset |
string[] | 4.2.0 | Cached table charsets |
$reconnect_retries |
int | 3.9.0 | Connection retry attempts (default 5) |
$incompatible_modes |
string[] | 3.9.0 | SQL modes to disable |
$time_start |
float | 1.5.0 | Query timer start time |
Methods
Constructor
__construct()
Creates a database connection.
public function __construct( $dbuser, $dbpassword, $dbname, $dbhost )
| Parameter | Type | Description |
|---|---|---|
$dbuser |
string | Database username |
$dbpassword |
string | Database password |
$dbname |
string | Database name |
$dbhost |
string | Database host |
Note: WordPress creates the global $wpdb instance automatically. Don’t instantiate manually unless creating a secondary connection.
Query Methods
query()
Executes a database query.
public function query( $query ): int|bool
| Parameter | Type | Description |
|---|---|---|
$query |
string | SQL query to execute |
Returns:
int– Number of rows affected/selectedtrue– For CREATE, ALTER, TRUNCATE, DROPfalse– On error
Example:
// SELECT - returns row count
$count = $wpdb->query( "SELECT * FROM {$wpdb->posts}" );
// UPDATE - returns affected rows
$affected = $wpdb->query(
$wpdb->prepare( "UPDATE {$wpdb->posts} SET post_status = %s WHERE ID = %d", 'draft', 123 )
);
// CREATE - returns true
$result = $wpdb->query( "CREATE TABLE my_table (id INT)" );
get_var()
Retrieves a single value from the database.
public function get_var( $query = null, $x = 0, $y = 0 ): string|null
| Parameter | Type | Default | Description |
|---|---|---|---|
$query |
string|null | null | SQL query. Null uses previous result |
$x |
int | 0 | Column index |
$y |
int | 0 | Row index |
Returns: String value or null on failure.
Example:
// Count posts
$count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts}" );
// Get specific value
$title = $wpdb->get_var(
$wpdb->prepare( "SELECT post_title FROM {$wpdb->posts} WHERE ID = %d", 123 )
);
// Get from cached result (different column)
$wpdb->query( "SELECT post_title, post_date FROM {$wpdb->posts} LIMIT 1" );
$title = $wpdb->get_var( null, 0 ); // First column
$date = $wpdb->get_var( null, 1 ); // Second column
get_row()
Retrieves a single row from the database.
public function get_row( $query = null, $output = OBJECT, $y = 0 ): array|object|null|void
| Parameter | Type | Default | Description |
|---|---|---|---|
$query |
string|null | null | SQL query |
$output |
string | OBJECT | Output format: OBJECT, ARRAY_A, ARRAY_N |
$y |
int | 0 | Row to return (0-indexed) |
Returns: Row data or null.
Example:
// As object
$row = $wpdb->get_row(
$wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE ID = %d", 123 )
);
echo $row->post_title;
// As associative array
$row = $wpdb->get_row(
$wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE ID = %d", 123 ),
ARRAY_A
);
echo $row['post_title'];
// As numeric array
$row = $wpdb->get_row(
$wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE ID = %d", 123 ),
ARRAY_N
);
echo $row[0]; // First column
get_col()
Retrieves one column from the database.
public function get_col( $query = null, $x = 0 ): array
| Parameter | Type | Default | Description |
|---|---|---|---|
$query |
string|null | null | SQL query |
$x |
int | 0 | Column to return (0-indexed) |
Returns: Array of values from the specified column.
Example:
// Get all post IDs
$ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'publish'" );
// Returns: array( 1, 2, 3, 4, ... )
// Get second column from cached result
$wpdb->query( "SELECT ID, post_title FROM {$wpdb->posts}" );
$titles = $wpdb->get_col( null, 1 );
get_results()
Retrieves multiple rows from the database.
public function get_results( $query = null, $output = OBJECT ): array|object|null
| Parameter | Type | Default | Description |
|---|---|---|---|
$query |
string|null | null | SQL query |
$output |
string | OBJECT | Output format: OBJECT, OBJECT_K, ARRAY_A, ARRAY_N |
Returns: Array of results or null.
Output Formats:
| Constant | Description |
|---|---|
OBJECT |
Array of row objects |
OBJECT_K |
Associative array keyed by first column value |
ARRAY_A |
Array of associative arrays |
ARRAY_N |
Array of numeric arrays |
Example:
// Array of objects
$posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} LIMIT 10" );
foreach ( $posts as $post ) {
echo $post->post_title;
}
// Keyed by ID
$posts = $wpdb->get_results(
"SELECT ID, post_title FROM {$wpdb->posts}",
OBJECT_K
);
echo $posts[123]->post_title; // Access by ID
// Array of associative arrays
$posts = $wpdb->get_results(
"SELECT * FROM {$wpdb->posts}",
ARRAY_A
);
foreach ( $posts as $post ) {
echo $post['post_title'];
}
Data Manipulation Methods
insert()
Inserts a row into a table.
public function insert( $table, $data, $format = null ): int|false
| Parameter | Type | Description |
|---|---|---|
$table |
string | Table name |
$data |
array | Column => value pairs |
$format |
string[]|string|null | Format for each value (%d, %f, %s) |
Returns: Number of rows inserted (1) or false on error.
Example:
// Basic insert
$wpdb->insert(
$wpdb->postmeta,
array(
'post_id' => 123,
'meta_key' => '_custom_key',
'meta_value' => 'custom_value',
)
);
$meta_id = $wpdb->insert_id;
// With explicit formats
$wpdb->insert(
$wpdb->posts,
array(
'post_title' => 'Hello World',
'post_content' => 'Content here',
'post_status' => 'publish',
'post_author' => 1,
),
array( '%s', '%s', '%s', '%d' )
);
// NULL values
$wpdb->insert(
$wpdb->posts,
array(
'post_title' => 'Title',
'post_parent' => null, // Sets to NULL
)
);
replace()
Replaces a row or inserts if it doesn’t exist (based on PRIMARY KEY or UNIQUE index).
public function replace( $table, $data, $format = null ): int|false
| Parameter | Type | Description |
|---|---|---|
$table |
string | Table name |
$data |
array | Column => value pairs (must include key column) |
$format |
string[]|string|null | Format for each value |
Returns: Number of rows affected (1 for insert, 2 for replace) or false on error.
Example:
// Replace existing or insert new
$wpdb->replace(
$wpdb->options,
array(
'option_name' => 'my_option',
'option_value' => 'new_value',
'autoload' => 'yes',
),
array( '%s', '%s', '%s' )
);
update()
Updates rows in a table.
public function update( $table, $data, $where, $format = null, $where_format = null ): int|false
| Parameter | Type | Description |
|---|---|---|
$table |
string | Table name |
$data |
array | Column => value pairs to update |
$where |
array | Column => value pairs for WHERE clause |
$format |
string[]|string|null | Format for $data values |
$where_format |
string[]|string|null | Format for $where values |
Returns: Number of rows updated or false on error.
Example:
// Update post
$wpdb->update(
$wpdb->posts,
array(
'post_title' => 'New Title',
'post_status' => 'draft',
),
array( 'ID' => 123 ),
array( '%s', '%s' ),
array( '%d' )
);
// Update with NULL in WHERE
$wpdb->update(
$wpdb->posts,
array( 'post_status' => 'trash' ),
array( 'post_parent' => null ) // WHERE post_parent IS NULL
);
delete()
Deletes rows from a table.
public function delete( $table, $where, $where_format = null ): int|false
| Parameter | Type | Description |
|---|---|---|
$table |
string | Table name |
$where |
array | Column => value pairs for WHERE clause |
$where_format |
string[]|string|null | Format for $where values |
Returns: Number of rows deleted or false on error.
Example:
// Delete post meta
$wpdb->delete(
$wpdb->postmeta,
array(
'post_id' => 123,
'meta_key' => '_custom_key',
),
array( '%d', '%s' )
);
// Delete by NULL
$wpdb->delete(
$wpdb->posts,
array( 'post_author' => null ) // WHERE post_author IS NULL
);
Prepared Statement Methods
prepare()
Prepares a SQL query for safe execution.
public function prepare( $query, ...$args ): string|void
| Parameter | Type | Description |
|---|---|---|
$query |
string | Query with placeholders |
...$args |
mixed | Values to substitute |
Placeholders:
| Placeholder | Type | Description |
|---|---|---|
%d |
int | Integer |
%f |
float | Float |
%s |
string | String (auto-quoted) |
%i |
identifier | Table/column name (since 6.2) |
Returns: Sanitized query string.
Example:
// Basic usage
$sql = $wpdb->prepare(
"SELECT * FROM {$wpdb->posts} WHERE ID = %d AND post_status = %s",
123,
'publish'
);
// Array of arguments
$sql = $wpdb->prepare(
"SELECT * FROM {$wpdb->posts} WHERE ID = %d",
array( 123 )
);
// Identifier placeholder
$sql = $wpdb->prepare(
"SELECT * FROM %i WHERE %i = %s",
'my_table',
'my_column',
'value'
);
// Numbered placeholders
$sql = $wpdb->prepare(
"SELECT * FROM {$wpdb->posts} WHERE post_author = %1$d OR post_parent = %1$d",
$user_id
);
// Escaping literal %
$sql = $wpdb->prepare(
"SELECT DATE_FORMAT(post_date, '%%Y-%%m-%%d') FROM {$wpdb->posts} WHERE ID = %d",
123
);
esc_like()
Escapes LIKE wildcards (%, _, ) before using in prepare().
public function esc_like( $text ): string
| Parameter | Type | Description |
|---|---|---|
$text |
string | Raw text to escape |
Returns: Escaped text safe for LIKE.
Example:
$search = '%test_value%';
$like = '%' . $wpdb->esc_like( $search ) . '%';
$sql = $wpdb->prepare(
"SELECT * FROM {$wpdb->posts} WHERE post_title LIKE %s",
$like
);
// Result: WHERE post_title LIKE '%%test_value%%'
Escaping Methods
_real_escape()
Escapes a string using mysqli_real_escape_string().
public function _real_escape( $data ): string
Note: Prefer prepare() over direct escaping.
_escape()
Escapes data (works on arrays).
public function _escape( $data ): string|array
escape_by_ref()
Escapes content by reference.
public function escape_by_ref( &$data ): void
quote_identifier()
Quotes an identifier (table/column name).
public function quote_identifier( $identifier ): string
Since: 6.2.0
Example:
$quoted = $wpdb->quote_identifier( 'table_name' );
// Returns: `table_name`
$quoted = $wpdb->quote_identifier( 'col`name' );
// Returns: `col``name` (backtick escaped)
Table & Prefix Methods
tables()
Returns an array of WordPress table names.
public function tables( $scope = 'all', $prefix = true, $blog_id = 0 ): string[]
| Parameter | Type | Default | Description |
|---|---|---|---|
$scope |
string | ‘all’ | Table scope: ‘all’, ‘blog’, ‘global’, ‘ms_global’, ‘old’ |
$prefix |
bool | true | Whether to include table prefix |
$blog_id |
int | 0 | Blog ID for prefix (multisite) |
Returns: Array of table names.
Example:
// All tables with prefix
$tables = $wpdb->tables();
// array( 'posts' => 'wp_posts', 'comments' => 'wp_comments', ... )
// Blog-specific tables only
$tables = $wpdb->tables( 'blog' );
// Global tables only
$tables = $wpdb->tables( 'global' );
// Without prefixes
$tables = $wpdb->tables( 'all', false );
// array( 'posts', 'comments', 'users', ... )
set_prefix()
Sets the table prefix.
public function set_prefix( $prefix, $set_table_names = true ): string|WP_Error
| Parameter | Type | Default | Description |
|---|---|---|---|
$prefix |
string | – | New prefix (alphanumeric + underscore) |
$set_table_names |
bool | true | Whether to update table name properties |
Returns: Old prefix or WP_Error on invalid prefix.
get_blog_prefix()
Gets the prefix for a specific blog.
public function get_blog_prefix( $blog_id = null ): string
| Parameter | Type | Default | Description |
|---|---|---|---|
$blog_id |
int|null | null | Blog ID (null for current) |
Returns: Blog table prefix.
Example:
$prefix = $wpdb->get_blog_prefix( 2 );
// Returns: wp_2_ (for blog ID 2 in multisite)
set_blog_id()
Sets the blog ID and updates table prefixes.
public function set_blog_id( $blog_id, $network_id = 0 ): int
Returns: Previous blog ID.
Connection Methods
db_connect()
Connects to the database server.
public function db_connect( $allow_bail = true ): bool
| Parameter | Type | Default | Description |
|---|---|---|---|
$allow_bail |
bool | true | Whether to die on failure |
Returns: True on success, false on failure.
check_connection()
Checks if connection is alive and reconnects if needed.
public function check_connection( $allow_bail = true ): bool|void
Returns: True if connected.
select()
Selects a database.
public function select( $db, $dbh = null ): void
close()
Closes the database connection.
public function close(): bool
Since: 4.5.0
Returns: True on success, false on failure.
parse_db_host()
Parses the DB_HOST setting for mysqli_real_connect().
public function parse_db_host( $host ): array|false
Since: 4.9.0
Returns: Array of [ host, port, socket, is_ipv6 ] or false.
Error Handling Methods
show_errors()
Enables showing database errors.
public function show_errors( $show = true ): bool
Returns: Previous show_errors state.
hide_errors()
Disables showing database errors.
public function hide_errors(): bool
Returns: Previous show_errors state.
suppress_errors()
Suppresses database errors.
public function suppress_errors( $suppress = true ): bool
Returns: Previous suppress_errors state.
print_error()
Prints/logs a SQL error.
public function print_error( $str = '' ): void|false
bail()
Displays error and dies (if show_errors enabled).
public function bail( $message, $error_code = '500' ): void|false
Character Set Methods
init_charset()
Initializes charset and collate properties.
public function init_charset(): void
determine_charset()
Determines the best charset and collation.
public function determine_charset( $charset, $collate ): array
Returns: Array with ‘charset’ and ‘collate’ keys.
set_charset()
Sets the connection’s character set.
public function set_charset( $dbh, $charset = null, $collate = null ): void
get_charset_collate()
Gets the database charset collate for CREATE TABLE.
public function get_charset_collate(): string
Returns: e.g., "DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci"
Example:
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE my_table (
id INT AUTO_INCREMENT,
name VARCHAR(255),
PRIMARY KEY (id)
) $charset_collate";
get_table_charset()
Gets the character set for a table.
protected function get_table_charset( $table ): string|WP_Error
get_col_charset()
Gets the character set for a column.
public function get_col_charset( $table, $column ): string|false|WP_Error
get_col_length()
Gets the maximum string length for a column.
public function get_col_length( $table, $column ): array|false|WP_Error
Returns: Array with ‘type’ (‘byte’ or ‘char’) and ‘length’, or false.
SQL Mode Methods
set_sql_mode()
Sets SQL mode for WordPress compatibility.
public function set_sql_mode( $modes = array() ): void
Removes incompatible modes: NO_ZERO_DATE, ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, STRICT_ALL_TABLES, TRADITIONAL, ANSI.
Capability Methods
has_cap()
Checks if the database supports a feature.
public function has_cap( $db_cap ): bool
| Capability | Since | Description |
|---|---|---|
collation |
2.5.0 | Collation support |
group_concat |
2.7.0 | GROUP_CONCAT function |
subqueries |
2.7.0 | Subquery support |
set_charset |
2.7.0 | SET NAMES support |
utf8mb4 |
4.1.0 | 4-byte UTF-8 (always true since 6.6) |
utf8mb4_520 |
4.6.0 | utf8mb4_unicode_520_ci |
identifier_placeholders |
6.2.0 | %i placeholder support |
Example:
if ( $wpdb->has_cap( 'utf8mb4_520' ) ) {
// Use better collation
}
Column Info Methods
get_col_info()
Gets column metadata from the last query.
public function get_col_info( $info_type = 'name', $col_offset = -1 ): mixed
| Parameter | Type | Default | Description |
|---|---|---|---|
$info_type |
string | ‘name’ | Info type: name, table, def, max_length, not_null, etc. |
$col_offset |
int | -1 | Column index (-1 for all columns) |
Example:
$wpdb->query( "SELECT * FROM {$wpdb->posts} LIMIT 1" );
// Get all column names
$names = $wpdb->get_col_info( 'name' );
// Get specific column's max length
$max_length = $wpdb->get_col_info( 'max_length', 0 );
Utility Methods
flush()
Clears cached query results.
public function flush(): void
Resets: last_result, col_info, last_query, rows_affected, num_rows, last_error, and frees mysqli_result.
db_version()
Gets the database server version.
public function db_version(): string|null
Returns: Version number (e.g., "8.0.28").
db_server_info()
Gets raw database server version string.
public function db_server_info(): string
Since: 5.5.0
Returns: Full version string (e.g., "8.0.28-0ubuntu0.20.04.3").
check_database_version()
Checks if database meets minimum version requirement.
public function check_database_version(): void|WP_Error
timer_start()
Starts the query timer.
public function timer_start(): true
timer_stop()
Stops the query timer.
public function timer_stop(): float
Returns: Time spent in seconds.
get_caller()
Gets comma-separated list of calling functions.
public function get_caller(): string
log_query()
Logs a query to the queries array.
public function log_query( $query, $query_time, $query_callstack, $query_start, $query_data ): void
Since: 5.3.0
Text Processing Methods
strip_invalid_text_for_column()
Strips invalid characters for a specific column.
public function strip_invalid_text_for_column( $table, $column, $value ): string|WP_Error
check_ascii()
Checks if a string is ASCII.
protected function check_ascii( $input_string ): bool
Placeholder Methods
placeholder_escape()
Generates a placeholder escape string.
public function placeholder_escape(): string
Since: 4.8.3
add_placeholder_escape()
Escapes % characters in a query.
public function add_placeholder_escape( $query ): string
remove_placeholder_escape()
Removes placeholder escapes from a query.
public function remove_placeholder_escape( $query ): string
Magic Methods
__get()
Makes private properties readable.
public function __get( $name ): mixed
__set()
Makes private properties settable.
public function __set( $name, $value ): void
__isset()
Checks if a private property is set.
public function __isset( $name ): bool
__unset()
Unsets a private property.
public function __unset( $name ): void
Deprecated Methods
supports_collation()
Deprecated: 3.5.0 – Use has_cap( 'collation' ) instead.
public function supports_collation(): bool
escape()
Deprecated: 3.6.0 – Use prepare() or esc_sql() instead.
public function escape( $data ): string|array
_weak_escape()
Deprecated: 3.6.0 – Use prepare() or esc_sql() instead.
public function _weak_escape( $data ): string
Constants
These constants are defined in class-wpdb.php:
| Constant | Value | Description |
|---|---|---|
EZSQL_VERSION |
‘WP1.25’ | ezSQL version identifier |
OBJECT |
‘OBJECT’ | Return rows as objects |
OBJECT_K |
‘OBJECT_K’ | Return objects keyed by first column |
ARRAY_A |
‘ARRAY_A’ | Return rows as associative arrays |
ARRAY_N |
‘ARRAY_N’ | Return rows as numeric arrays |