Здравствуйте, уважаемые читатели блога!
Предлагаю немного расширить наши знания в области программирования под 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". Но как манипулировать данными потом, я не знаю.
Спасибо за письмо 🙂