The Dragon's Nest

Как создать таблицу в базе данных для плагина WordPress?

17.06.2009 от Dandr


Если вы пишете плагин для , то вам наверняка потребуется сохранять какую-либо информацию в базе данных . Существует два типа информации, которую необходимо сохранять:

  • Информация настройки – заполняется пользователем при установке плагина и не имеет дальнейшую тенденцию к увеличению.
  • Данные – информация, которая будет добавляться пользователем по мере использования плагина. Данные могут храниться в отдельной таблице базы, которая предварительно должна быть создана.

Далее будет рассмотрено, как “научить” плагин автоматически создавать таблицу при активации. Для этого нужно выполнить три шага:

  • написать -функцию, которая будет создавать таблицу;
  • убедиться, что вызывает эту функцию при активации плагина;
  • написать функцию обновления, на тот случай, если у обновлённого плагина будет иная структура таблицы.


Создание таблицы базы данных

Рассмотрим первый шаг: написание функции вашего плагина, создающей таблицу БД при активации плагина. Предположим, что вы захотите назвать эту функцию “jal_install”.

Префикс таблицы базы данных

В файле wp-config. владелец сайта на может задать префикс таблиц. По умолчанию это “wp_”, но необходимо проверить текущий префикс и в дальнейшем использовать его для определения имени таблицы. Узнать префикс можно командой $wpdb->prefix (в версиях старше 2.0 нужно использовать глоальную переменную $table_prefix, которая не рекомендуется в версиях , начиная с 2.1).
Итак, если вы хотите создать таблицу с именем (prefix)liveshoutbox, то первые строки функции, создающей таблицу, будут выглядеть так:

1
2
3
function jal_install () {
   global $wpdb;
   $table_name = $wpdb->prefix . "liveshoutbox";

Таблица уже создана?

Следующим шагов в создании таблицы будет проверка, создана ли уже такая таблица. Для этого нужно выполнить запрос SHOW TABLES SQL, что бы попытаться найти таблицу и сравнить результат с именем нашей таблицы.

4
if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {

Создание или обновление таблицы

Следующий шаг состоит в том, чтобы действительно создать таблицу базы данных. Вместо того, что бы выполнять SQL запросы напрямую, мы будем использовать функцию dbDelta из wp-admin/upgrade-functions. (следует загрузить этот файл, поскольку он не загружен по умолчанию). Функция dbDelta анализирует нынешнюю структуру таблицы, сравнивает ее с желаемой структуры таблицы, и либо добавляет или изменяет таблицу по мере необходимости, что может быть очень удобно для обновления (см. wp-admin/upgrade-schema. для примера использования dbDelta). Однако, стоит заметить, что dbDelta довольно требовательна. Например:

  • Вы должны разместить каждое поле на отдельной строке в Вашем SQL запросе;
  • Между словами “PRIMARY KEY” и определение основного ключа должно быть два пробела;
  • Вы должны использовать ключевые слова KEY, а не его синоним INDEX.

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

5
6
7
8
9
10
11
12
13
14
15
$sql = "CREATE TABLE " . $table_name . " (
	  id mediumint(9) NOT NULL AUTO_INCREMENT,
	  time bigint(11) DEFAULT '0' NOT NULL,
	  name tinytext NOT NULL,
	  text text NOT NULL,
	  url VARCHAR(55) NOT NULL,
	  UNIQUE KEY id (id)
	);";
 
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);

Добавление исходных данных

Наконец, вы можете добавить некоторые данные в таблицу, которую только что создали (как я понимаю, именно таким способом добавляется первый пост и комментарий при установке WP; на мой взгляд, в плагине это лишнее. – прим. Dandr). Вот пример того, как это сделать:

16
17
18
19
20
21
22
23
  $welcome_name = "Mr. Wordpress";
  $welcome_text = "Congratulations, you just completed the installation!";
 
  $insert = "INSERT INTO " . $table_name .
            " (time, name, text) " .
            "VALUES ('" . time() . "','" . $wpdb->escape($welcome_name) . "','" . $wpdb->escape($welcome_text) . "')";
 
  $results = $wpdb->query( $insert );

ПРИМЕЧАНИЕ: Даже если мы определили $welcome_name и $welcome_text в этой функции, и знаем, что в них нет SQL специальных символов, не помешает всегда запускать $ wpdb-> escape(function) перед передачей ее в базу данных для предотвращения проблем в области безопасности и случайных ошибок.

Опция версии

Еще одна отличная идея заключается в том, чтобы добавить возможность записи номера версии вашей таблицы, так что вы можете использовать эту информацию позже, если вам понадобиться обновлять её:

24
add_option("jal_db_version", "1.0");

Функция целиком

Итак, функция написана. Давайте посмотрим весь код полностью. Имейте в виду, что номер версии в настоящее время хранится в глобальной переменной.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$jal_db_version = "1.0";
 
function jal_install () {
   global $wpdb;
   global $jal_db_version;
 
   $table_name = $wpdb->prefix . "liveshoutbox";
   if($wpdb->get_var("show tables like '$table_name'") != $table_name) {
 
      $sql = "CREATE TABLE " . $table_name . " (
	  id mediumint(9) NOT NULL AUTO_INCREMENT,
	  time bigint(11) DEFAULT '0' NOT NULL,
	  name tinytext NOT NULL,
	  text text NOT NULL,
	  url VARCHAR(55) NOT NULL,
	  UNIQUE KEY id (id)
	);";
 
      require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
      dbDelta($sql);
 
      $welcome_name = "Mr. Wordpress";
      $welcome_text = "Congratulations, you just completed the installation!";
 
      $insert = "INSERT INTO " . $table_name .
            " (time, name, text) " .
            "VALUES ('" . time() . "','" . $wpdb->escape($welcome_name) . "','" . $wpdb->escape($welcome_text) . "')";
 
      $results = $wpdb->query( $insert );
 
      add_option("jal_db_version", $jal_db_version);
 
   }
}

Вызов функции

Теперь следует убедиться в том, что вызывает эту функцию при активации плагина. Для этого мы воспользуемся “activate_ action hook” (активационным крючком??? – Dandr). Если файл вашего плагина wp-content//plugindir/pluginfile., то вам следует добавить следующие строки в текст вашего плагина:

1
register_activation_hook(__FILE__,'jal_install');

См. Function_Reference/register_activation_hook для получения более подробной информации.

Функция добавления и обновления

Со временем, вы можете обнаружить, что вам нужно изменить плагин и изменить структуру базы данных в обновленной версии.. Для этого вам нужно будет обновить код вашего плагина, который будет обнаруживать, обновления плагина, а также обновлять структуру базы данных. Проще всего это сделать, добавив код к функции jal_install, которую мы только что создали.
Имейте в виду, вам нужно убедиться, что функция вызывается. Т.е., пользователи вашего плагина, должны при обновлении они отключить плагин, скопировать новый файл плагина на сервер, а затем включить плагин снова.
Итак, давайте предположим, что функция была использована для создания базы данных версии 1.0, а вы сейчас обновляете до версии 1.1, в которой поле URL может быть шире (100 символов вместо 55). Вам нужно добавить следующие строки в конец вашей функции jal_install, для проверки версии и обновления в случае необходимости:

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
   $installed_ver = get_option( "jal_db_version" );
 
   if( $installed_ver != $jal_db_version ) {
 
      $sql = "CREATE TABLE " . $table_name . " (
	  id mediumint(9) NOT NULL AUTO_INCREMENT,
	  time bigint(11) DEFAULT '0' NOT NULL,
	  name tinytext NOT NULL,
	  text text NOT NULL,
	  url VARCHAR(100) NOT NULL,
	  UNIQUE KEY id (id)
	);";
 
      require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
      dbDelta($sql);
 
      update_option( "jal_db_version", $jal_db_version );
  }

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


Данная статья является вольным, но достаточно близким переводом Creating Tables with Plugins.

Связанные записи


Рубрики: HOWTO | 8 комментариев


8 комментариев

liveinternet.ru/users/qosys… — 17 июня 2009 @ 15:00

А чтоб, русского перевода еще нигде не было??
А так, правда полезно.

Dandr — 17 июня 2009 @ 15:09

По крайней мере, я не нашёл.

Christian Archer — 17 июня 2009 @ 15:31

Хороший тон еще удалять таблицу после деактивации плагина.

Dandr — 17 июня 2009 @ 15:36

Christian Archer, согласен. До этого я ещё не дошёл)))

lilumi — 17 июня 2009 @ 18:02

вот и ученик превзошел учителя — для меня это темный лес, так как еще ни разу не писал собственного плагина с нуля

Dandr — 17 июня 2009 @ 20:49

Миш, мне, конечно, лестно читать такие слова, но мы с тобой оба прекрасно понимаем, что у нас слишком разный уровень.
ЗЫ “не писал” и “не могу написать” – несколько разные вещи. У тебя просто не было необходимости в этом)))

lilumi — 17 июня 2009 @ 21:20

да нет же — я отстойный программер

Dandr — 17 июня 2009 @ 21:43

lilumi, странно, и чего это я тебе не верю? :)

Оставить комментарий

Текст комментария:

Заметьте: Включена проверка комментариев. Нет смысла повторно отправлять комментарий.


скачать русский wordpress | 61 запросов. 3.861 секунд | /2009/06/17/kak-sozdat-tablicu-v-baze-dannyx-dlya-plagina-wordpress/
hd fly e146 michael jackson beat it sony vegas pro 11 bionic commando 2 powerpoint 2007 narod ru rtm windows 7 7601 creative 1.6 final word c c catch samsung spica gt i5700 6.68 navitel navigator 5.0 0.1069 2012 x men origins lineage 2 interlude mcdonalds rar file amd athlon 64 5400 2110 daiwa crossfire 2 5 7 music 2003 harry potter lego pc sony vegas cutting lg p500 170 2 sony vegas pro 9.0 e 5530 real steel 2011 windows 10 vegas pro 11 keygen windows 7 skachat igry torrent adidas star wars 2012 igo 2011 baby girl devil may cry 1 acer microsoft oblivion 80 90 2010 torrent google chrome windows 7 com mp3 warcraft 3.3 5 a 100 xp sp3 c lite codec warcraft cs 1.6 napoleon total war imperial torrent sony playstation portable windows xp professional x86 empire earth 3 media studio pro criminal 6.5 nfs ru chica bomb mix opera mobile 10 rus 50 2 samsung sgh i900 witu 8gb sony ericsson arc liveresult 2011 2012 windows 7 sp1 acronis ethernet gps nokia 5230 windows xp final ccleaner google chrome psp samsung s5230 mozilla firefox 3.5 rus windows 7 x86 rus autocad 2010 torrent blu ray