Взаємодія плагіна із базою даних WordPress. Частина 1

Взаємодія плагіна із базою даних WordPress. Частина 1

Вітаю, шановні читачі блогу!
Пропоную трохи розширити наші знання у сфері програмування під WordPress і розглянути в цій статті тему взаємодії плагінів із базою даних.

«З коробки» сам WP має непогані можливості. Я маю на увазі створення власних таксономій, термінів тощо, а також прив'язку до них додаткової інформації на базі метаданих. Це дуже зручно, оскільки, написавши з десяток функцій, можна не хвилюватися про створення інтерфейсу і навіть деяку внутрішню логіку застосунку.

Але мені, як «новачку» у WordPress, більш звично працювати зі строго структурованими таблицями. Тому в цій статті пропоную розглянути саме такий варіант — на прикладі одного з моїх плагінів «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
{
	/**
	 * Активація плагіна
	 */
	public static function activate()
	{	
		return TRUE;
	}
	
	/**
	 * Видалення плагіна
	 */
	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. Імпортуємо файл `wp-admin/includes/upgrade.php`, щоб мати змогу використовувати функцію `dbDelta`.
3. Використовуємо `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` (
	...
) {$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 сайтом проблеми? потрібний додатковий функціонал? нестандартний плагін чи згорнути нову сторінку?
Тоді напишіть мені через форму зворотного зв'язку, і я намагатимусь вам допомогти.

Напишіть коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *