Рубрики
Wordpress

Создание произвольных таблиц в WordPress

При создании плагина для WordPress может возникнуть необходимость сохранять данные в базу данных WordPress. Есть несколько способов решения данной задачи. Можно создать страницу настроек, используя Settings API, либо сохранять данные прямо в таблицу с опциями, используя update_option() и get_option() или создать свою собственную таблицу в базе данных.

В данном примере будет рассмотрена возможность создания произвольной таблицы с использованием возможностей WordPress.

Прежде чем что-то записать в таблицу нужно быть уверенным, что таблица существует. Именно поэтому во время активации плагина надо эту таблицу создать.

В WordPress предусмотрен хук, который можно использовать для перехвата события активации и дезактивации плагина, а так же при его деинсталяции. С помощью этих хуков можно выполнить любую функцию, в том числе и функцию создания таблицы при активации и, если необходимо, функцию удаления таблицы при дезактивации или деинсталяции.

Создание таблиц wordpress при активации плагина

Чтобы быть уверенным, что таблица существует, ее необходимо создать при активации плагина. Для этого используют хук — register_activation_hook(), который может содержать два параметра — основной файл плагина и название функции, которую надо выполнить при активации.

В основном файле плагина вы можете написать следующий код:

register_activation_hook( __FILE__, 'create_plugin_tables' );
function create_plugin_tables()
{
	// введите код создания таблиц
}

При создании таблиц в WordPress важно соблюдать стандарты и не забыть указать префиксы таблиц. Стандартным префиксом является сочетание wp_, но вы можете изменить этот префикс либо во время установки WordPress, либо отредактировав файл wp-config.php. Для того, что бы избежать ошибки указания префика необходимо использовать данные из объекта $wpdb.

function create_plugin_tables()
{
	global $wpdb;
	// префикс текущего сайта
	echo $wpdb->prefix . 'tablename';

	// мультисайт, оригинальный префикс
	echo $wpdb->base_prefix . 'tablename';
}

Разница между свойствами prefix и base_prefix видна при использовании режима мультисайт. При использовании $wpdb->prefix возвращается префикс для текущего сайта, а при использовании $wpdb->base_prefix возвращается значение указанное в wp-config.php.

Для создания таблицы в WordPress необходимо написать SQL запрос и поместить его в специальную переменную, чтобы потом вставить в функцию dbDelta().

function create_plugin_tables()
{
	global $wpdb;
	$table_name = $wpdb->prefix . 'tablename';
	$sql = "CREATE TABLE $table_name (
			id int(11) NOT NULL AUTO_INCREMENT,
			name varchar(255) DEFAULT NULL,
			UNIQUE KEY id (id)
	);";
	require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
	dbDelta( $sql );
}


Функция dbDelta() проверит базу данных на предмет существования в ней таблицы, указанной в запросе, и если такая таблица уже существует запрос не будет выполняться повторно.

Что бы функция dbDelta() была доступна, перед ее вызовом надо позаботиться о том, что бы подключить содержащий ее файл /wp-admin/includes/upgrade.php.

После того, как плагин будет вновь активирован таблица будет создана.

Добавление информации в произвольную таблицу

Для добавления данных во вновь созданную таблицу потребуется вновь использовать объект $wpdb, который содержит метод insert(). Этот метод позволяет добавлять данные в существующие таблицы.

Метод insert() имеет три параметра: название таблицы, массив данных для вставки и формат вставляемых данных. Формат данных указывается для предотвращения конфликтов типов данных.

function insert_custom_table()
{
	global $wpdb;
	$wpdb->insert(
			'table',
			array(
				'id' => 1,
				'name' => 'John'
			),
		array(
			'%d',
			'%s'
		)
	);
}

Получение данных из произвольной таблицы

Для извлечения данных из таблицы используется все тот же $wpdb объект. Есть два способа получить данные, метод $wpdb->get_row() и метод $wpdb->get_results().

Метод get_row() возвращает только одну строку, его следует использовать при запросе первичного ключа таблицы.

function get_by_id( $id )
{
	global $wpdb;
	$table_name = $wpdb->prefix . 'tablename';
	$row = $wpdb->get_row( $wpdb->prepare('SELECT * FROM '.$table_name.' WHERE id = %d', $id) );
	return $row;
}


Метод get_results() вернет все строки, удовлетворяющие строке запроса.

function get_by_name( $name )
{
	global $wpdb;
	$table_name = $wpdb->prefix . 'tablename';
	$results = $wpdb->get_results( $wpdb->prepare('SELECT * FROM '.$table_name.' WHERE name = %s', $name) );
	return $results;
}

Для выполнения каких-либо функций при дизактивации плагина используют хук — register_deactivation_hook().

Удаление таблицы при деинсталяции плагина

Чтобы удалить таблицу при деинсталяции плагина используется хук — register_uninstall_hook().

register_uninstall_hook( __FILE__, 'drop_plugin_tables');
function drop_plugin_tables()
{
	//drop a custom db table
	global $wpdb;
	$wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'tablename' );
}

Подробнее об объекте $wpdb читайте здесь(статья на английском).