Создание таблиц в плагине для WordPress

Переводами я обычно не увлекаюсь, но минувшей ночью решил попробовать себя в новом амплуа, результатом чего стал вольный перевод статьи Creating Tables with Plugins

Создание таблиц в плагине для WordPress

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

При написании плагина с автоматическим созданием таблицы, необходимо выполнить следующие шаги.

  1. Написать php-функцию, которая создает таблицу.
  2. Убедиться, что WordPress вызывает эту функцию при активации плагина.
  3. Создать функцию обновления, если новая версия плагина требует иной структуры данных.

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

Первым шагом в написании подобного плагина, является реализация функции, которая автоматически добавит таблицу в MySQL базу данных WordPress. Далее в этой статье мы будем предполагать, что такая функция называется jal_install.

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

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

Таким образом, если вы хотите создать таблицу с именем (prefix)liveshoutbox, то первые строки вашего скрипта должны быть такими.

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

Существует ли таблица?

Следующим шагом является проверка существования таблицы, что можно проделать с помощью следующего кода

  1.  
  2. if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name)
  3.  
  4.  

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

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

  1. Каждое поле должно быть определено в отдельной строке.
  2. Между выражение PRIMARY KEY и определением первичного ключа должно быть два пробела.
  3. Вы должны использовать ключевое слово KEY вместо его синонима INDEX
Выполнив все эти условия, вы можете использовать нижеприведенный код, для создания или обновления таблицы.

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

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

Теперь вы можете добавить данные во вновь созданную таблицу:

  1.  
  2. $welcome_name = "Mr. Wordpress";
  3. $welcome_text = "Congratulations, you just completed the installation!";
  4.  
  5. $insert = "INSERT INTO " . $table_name .
  6. " (time, name, text) " .
  7. "VALUES ('" . time() . "','" . $wpdb->escape($welcome_name) .
  8. "','" . $wpdb->escape($welcome_text) . "')";
  9.  
  10. $results = $wpdb->query( $insert );
  11.  
  12.  

Замечание: Не смотря на то, что определенные нам переменные не содержат специальных символов, использование функции $wpdb->escape является хорошей практикой, которая позволяет избежать проблем с безопасностью и возникновения случайных ошибок.

Информация о версии

Еще одной хорошей идеей будет добавление информации о версии, которая поможет вам в дальнейшем при обновлении таблицы.

  1.  
  2. add_option("jal_db_version", "1.0");
  3.  
  4.  

Итоговая функция

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

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

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

  1.  
  2. register_activation_hook(__FILE__,'jal_install');
  3.  
  4.  

Добавляем функцию обновления

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

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

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

  1.  
  2. $installed_ver = get_option( "jal_db_version" );
  3.  
  4. if( $installed_ver != $jal_db_version )
  5. {
  6. $sql = "CREATE TABLE " . $table_name . " (
  7. id mediumint(9) NOT NULL AUTO_INCREMENT,
  8. time bigint(11) DEFAULT '0' NOT NULL,
  9. name tinytext NOT NULL,
  10. text text NOT NULL,
  11. url VARCHAR(100) NOT NULL,
  12. UNIQUE KEY id (id)
  13. );";
  14.  
  15. require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  16. dbDelta($sql);
  17.  
  18. update_option( "jal_db_version", $jal_db_version );
  19. }
  20.  
  21.  

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

Читайте в блоге

JavaScript Определение координат объектов и указателя мыши
Разноцветное облако ссылок
Рисуем график на PHP
Знакомство с WordPress
JavaScript Преобразование массивов и объектов в строку

Комментарии:

Войдите на сайт, чтобы оставить комментарий