Взаимодействие плагина с базой данных WordPress. Часть 1.

Взаимодействие плагина с базой данных WordPress. Часть 1.

Здравствуйте, уважаемые читатели блога!
Предлагаю немного расширить наши знания в области программирования под 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».
На этом все. В следующей статье рассмотрим способы извлечения данных из БД.

Поделиться в соцсетях:
Статьи на похожую тематику

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

Комментарии
  1. Алексей

    А если создавать отдельную базу данных ?

    ответить
    1. Pavel
      28.03.2016 в 13:50 автор блога

      Создавайте, я не против 🙂

      ответить
      1. Алексей

        я имел ввиду, что будет, если создать отдельную базу данных и сохранять в нее, получается global $wpdb; не прокатит?

        З.Ы. в письма с сайта о том, что был ответ на мой комментарий ломаются ссылки(весь текст не выкладываю)

        ответить
        1. Pavel
          30.03.2016 в 05:38 автор блога

          я имел ввиду, что будет, если создать отдельную базу данных и сохранять в нее, получается global $wpdb; не прокатит?

          Думаю что нет. Я не знаю вообще, позволяет ли WP это делать.

          Можете попробовать создать новую БД через "dbDelta". Но как манипулировать данными потом, я не знаю.

          Спасибо за письмо 🙂

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *