The maybe_create_table() WordPress PHP function checks if a table exists in the database and creates it if not already present.
Usage
require_once ABSPATH . 'wp-admin/includes/upgrade.php'; global $wpdb; $table_name = 'custom_table'; $create_ddl = 'CREATE TABLE ' . $table_name . ' (...);'; maybe_create_table($wpdb->prefix . $table_name, $create_ddl);
Parameters
$table_name(string) – Required. The name of the database table.$create_ddl(string) – Required. The SQL statement to create the table.
More information
See WordPress Developer Resources: maybe_create_table
Important: Before calling this function, you must manually include ‘upgrade.php’ to avoid the white screen of death:
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
Examples
Create a simple table for storing user preferences
This code creates a table named ‘user_preferences’ with three columns: user_id, preference_key, and preference_value.
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
global $wpdb;
$table_name = 'user_preferences';
$create_ddl = "CREATE TABLE " . $table_name . " (
user_id bigint(20) unsigned NOT NULL,
preference_key varchar(255) NOT NULL,
preference_value varchar(255) NOT NULL,
PRIMARY KEY (user_id, preference_key)
);";
maybe_create_table($wpdb->prefix . $table_name, $create_ddl);
Create a table for storing custom post metadata
This code creates a table named ‘custom_post_meta’ with four columns: meta_id, post_id, meta_key, and meta_value.
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
global $wpdb;
$table_name = 'custom_post_meta';
$create_ddl = "CREATE TABLE " . $table_name . " (
meta_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
post_id bigint(20) unsigned NOT NULL,
meta_key varchar(255) DEFAULT NULL,
meta_value longtext,
PRIMARY KEY (meta_id),
KEY post_id (post_id),
KEY meta_key (meta_key)
);";
maybe_create_table($wpdb->prefix . $table_name, $create_ddl);
Create a table for storing product inventory
This code creates a table named ‘product_inventory’ with four columns: product_id, location_id, quantity, and last_updated.
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
global $wpdb;
$table_name = 'product_inventory';
$create_ddl = "CREATE TABLE " . $table_name . " (
product_id bigint(20) unsigned NOT NULL,
location_id bigint(20) unsigned NOT NULL,
quantity int(11) NOT NULL,
last_updated datetime NOT NULL,
PRIMARY KEY (product_id, location_id)
);";
maybe_create_table($wpdb->prefix . $table_name, $create_ddl);
Create a table for storing user achievements
This code creates a table named ‘user_achievements’ with three columns: achievement_id, user_id, and date_achieved.
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
global $wpdb;
$table_name = 'user_achievements';
$create_ddl = "CREATE TABLE " . $table_name . " (
achievement_id bigint(20) unsigned NOT NULL,
user
In your examples you should move the $wpdb->prefix statement up to the $table declaration. If you do not, the prefix is ignored and the table is created WITHOUT the prefix. You should also strongly encourage an application prefix (middlefix?) to the table name.
For example: prefix_myapp_user_preferences
TESTED.
The example should read:
require_once ABSPATH . ‘wp-admin/includes/upgrade.php’;
global $wpdb;
$application_table_prefix = ‘_myapp’;
$table_name = $wpdb->prefix . $application_table_prefix . ‘user_preferences’;
$create_ddl = “CREATE TABLE ” . $table_name . ” (
user_id bigint(20) unsigned NOT NULL,
preference_key varchar(255) NOT NULL,
preference_value varchar(255) NOT NULL,
PRIMARY KEY (user_id, preference_key)
);”;
maybe_create_table($table_name, $create_ddl);