Creating Tables in WordPress Database on Plugin Activation

WordPress provides plugin developers the option to store settings or data specific to a plugin into to the options database table (wp_options) made easy with a number of helper functions such as add_option, update_option and delete_option to add, update and delete data in the options table respectively.

Data stored in the options table should be a key/value pair.
According to a performance rule of thumb, any data type with a complicated structure should go into custom table.

Say there is a need to store data grouped into various column in form of a table-like structure; although such data can be stored in the options table; performance-wise, that would be inefficient. Such data are better off being stored in a separate DB table.

In today’s tutorial, I will show us how to create tables in WordPress database via a plugin on activation.

First, create a variable containing the table name to be created.


global $wpdb;

$table_name = $wpdb->prefix . 'sandbox';

Note: Table name must be prefixed with $wpdb->prefix for the following reasons:
* Without it, dbDelta() won’t create the database.
* Most folks using WordPress have their database table prefix changed from the default wp_ hence the $wpdb->prefix to programmatically get the table prefix.

Next is the SQL statement to create the table

[sql]
$sql = “CREATE TABLE $table_name (
id mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
title varchar(50) NOT NULL,
structure longtext NOT NULL,
author longtext NOT NULL,
PRIMARY KEY (id)
);”;
[/sql]

To use the function dbDelta() in executing SQL statements, the file containing the function must be required.


require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

Pass the SQL statement as an argument to dbDelta().


dbDelta( $sql );

To create the table when the plugin is activated, include the codes above in a function or class method and hook the function to activate_PLUGINNAME Action via the register_activation_hook wrapper function.

Full code below:


function create_plugin_database_table() {
	global $wpdb;
	$table_name = $wpdb->prefix . 'sandbox';
	$sql = "CREATE TABLE $table_name (
		id mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
		title varchar(50) NOT NULL,
		structure longtext NOT NULL,
		author longtext NOT NULL,
		PRIMARY KEY  (id)
		);";

	require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
	dbDelta( $sql );
}

register_activation_hook( __FILE__, 'create_plugin_database_table' );

If you intend to include the create_plugin_database_table() function in a class, make the function/method static and then register it to the activation hook as follows:


class Class_Name {

	public static function create_plugin_database_table() {
		//.. insert the code
	}

}

register_activation_hook( __FILE__, array( 'Class_Name', 'create_plugin_database_table' ) );

More information on creating tables with plugins available at WordPress codex

Don’t miss out!
Subscribe to My Newsletter
Invalid email address