Здравствуйте, уважаемые читатели блога!
Предлагаю немного расширить наши знания в области программирования под WordPress. И рассмотреть в этой статье тему взаимодействия плагинов с базой данных.
Из «коробки», сам WP обладает неплохими возможностями. Здесь я имею ввиду создание своих таксономий, терминов, пр. И привязка к ним дополнительной информации на базе мета данных. Это очень удобно, т. к. написав с десяток функций можно не беспокоиться о создании интерфейса и даже некоторой внутренней логики приложения.
Но мне, как «новичку» в вордпресс. Более привычнее работать с четко структурированными таблицами. Поэтому в этой статье, предлагаю рассмотреть именно данный вариант, на примере одного из моих плагинов «my-simple-form», немного упростив его.
Инициализация данных
Как и следовало ожидать, информацию об инициализации данных мы разместим в главном файле модуля «my-simple-form.php». Т.е. в том где расположен комментарий описывающий плагин.
if(is_admin() == TRUE)
{
register_activation_hook(__FILE__, 'Plance_MSF_DB::activate');
register_uninstall_hook(__FILE__, 'Plance_MSF_DB::uninstall');
register_deactivation_hook(__FILE__, 'Plance_MSF_DB::uninstall');
}
Сам вызов методов инициализации данных БД, мы размещаем в условном операторе if и только для администратора. Т.к. при любом другом условии нет смысла этого делать.
В моем случае, класс «Plance_MSF_DB» очень прост и имеет два метода:
- activate — вызывается при установки плагина. Здесь будет выполняться создание нужных нам таблиц в БД, и при необходимости опций, метаданных, ролей, пр.
- uninstall — вызывается при удалении плагина или деактиавации.
Хочу обратить внимание на то, что метод «Plance_MSF_DB::uninstall» вызывается как для хука «register_uninstall_hook» так и для хука «register_deactivation_hook». Это говорит о том, что данный плагина будут удаляться как при деактивации плагина, так и при полном его удалени из системы. Честно сказать не помню почему я так сделал, но в данном случае, хук «register_deactivation_hook» можно удалить.
Ниже приведен «каркас» класса:
class Plance_MSF_DB
{
/**
* Plugin Activate
*/
public static function activate()
{
return TRUE;
}
/**
* Plugin Uninstall
*/
public static function uninstall()
{
return TRUE;
}
}
думаю что выше ничего сложного нет, и дополнительных объяснений не требует.
Давайте рассмотрим метод срабатывающий при установке плагина:
public static function activate()
{
global $wpdb;
require_once(ABSPATH.'wp-admin/includes/upgrade.php');
/* пропущенный код */
add_option('plance_msf_notification', array(
'admin_email' => get_bloginfo('admin_email'),
'admin_name' => 'Administrator',
'noreply_email' => get_bloginfo('admin_email'),
'noreply_name' => get_bloginfo('blogname'),
'shortcode_name' => 'plance-msf-form',
'message_subject' => 'Email from Your Site',
'message_template' => '….',
'flash_message' => '',
));
dbDelta("CREATE TABLE IF NOT EXISTS `{$wpdb -> prefix}plance_msf_user` (
`id` INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(40) NULL,
`surname` VARCHAR(40) NULL,
`patronymic` VARCHAR(40) NULL,
`company` VARCHAR(100) NULL,
`birthday` INT(10) UNSIGNED NULL,
`phone` VARCHAR(25) NULL,
`email` VARCHAR(80) NULL,
`messenger` VARCHAR(30) NULL,
`site` VARCHAR(100) NULL,
`country` VARCHAR(30) NULL,
`city` VARCHAR(30) NULL,
`address` VARCHAR(100) NULL,
`credit_card` VARCHAR(20) NULL,
`sum` VARCHAR(10) NULL,
`comment` TEXT NULL,
`image` VARCHAR(20) NULL,
`file` VARCHAR(20) NULL,
`radio` VARCHAR(100) NULL,
`select` VARCHAR(100) NULL,
`checkbox` TINYINT(1) UNSIGNED NULL,
`date_create` INT(10) UNSIGNED NOT NULL
) {$wpdb -> get_charset_collate()};");
return TRUE;
}
Разберем этот метод по порядку:
1. Подключаем глобальную переменную «$wpdb». В примере выше, она нам понадобится для получения префикса таблиц БД и определения кодировки.
2. Подключаем файл «require_once(ABSPATH.'wp-admin/includes/upgrade.php');». После чего, у нас появится возможность использовать функцию «dbDelta».
3. Для хранения глобальных опций нашего плагина wordpress, используем функцию «add_option». Данные опций будут храниться в таблице «wp_options». Пример кода ниже:
add_option('plance_msf_notification', array(
'admin_email' => get_bloginfo('admin_email'),
'admin_name' => 'Administrator',
'noreply_email' => get_bloginfo('admin_email'),
'noreply_name' => get_bloginfo('blogname'),
'shortcode_name' => 'plance-msf-form',
'message_subject' => 'Email from Your Site',
'message_template' => $message_template,
'flash_message' => '',
));
где:
«plance_msf_notification» - название опции, идущее первым параметром.
«array(...)» - массив опций, идущий вторым параметром. При желании, можно хранить не массив, а строковое или числовое значение. Это не суть важно. Хотя в подавляющем большинстве случаев, я предпочитаю хранить именно массив, что бы один плагин, имел только настройки в одном месте. Но бывают случае когда это не удобно, к примеру когда ты дорабатываешь приложение.
Переходим к функции «dbDelta»:
dbDelta("CREATE TABLE IF NOT EXISTS `{$wpdb -> prefix}plance_msf_user` (
`id` INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(40) NULL,
`surname` VARCHAR(40) NULL,
`patronymic` VARCHAR(40) NULL,
`company` VARCHAR(100) NULL,
`birthday` INT(10) UNSIGNED NULL,
`phone` VARCHAR(25) NULL,
`email` VARCHAR(80) NULL,
`messenger` VARCHAR(30) NULL,
`site` VARCHAR(100) NULL,
`country` VARCHAR(30) NULL,
`city` VARCHAR(30) NULL,
`address` VARCHAR(100) NULL,
`credit_card` VARCHAR(20) NULL,
`sum` VARCHAR(10) NULL,
`comment` TEXT NULL,
`image` VARCHAR(20) NULL,
`file` VARCHAR(20) NULL,
`radio` VARCHAR(100) NULL,
`select` VARCHAR(100) NULL,
`checkbox` TINYINT(1) UNSIGNED NULL,
`date_create` INT(10) UNSIGNED NOT NULL
) {$wpdb -> get_charset_collate()};");
здесь все просто — дамп нашей таблицы.
С методом инициализации данных мы разобрались. Давайте перейдем к методу удаления данных:
public static function uninstall()
{
global $wpdb;
$wpdb -> query("DROP TABLE IF EXISTS `{$wpdb -> prefix}plance_msf_user`");
delete_option('plance_msf_notification');
return TRUE;
}
Метод «$wpdb -> query(...)», используем для удаление таблицы из БД.
А функцию «delete_option» будем использовать для удаление опций из таблицы «wp_options».
На этом все. В следующей статье рассмотрим способы извлечения данных из БД.

А если создавать отдельную базу данных ?
Создавайте, я не против 🙂
я имел ввиду, что будет, если создать отдельную базу данных и сохранять в нее, получается global $wpdb; не прокатит?
З.Ы. в письма с сайта о том, что был ответ на мой комментарий ломаются ссылки(весь текст не выкладываю)
Думаю что нет. Я не знаю вообще, позволяет ли WP это делать.
Можете попробовать создать новую БД через "dbDelta". Но как манипулировать данными потом, я не знаю.
Спасибо за письмо 🙂